有界函数的求根

时间:2018-07-04 22:21:06

标签: python newtons-method bisection

F(r)

我有一个函数F(r)。它的边界是0

代码如下:

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

在这里,我定义了一个'solve'函数,用于通过牛顿方法找到根。第一个参数是函数F。“ for”循环是因为我传递了nstar的tstar列表,​​该列表源自n-F个函数,因此“ solve”返回我每个F函数的所有根。

但是,当它开始迭代时,它会跳到有效函数范围之外的r个值(例如,r可以采用7之类的值,但没有解)。我尝试更改初始猜测,但是我通过的初始猜测并不重要(我已经尝试将初始猜测从0更改为3,但是所有这些最终都跳出了功能范围)。 我想知道是否有办法防止这些越界跳跃。

此外,由于我可以控制bisect方法,因此我尝试了bisect方法。这是代码:

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

此方法的问题在于,当bisect函数计算f(a)和f(b)时,它们表示它们具有相同的符号,因为我无法控制应评估函数的哪个“分支”。因此,对于给定r的两个可能值,它采用“负分支”,而不是例如对于f(a)为负解,对于f(b)为正解。另外,由于根在函数的最后,所以我根本不知道此方法是否适用。

最后,我对另一种寻根算法持开放态度,您知道该算法可能对我的特定案例有用。 谢谢您的时间和答复!

0 个答案:

没有答案