找到三次函数的根

epx*_*epx 1 python numpy scipy cubic

这就是事情.我试图在Python中使用fsolve函数来查找三次函数的根.这个三次函数有一个参数,deltaW.我要做的就是将此参数改为deltaW-5050,并找到三次函数的根在同一时间.以下是我的脚本:

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()
Run Code Online (Sandbox Code Playgroud)

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

 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)
Run Code Online (Sandbox Code Playgroud)

对不起,我没有足够的声誉把这个剧本的情节放在这里.我的问题是为什么我会收到这条消息,为什么我的情节在左边部分看起来很奇怪.

是因为我的代码错了吗?

Jon*_*ter 6

正如在几乎所有寻找根源的情况下一样,必须进行良好的初步猜测.事实上,有时最好的初步猜测是错误的.这就是这种情况.你的脚本的行为,在答案中显示出意想不到的"尖峰",可以通过绘制函数来绘制更深入的内容,并在这些峰值周围绘制找到的根源(嘿,你有一个Python控制台 - 这个真的很容易).
你发现解算器返回的解决方案正在四处跳跃,即使该函数看起来并没有那么不同.问题是你初始猜测的0.0001接近函数的一个微小的最小值,求解器无法弄清楚如何离开那里.将初始猜测设置为1.0(远处,但在函数的一个很好的,容易下降的部分,将直接指向根),结果反而在: 在此输入图像描述

所以,有三件事:1.求解者需要爱护和关注 - 他们很少是自动化的.

  1. 有时,"正确"的初始猜测可能远离你所知道的正确答案,但是这样一来,解算器就可以轻松完成.

  2. 交互式Python控制台可让您快速查看正在发生的事情.使用它的力量!