我试图使用 fsolve
找到三次方程的根。这是我的代码:
from scipy import *
from scipy.optimize import fsolve
import matplotlib.pyplot as plt
import numpy as np
#These are all parameters
g = 5.61
gamma = 6.45
kappa = 6.45
J = 6.45
rs = 10.0
m = 5.0*10**(-11)
wm = 2*3.14*23.4
r2 = np.linspace(0, 0.02, 1000)
deltaW = 0
A = 1j*g**2*(kappa + 1j*deltaW)*r2*r2/(m*wm**2)
B = J**2 + (1j*deltaW - gamma)*(1j*deltaW + kappa)
C = A + B
D = abs(C)*r2 - J*np.sqrt(2*kappa)*rs
def func(x):
D = abs(C)*r2 - J*np.sqrt(2*kappa)*rs
return D
x0 = fsolve(func, 0.0)
print x0
plt.plot(r2, D)
plt.show()
我从图中可以看到,至少有一个 r2 使 D 为零。但是,我从 fsolve 获得的返回值 x0 始终是我设置的猜测值。谁能告诉我为什么会发生这种情况以及如何解决它?
您正在传递给fsolve
一个根本不是函数的函数:它不会对输入x
执行任何操作。然而,fsolve
需要它,因为它将测试一系列值,并且每次使用该测试值检查函数调用的返回值。在您的情况下,func(x)
永远不会更改,因此fsolve
停止并显示错误消息
迭代没有取得良好的进展,这是通过过去十次迭代的改进来衡量的。
如果要在对fsolve
的调用中添加full_output=True
,则可以看到该消息。
要解决它,请像这样定义您的函数:
def func(x):
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