3

解決する必要がある次の 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 です。

4

1 に答える 1

6

@Christian、あなたが提案した投稿とは異なり、方程式系を簡単に線形化できるとは思いません。

Powell のハイブリッド法 ( optimize.fsolve()) は初期条件に非常に敏感であるため、適切な初期パラメーター推定を思いつくことができれば非常に役立ちます。次の例では、最初に Nelder-Mead 法を使用して 3 つの方程式すべての平方和を最小化します ( 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)

結果はかなり良いです。

于 2013-12-29T23:07:14.587 に答える