我想知道如何在一段时间内使用fsolve实现迭代根查找器,直到它找到N个根?(假设我知道在手术过程中获得每个根的步骤应该有多小(有没有一种方法可以通过一个简单的double-for-loop来做到这一点?
以下是";简单的";函数(cos(x(*x(:
import numpy as np
from scipy.optimize import fsolve
import numpy as np
def f(x):
return np.cos(x)*x
for n in range(1,10) :
a = 0
k = 0
while k < 1000 :
k = fsolve(f,a)
if k == a :
a = a+0.01
k = fsolve(f,a)
else :
print(k)
但我不能这样做。我不能用支票,因为我的真实函数更复杂(涉及贝塞尔函数(,而chepby没有似乎接受这样的功能作为论据。
编辑:修正了缩进,这个程序产生0(第一个解决方案(无限次不停止。
你能分享你的错误吗?可能与f(x(函数的缩进有关,请尝试将代码更改为:
def f(x):
return np.cos(x)*x
我找到了一个解决方案,可以完成目前的工作。它包括传递一个与搜索间隔相对应的数组,然后排序解决方案(在我的情况下,只查看正解,删除重复项等(
这可能不是最好的方法,但它对我有效:
在这个例子中,我正在寻找cos(x(*x=0的10个第一正解假设它们在[0100]中。
import numpy as np
from scipy.optimize import fsolve
def f(x):
return np.cos(x)*x
int = np.arange(0,100,1)
arr = np.array([int])
roots=fsolve(f,arr)
# print(roots)
roots=np.around(roots, decimals=5, out=None)
a = roots[roots >= 0]
b = np.unique(a)
b=(b[:10])
print(b)
Result :
[ 0. 1.5708 4.71239 7.85398 10.99557 14.13717 17.27876 20.42035
23.56194 26.70354]
我必须使用np.around,否则np.unique将不起作用。再次感谢。