我有一个函数F(r)。它的边界是0 代码如下: 在这里,我定义了一个'solve'函数,用于通过牛顿方法找到根。第一个参数是函数F。“ for”循环是因为我传递了nstar的tstar列表,该列表源自n-F个函数,因此“ solve”返回我每个F函数的所有根。 但是,当它开始迭代时,它会跳到有效函数范围之外的r个值(例如,r可以采用7之类的值,但没有解)。我尝试更改初始猜测,但是我通过的初始猜测并不重要(我已经尝试将初始猜测从0更改为3,但是所有这些最终都跳出了功能范围)。
我想知道是否有办法防止这些越界跳跃。 此外,由于我可以控制bisect方法,因此我尝试了bisect方法。这是代码: 此方法的问题在于,当bisect函数计算f(a)和f(b)时,它们表示它们具有相同的符号,因为我无法控制应评估函数的哪个“分支”。因此,对于给定r的两个可能值,它采用“负分支”,而不是例如对于f(a)为负解,对于f(b)为正解。另外,由于根在函数的最后,所以我根本不知道此方法是否适用。 最后,我对另一种寻根算法持开放态度,您知道该算法可能对我的特定案例有用。
谢谢您的时间和答复!def F(r, tstar, s):
t = Project.t(s,r)
F = t- tstar
return F
def solve(F, initguess, tstar, s, fprime= None, tol = 1e-12, maxiter = 1000):
sol = [0]*len(tstar)
for index,item in enumerate(tstar):
root = sp.optimize.newton(F, initguess, args = (item,s), fprime=fprime,tol = tol, maxiter = maxiter)
sol[index] = root
return sol
def solvebisect(f, a, b , tstar, spiral, xtol =1e-12 , rtol = 1e-12, full_output = 0):
sol = [0]*len(tstar)
for index,t in enumerate(tstar):
zero = sp.optimize.bisect(f,a,b, args=(t,spiral), xtol=xtol, rtol=rtol, full_output = full_output)
sol[index] = zero
return sol