python - 使用newon方法时是否有检查收敛性的方法?

标签 python scipy numerical-methods

我有一个函数想要使用牛顿法求解。问题在于收敛取决于最初的猜测。 我想写一个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 = 包含初始猜测变量的列表

上面的代码没有引发错误,但我不知道它是否有效。

最佳答案

确实,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数组等)

关于python - 使用newon方法时是否有检查收敛性的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73332839/

相关文章:

python - 生成缓冲区半径多边形 - 可能的投影问题

python - 获取纳秒级精度的文件修改时间

python - 将密集矩阵从文件直接读取到稀疏 numpy 数组中?

c - 为什么C语言的数值解和解析解是一样的?

Python 分析器和 CPU 秒数

Python plotly Dash 更新/刷新布局

python - 如何使用pip和自制软件安装SciPy Stack?

python - 德莱尼三角剖分的欧几里德距离 - Scipy

matlab - 雅可比迭代没有结束

c# - 为什么对于这种特定情况,结构比类快得多?