我想用fsolve
来求一个非线性超越方程的根。
下面的代码可以完成这项工作。
import numpy as np
from scipy.optimize import fsolve
import matplotlib.pyplot as plt
kappa = 0.1
tau = 90
def equation(x, * parameters):
kappa,tau = parameters
return -x + kappa * np.sin(-tau*x)
x = np.linspace(-0.5,0.5, 35)
roots = fsolve(equation,x, (kappa,tau))
x_2 = np.linspace(-1.5,1.5,1500)
plt.plot(x_2 ,x_2 )
plt.plot(x_2 , kappa*np.sin(-x_2 *tau))
plt.scatter(x, roots)
plt.show()
我可以通过绘制两个图f1(x) = x
和f2(x) = k*sin(-x*tau)
(我也将其包含在代码中),以图形方式仔细检查解决方案。fsolve
给了我一些错误的答案,没有抛出任何错误或收敛问题。
问题是,我想自动化改变kappa
和tau
的过程,而不需要检查哪些答案是错误的,哪些答案是正确的。但是如果输出的是错误的答案,我就不能使用这个方法了。为了安全起见,还有其他方法或选择吗?
1条答案
按热度按时间bvn4nwqk1#
我不能运行你的代码,有错误,无论如何,根据scipy.fsolve的文档,你应该添加一个初始猜测作为第二个输入参数,而不是像你在
fsolve(equation, x0, (kappa,tau))
中所做的那样添加一个范围。当然,你也可以在循环中传递它,对数组
np.linspace(0.5, 0.5, 25)
中的每个值进行循环。虽然我不明白你试图通过改变kappa和tau来实现什么,但如果我认为对于这些给定的参数,你有兴趣寻找根,这里是我如何做的。可能不是最聪明的方法(假设我理解正确),但也许你现在有了主意。