这是东西。
    我正在尝试在Python中使用fsolve函数来查找三次函数的根。此三次函数具有参数deltaW。我要做的是将此参数deltaW-50更改为50,并同时找到三次函数的根。下面是我的脚本:

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()


运行此脚本时,收到以下两条消息:

 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)


抱歉,我没有足够的声誉来将此脚本的剧情放在这里。我的问题是为什么我会收到此消息,为什么我的图在左侧看起来如此怪异。

是否因为我的代码错误?

最佳答案

几乎在所有找到根的情况下,都必须有一个很好的初始猜测。有时,最好的初步猜测实际上是错误的。就是这种情况。可以通过绘制函数和绘制峰值附近的根来更深入地了解脚本的行为,该行为在答案中显示了意外的“尖峰”(嘿,您有一个Python控制台-真的很容易)。
您发现的是,求解器返回的解决方案正在跳跃,即使该函数看起来并没有什么不同。问题在于,您最初对0.0001的猜测接近该函数的极小最小值,而求解器无法弄清楚如何从那里撤出。将初始猜测值设置为1.0(距离很远,但是在函数的漂亮且容易下降的部分,它将直接指向根),结果是:
 

因此,三件事:
1.求解器需要充满爱心的关怀和关注-他们很少会自动解决。


有时,“正确的”初始猜测可能会与您所知道的正确答案相去甚远,但是这样一来,求解器可以轻松应对。
交互式Python控制台可让您快速查看发生了什么。使用它的力量!

关于python - 找到三次函数的根,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28187569/

10-13 07:22
查看更多