Scipy 具有多个方程的方程组
Scipy equation system with multiple equations
你好,当我有一个方程系统时,我在使用 Scipy 的 fsolve
函数时遇到问题。
我的代码只让我拥有与系统中的方程一样多的变量,但我们都知道在实践中,你可以拥有比变量更多的方程,尤其是当解决方案不是具体数字而是范围时的数字,一个额外的等式可以帮助缩小 "haystack" 可以这么说。
我的问题是如何插入比变量更多的方程?
假设我有以下非线性系统:
A/B=0.4583(3)
A/C=0.25
A/D=0.72(2)
B/C=0.54(54)
所以我有以下代码:
from scipy.optimize import *
from numpy import *
def FUNC(arg):
A,B,C,D=arg
UNK=empty((4))
UNK[0]= A/B-0.458333333333333
UNK[1]= A/C-0.25
UNK[2]= A/D-0.722222222222222
UNK[3]= B/C-0.545454545454546
return UNK
SOLVED= fsolve(FUNC, [1.0]*4)
print (SOLVED)
问题是我还知道以下信息:
B/D=1.57(57)
C/D=2.8(8)
如何将这 2 个附加方程式插入我的方程式系统?
还有我如何显示解决方案的范围而不是仅显示 1 个解决方案,似乎 fsolve
只显示它遇到的第一个解决方案,而不是所有可能的解决方案。
请注意 scipy 的 fsolve 只是 MINPACK 的 hybrd 例程的包装器:
The purpose of HYBRD is to find a zero of a system of N non-linear functions in N variables by a modification of the Powell hybrid method. The user must provide a subroutine which calculates the functions. The Jacobian is then calculated by a forward-difference approximation.
如果要求解 6 个方程组,函数 FUNC 需要是 6 个变量的函数。我们可以这样做:
import numpy as np
from scipy.optimize import fsolve
def FUNC(arg):
A, B, C, D, E, F = arg
UNK=np.empty((6))
UNK[0]= A/B-0.458333333333333
UNK[1]= A/C-0.25
UNK[2]= A/D-0.722222222222222
UNK[3]= B/C-0.545454545454546
UNK[4]= B/D-1.575757575757575
UNK[5]= C/D-2.888888888888888
return UNK
fsolve(FUNC, x0=[1.0]*6)
不可能用 fsolve 得到所有的解。但是你可以尝试不同的初始点x0
,希望得到不同的解决方案。
你好,当我有一个方程系统时,我在使用 Scipy 的 fsolve
函数时遇到问题。
我的代码只让我拥有与系统中的方程一样多的变量,但我们都知道在实践中,你可以拥有比变量更多的方程,尤其是当解决方案不是具体数字而是范围时的数字,一个额外的等式可以帮助缩小 "haystack" 可以这么说。
我的问题是如何插入比变量更多的方程?
假设我有以下非线性系统:
A/B=0.4583(3)
A/C=0.25
A/D=0.72(2)
B/C=0.54(54)
所以我有以下代码:
from scipy.optimize import *
from numpy import *
def FUNC(arg):
A,B,C,D=arg
UNK=empty((4))
UNK[0]= A/B-0.458333333333333
UNK[1]= A/C-0.25
UNK[2]= A/D-0.722222222222222
UNK[3]= B/C-0.545454545454546
return UNK
SOLVED= fsolve(FUNC, [1.0]*4)
print (SOLVED)
问题是我还知道以下信息:
B/D=1.57(57)
C/D=2.8(8)
如何将这 2 个附加方程式插入我的方程式系统?
还有我如何显示解决方案的范围而不是仅显示 1 个解决方案,似乎 fsolve
只显示它遇到的第一个解决方案,而不是所有可能的解决方案。
请注意 scipy 的 fsolve 只是 MINPACK 的 hybrd 例程的包装器:
The purpose of HYBRD is to find a zero of a system of N non-linear functions in N variables by a modification of the Powell hybrid method. The user must provide a subroutine which calculates the functions. The Jacobian is then calculated by a forward-difference approximation.
如果要求解 6 个方程组,函数 FUNC 需要是 6 个变量的函数。我们可以这样做:
import numpy as np
from scipy.optimize import fsolve
def FUNC(arg):
A, B, C, D, E, F = arg
UNK=np.empty((6))
UNK[0]= A/B-0.458333333333333
UNK[1]= A/C-0.25
UNK[2]= A/D-0.722222222222222
UNK[3]= B/C-0.545454545454546
UNK[4]= B/D-1.575757575757575
UNK[5]= C/D-2.888888888888888
return UNK
fsolve(FUNC, x0=[1.0]*6)
不可能用 fsolve 得到所有的解。但是你可以尝试不同的初始点x0
,希望得到不同的解决方案。