scipy 当使用newon方法时,是否有检查收敛性的方法?

omjgkv6w  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(161)

我有一个函数,我想用牛顿法求解。问题是收敛性取决于初始猜测。我想写一个if语句。如果函数收敛,那么存储变量,但如果不收敛,我想改变初始语句。初始语句将先验地存储在一个列表中。

for i in range(len(initial_guess)):

        t_end = newton(self.ray_param_eq, initial_guess[i],
                   fprime=self.ray_param_eq_prime,
                   fprime2=self.ray_param_eq_second_prime,
                   args=(self.c, self.k, ray.z_0, ray.y_0, ray.theta, self.A, self.B),
                   maxiter=100, tol=1.48e-5, disp=False)
        if t_end is not None: break
        if t_end is None: continue

initil_guess =包含初始猜测变量的列表
上面的代码没有引发错误,但我不知道它是否有效。

axkjgtzd

axkjgtzd1#

实际上,scipy.optimize.newton()提供了一种获得收敛性元素信息的方法(如评估迭代参数序列与容差水平tol的差异)。

t_end = newton(..., full_output=True)

将此代码片段作为最小可行示例

def f(x):
    return (x-2.0)**2 

t_end = newton(f, 0.0, maxiter=1000, tol=1.48e-5, disp=False, full_output=True)

t_end
> (1.9999835249000992,
       converged: True
            flag: 'converged'
  function_calls: 25
      iterations: 24
            root: 1.9999835249000992)

反过来,您可以通过以下方式利用聚合信息

if t_end[1].converged:
     break # exit while-loop

对于带有标量参数x的函数f(如上面的代码片段所示)或

if t_end.converged.all():
     break # exit while-loop

如果函数输入x是可迭代对象(元组、列表、NumPy数组等)

h4cxqtbf

h4cxqtbf2#

除非你的迭代遇到了灾难性的数值不稳定性,或者你接近一个重根,否则收敛在某个点上是“爆炸性的”,所以你可以检查迭代是否稳定到浮点表示的最后一位(少量ULP)。

相关问题