1

これが事です。Python で fsolve 関数を使用して、3 次関数のルートを見つけようとしています。この 3 次関数には、パラメーター がありますdeltaW。私がしていることは、このパラメータdeltaWを から-50に変更50し、同時に 3 次関数の根を見つけることです。以下は私のスクリプトです:

from scipy.optimize import fsolve
import matplotlib.pyplot as plt
import numpy as np
import pylab

g = 5.61
gamma = 6.45
kappa = 6.45
J = 6.45
rs = 1.0                            #There are just parameters
m = 5.0*10**(-11)
wm = 2*3.14*23.4

X = []
X1 = []

def func(x):                                #Define the cubic function I  need to solve

        A = 1j*g**2*(kappa + 1j*deltaW)*x*x/(m*wm**2)
        B = J**2 + (1j*deltaW - gamma)*(1j*deltaW + kappa)
        C = A + B
        D = abs(C)*x - J*np.sqrt(2*kappa)*rs
        return D

for deltaW in np.linspace(-50, 50, 1000):
    x0 = fsolve(func, 0.0001)
    X.append(x0)

deltaW = np.linspace(-50, 50, 1000)
plt.plot(deltaW, X)    
plt.show()

このスクリプトを実行すると、次の 2 つのメッセージが表示されます。

 RuntimeWarning: The iteration is not making good progress, as measured by the 
  improvement from the last five Jacobian evaluations.
  warnings.warn(msg, RuntimeWarning)

/usr/lib/python2.7/dist-packages/scipy/optimize/minpack.py:152: RuntimeWarning: The iteration is not making good progress, as measured by the 
  improvement from the last ten iterations.
  warnings.warn(msg, RuntimeWarning)

申し訳ありませんが、このスクリプトの筋書きをここに載せるほどの評判はありません。私の質問は、なぜこのメッセージが表示されるのか、なぜ私のプロットが左の部分で奇妙に見えるのかということです.

私のコードが間違っているためですか?

4

1 に答える 1

6

根を見つけるほとんどすべての場合と同様に、適切な初期推定が不可欠です。場合によっては、最初の最良の推測が実際には間違っていることがわかっていることがあります。それがここにあります。答えに予期しない「スパイク」を示すスクリプトの動作は、関数をプロットすることと、それらのスパイクの周りに見つかったルートをプロットすることの両方によって、より深く調べることができます (ねえ、Python コンソールを持っています - これは本当に簡単です)。
関数が実際にはそれほど異なって見えなくても、ソルバーによって返された解が飛び回っていることがわかります。問題は、0.0001 という最初の推測が関数のごくわずかな最小値に近く、ソルバーがそこから抜け出す方法を見つけられないことです。初期推定値を 1.0 に設定すると (かなり離れていますが、ルートに直接向かう関数の適切で簡単な下降部分で)、結果は次のようになります。 ここに画像の説明を入力

つまり、次の 3 つのことです。 1. 解決者には愛情と注意が必要です。

  1. 「正しい」最初の推測は、正しい答えであることがわかっているものから大きく離れている場合がありますが、ソルバーがそれを簡単に処理できるようになっています。

  2. インタラクティブな Python コンソールを使用すると、何が起こっているかをすばやく確認できます。その力を使おう!

于 2015-01-28T14:44:15.650 に答える