我有一个非线性方程组的集合,该集合的数量可能有所不同,我想使用某种数值方法来解决这些约束。
我已经能够使用Solver在Excel中解决一个简单的(一个方程式)情况,但是之前在Python中没有将类似的东西放在一起,因此希望对方法提出建议。
进行了一些挖掘后,看起来fsolve是解决此类系统的流行方法。对于一个简单的两个方程式的情况,我的问题采用以下形式,为清楚起见,分为以下几部分:
与第二个方程b的形式相同。
A是一个常数,变量Z,S和x是每个实体i的常数,并且唯一独立的值是指数a和b;两个方程式,两个未知数,因此应该有一个唯一的解。
正如我所说,我在Excel中设置了一个简单的方程式案例,并成功解决了使用规划求解的问题。任何在Python中进行设置的指导都值得赞赏。
答案 0 :(得分:2)
您描述的问题是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描述的语法非常相似。
答案 1 :(得分:0)
在上面的帮助下,我们可以将其组合在一起,对它表示感谢。我已经接受了约翰的回答;下面的解决方案代码供参考。
Collection
答案 2 :(得分: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]