Python 中非线性方程的数值解
Numerical solution for non-linear equations in Python
我有一个非线性方程的集合,其中的数量可能会有所不同,我想使用一些数值方法来解决这些方程的约束。
我已经能够使用 Solver 在 Excel 中解决一个简单的(一个方程式)案例,但之前没有在 Python 中将类似的东西放在一起,所以希望对方法提出建议.
经过一些挖掘,fsolve 似乎是解决此类系统的一种流行方法。对于一个简单的两个方程式的情况,我的问题采用以下形式,为清楚起见分为几个部分:
与第二个方程 b 的形式相同。
A是常数,变量Z,S和x是每个实体i的常数,唯一独立的值是指数a和b;两个方程,两个未知数,所以应该有一个唯一的解决方案。
正如我所说,我在 Excel 中建立了一个简单的方程式案例,并成功地解决了使用求解器的问题。任何有关在 Python 中进行设置的指导都将受到赞赏。
您描述的问题是 root finding 之一。您想找到 f(a,b)=0
的 (a,b)
一个简单的方法是定点迭代。由于您有 f(a,b) 的解析表达式,您可以计算导数并使用牛顿法。要使用 fsolve 进行设置,您需要定义一个函数:
def myfunc(x):
val1 = #evaluate your first expression here using Z and S
val2 = #evaluate your second expression here
return np.ndarray([val1 val2])
您可以选择使用 *args 参数传入 S 和 Z 的值。
然后用:
求解
fsolve(myfunc,x0)
其中 x0 是初始猜测。
请注意,fsolve 可能不尊重您对 w 的条件。如果您的问题不能完全满足,我会研究一种支持约束优化的方法,例如 fmin_slsqp。在这两种情况下,语法应该与我为 fsolve 描述的非常相似。
能够在上述帮助下整理出解决方案,不胜感激。我接受了约翰的回答;下面的解决方案代码供参考。
import pandas as pd
import numpy as np
from scipy.optimize import fsolve
Aq = .6
Av = .6
def eqs(p):
a, b = p
return(np.dot(x*(qS**a*vS**b)/np.dot(x,qS**a*vS**b),qZ)-Aq
, np.dot(x*(qS**a*vS**b)/np.dot(x,qS**a*vS**b),vZ)-Av)
sol = fsolve(eqs, (1,1), full_output=True)
x, y = sol[0]
下面是如何为非线性方程设置 Python 解的示例:
import numpy as np
from scipy.optimize import fsolve
from math import cos
# non-linear equations:
# x0 cos(x1) = 4.
# x0x1-x1 = 5.
def func2(x):
out = [x[0]*cos(x[1]) - 4]
out.append(x[1]*x[0] - x[1] - 5)
return out
x02 = fsolve(func2, [1, 1])
print("x02: "+str(x02))
打印:
x02: [6.50409711 0.90841421]
我有一个非线性方程的集合,其中的数量可能会有所不同,我想使用一些数值方法来解决这些方程的约束。
我已经能够使用 Solver 在 Excel 中解决一个简单的(一个方程式)案例,但之前没有在 Python 中将类似的东西放在一起,所以希望对方法提出建议.
经过一些挖掘,fsolve 似乎是解决此类系统的一种流行方法。对于一个简单的两个方程式的情况,我的问题采用以下形式,为清楚起见分为几个部分:
与第二个方程 b 的形式相同。
A是常数,变量Z,S和x是每个实体i的常数,唯一独立的值是指数a和b;两个方程,两个未知数,所以应该有一个唯一的解决方案。
正如我所说,我在 Excel 中建立了一个简单的方程式案例,并成功地解决了使用求解器的问题。任何有关在 Python 中进行设置的指导都将受到赞赏。
您描述的问题是 root finding 之一。您想找到 f(a,b)=0
的 (a,b)一个简单的方法是定点迭代。由于您有 f(a,b) 的解析表达式,您可以计算导数并使用牛顿法。要使用 fsolve 进行设置,您需要定义一个函数:
def myfunc(x):
val1 = #evaluate your first expression here using Z and S
val2 = #evaluate your second expression here
return np.ndarray([val1 val2])
您可以选择使用 *args 参数传入 S 和 Z 的值。
然后用:
求解fsolve(myfunc,x0)
其中 x0 是初始猜测。
请注意,fsolve 可能不尊重您对 w 的条件。如果您的问题不能完全满足,我会研究一种支持约束优化的方法,例如 fmin_slsqp。在这两种情况下,语法应该与我为 fsolve 描述的非常相似。
能够在上述帮助下整理出解决方案,不胜感激。我接受了约翰的回答;下面的解决方案代码供参考。
import pandas as pd
import numpy as np
from scipy.optimize import fsolve
Aq = .6
Av = .6
def eqs(p):
a, b = p
return(np.dot(x*(qS**a*vS**b)/np.dot(x,qS**a*vS**b),qZ)-Aq
, np.dot(x*(qS**a*vS**b)/np.dot(x,qS**a*vS**b),vZ)-Av)
sol = fsolve(eqs, (1,1), full_output=True)
x, y = sol[0]
下面是如何为非线性方程设置 Python 解的示例:
import numpy as np
from scipy.optimize import fsolve
from math import cos
# non-linear equations:
# x0 cos(x1) = 4.
# x0x1-x1 = 5.
def func2(x):
out = [x[0]*cos(x[1]) - 4]
out.append(x[1]*x[0] - x[1] - 5)
return out
x02 = fsolve(func2, [1, 1])
print("x02: "+str(x02))
打印: x02: [6.50409711 0.90841421]