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