在数字上找到方程的根返回初始猜测

时间:2015-01-28 01:33:46

标签: python cubic

我试图使用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始终是我设置的猜测值。 谁能告诉我为什么会这样,以及如何解决它?

1 个答案:

答案 0 :(得分:0)

您正在向fsolve传递一个根本不是函数的函数:它对输入x没有任何作用。然而,fsolve需要它,因为它将测试一系列值,并且每次使用该测试值检查函数调用的返回值。在您的情况下,func(x)永远不会更改,因此fsolve会停止并显示错误消息

  

迭代并未取得良好进展,正如过去十次迭代的改进所证明的那样。

如果您要在full_output=True的通话中添加fsolve,则可以看到该消息。

要解决此问题,请按以下方式定义您的功能:

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