【问题标题】:how to solve 3 nonlinear equations in python如何在python中求解3个非线性方程
【发布时间】:2013-12-30 07:16:19
【问题描述】:

我需要求解以下 3 个非线性方程组:

-xyt + HF = 0

-2xzt + 4yzt - xyt + 4z^2t - M1F = 0

-2xt + 2yt + 4zt - 1 = 0

其中 x、HF 和 M1F 是已知参数。因此,y、z、t是需要计算的参数。

尝试解决问题:

def equations(p):
    y,z,t = p
    f1 = -x*y*t + HF
    f2 = -2*x*z*t + 4*y*z*t - x*y*t + 4*t*z**2 - M1F
    f3 = -2*x*t + 2*y*t + 4*z*t - 1
    return (f1,f2,f3)

y,z,t = fsolve(equations)

print equations((y,z,t))

但问题是,如果我想使用scipy.optimize.fsolve,那么我应该输入一个初始猜测。就我而言,我没有任何初始条件。

在python中是否有另一种方法可以求解具有3个未知数的3个非线性方程?

编辑:

原来我有条件!条件是HF > M1F,HF > 0,M1F > 0。

【问题讨论】:

  • 但我无法添加任何初步猜测。除了使用scipy.optimize,还有其他方法吗?
  • 你读过这个post吗?

标签: python-2.7 optimization numpy scipy nonlinear-optimization


【解决方案1】:

@Christian,与您建议的帖子不同,我认为方程系统不容易线性化。

Powell 的 Hybrid 方法 (optimize.fsolve()) 对初始条件非常敏感,因此如果您能想出一个好的初始参数猜测,它就非常有用。在下面的例子中,我们首先使用 Nelder-Mead 方法最小化所有三个方程的平方和(optimize.fmin(),对于像 OP 这样的小问题,这可能已经足够了)。然后将得到的参数向量用作optimize.fsolve() 的初始猜测,以得到最终结果。

>>> from numpy import *
>>> from scipy import stats
>>> from scipy import optimize
>>> HF, M1F, x=1000.,900.,10.
>>> def f(p):
    return abs(sum(array(equations(p))**2)-0)
>>> optimize.fmin(f, (1.,1.,1.))
Optimization terminated successfully.
         Current function value: 0.000000
         Iterations: 131
         Function evaluations: 239
array([ -8.95023217,   9.45274653, -11.1728963 ])
>>> optimize.fsolve(equations, (-8.95023217,   9.45274653, -11.1728963))
array([ -8.95022376,   9.45273632, -11.17290503])
>>> pr=optimize.fsolve(equations, (-8.95023217,   9.45274653, -11.1728963))
>>> equations(pr)
(-7.9580786405131221e-13, -1.2732925824820995e-10, -5.6843418860808015e-14)

效果还不错。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多