5

方程式の根を見つけるために、scipy の optimize.fsolve 関数を初めて使用しています。問題は、推測/推定値として使用する数値が、答えとして返されるものであることです (小数点以下約 8 桁以内)。full_output=True を使用すると、exitflag が「1」になります。これは、「解が収束した」ことを意味し、私の理解では、出力が実際に方程式の根であることを意味するはずです。

方程式をグラフにすると、それらを見ることができるように、有限数の別個の根 (間隔を空けて配置されている) があることを知っています。また、未定義の値 (ゼロで除算、負の値の平方根) を返す必要がある範囲内に開始点を入力すると、fsolve が失敗します (エラー exitflags が表示されます)。ただし、それ以外は常に開始点をルートとして返します。

非常に単純な方程式で fsolve をテストしたところ、問題なく動作したので、必要なものをすべてインポートしており、fsolve を正しく使用する必要があることがわかりました。また、いくつかの入力引数をいじってみましたが、よく理解できず、何も変わっていないようです)。

以下は関連するコードです (E は唯一の変数で、それ以外はすべてゼロ以外の値です)。

def func(E):
    s = sqrt(c_sqr * (1 - E / V_0))
    f = s / tan(s) + sqrt(c_sqr - s**2)
    return f

guess = 3
fsolve(func, guess)

最も近い解は約 2.8 と 4.7 であるはずですが、「3」を出力し、「解が収束しました。」と表示されます。

これを修正して正しい答えを得る方法を知っている人はいますか (fsolve を使用)?

4

2 に答える 2

6

あなたの方程式は、あなたが思っていることをしていないと思います。1 つには、試してみると、推測が返されません。推測に近い数値を返します。非常に不安定で、混乱しているようfsolveです。例えば:

>>> V_0 = 100
>>> c_sqr = 3e8 ** 2
>>> guess = 5
>>> fsolve(func, guess)
array([ 5.00000079])

これは 5 ではありません。機械精度では 5 にも満たないのです。また、方程式の根でもありません。

>>> func(5.00000079)
2114979.3239706755

しかし、とにかく、方程式の動作はかなり予測できません。

>>> func(5.0000008)
6821403.0196130127
>>> func(5.0000006)
-96874198.203683496

そのため、明らかにそのあたりのどこかにゼロクロッシングがあります。あなたの方程式をよく見てください。tanたとえば、 の引数をラジアンで指定していることを確認してください。

于 2011-12-19T13:53:59.607 に答える
1

関数を本当に些細なものに変更してみましたか?このような:

#!/usr/bin/python
from scipy.optimize import fsolve

def func(E):
#    s = sqrt(c_sqr * (1 - E / V_0))
#    f = s / tan(s) + sqrt(c_sqr - s**2)
    f = E**2 -3.
    return f

guess = 9

sol=fsolve(func, guess)
print sol, func(sol)

私にとって、上記のコードは本来あるべき場所に収束します。

また、あなたが提供したコードでは、---とは何c_strですかV_0?実際、関数が複数の変数に依存していて、1つを除くすべての変数を定数パラメーターとして扱っている場合argsは、次のようにfsolveの引数を使用します。

#!/usr/bin/python
from scipy.optimize import fsolve
from numpy import sqrt

def func(E,V_0):
    #s = sqrt(c_sqr * (1 - E / V_0))
    #f = s / tan(s) + sqrt(c_sqr - s**2)
    f = E**2 -V_0
    return f

VV=4.
guess = 9
sol=fsolve(func, guess, args=(VV))

print sol, func(sol,VV) 
于 2011-12-19T13:46:35.747 に答える