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]