事情是这样的。
我尝试在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()
运行此脚本时,会收到以下两条消息:
^{pr2}$很抱歉,我没有足够的声誉把这个剧本的情节放在这里。我的问题是为什么我得到这个信息,为什么我的情节在左边看起来如此怪异。在
是因为我的密码错了吗?在
在几乎所有的寻根案例中,一个好的初始猜测是必不可少的。事实上,有时最好的初步猜测是错误的。这里就是这样。脚本的行为在答案中显示了意外的“尖峰”,可以通过绘制函数和绘制这些尖峰周围找到的根来更深入地观察(嘿,你有一个Python控制台,这真的很简单)。
你会发现解算器返回的解是跳跃式的,尽管函数看起来并没有那么大的不同。问题是,你最初对0.0001的猜测接近于函数的极小值,而解算器却无法想出如何摆脱它。将初始猜测值设置为1.0(很遥远,但是在函数的一个好的、容易下降的部分,它将直接指向根),结果是:
所以,有三件事: 1解决方案需要关爱和关注-他们很少汽车。在
有时“正确”的初始猜测可能与你所知道的正确答案相去甚远,但这样一来,解算器就可以轻松地完成它了。
交互式Python控制台允许您快速查看正在发生的事情。利用它的力量!
相关问题 更多 >
编程相关推荐