用牛顿法与试位法计算√5并求15位精度迭代次数
嘿,我来帮你搞定试位法的部分,顺便把整个问题的解法梳理清楚~
问题本质回顾
求√5等价于求解方程 $f(x) = x^2 - 5 = 0$ 的正根,这是两种迭代方法的核心目标。
牛顿法(你已完成的部分)
你给出的牛顿法迭代公式是:
$$x_{k+1} = x_k - \frac{f(x_k)}{f'(x_k)}$$
针对 $f(x)=x^2-5$,导数 $f'(x)=2x$,代入后公式可简化为:
$$x_{k+1} = \frac{1}{2}\left(x_k + \frac{5}{x_k}\right)$$
这是二次收敛的迭代方法,收敛速度极快,通常3-4次迭代就能达到15位精度(和你用Python算出的结果一致)。
试位法(重点解决你的疑问)
试位法(又称线性插值法)属于区间迭代法,需要先确定一个包含根的初始区间 $[l, r]$(满足 $f(l) \cdot f(r) < 0$),然后通过区间端点的线性插值生成新的迭代值,公式如下:
$$x_k = \frac{l \cdot f(r) - r \cdot f(l)}{f(r) - f(l)}$$
每次迭代后,根据 $f(x_k)$ 的符号更新区间:若 $f(l) \cdot f(x_k) < 0$,则将 $r$ 替换为 $x_k$;否则将 $l$ 替换为 $x_k$,重复直到满足精度要求。
试位法实现步骤(针对√5)
- 初始区间选择:因为 $22=4<5$,$32=9>5$,所以初始区间选 $[l=2, r=3]$,此时 $f(l)=-1$,$f(r)=4$,满足 $f(l)f(r)<0$。
- 终止条件:要达到15位精度,我们可以设置迭代值与真实根 $\sqrt{5}$ 的绝对误差小于 $10^{-15}$。
- Python代码实现
试位法的Python代码示例
def f(x): return x ** 2 - 5 def regula_falsi(target_precision=1e-15): l = 2.0 r = 3.0 iter_count = 0 true_root = 5 ** 0.5 # 提前计算真实根用于精度判断 while True: # 计算试位法迭代值 x_k = (l * f(r) - r * f(l)) / (f(r) - f(l)) iter_count += 1 # 检查是否达到精度要求 if abs(x_k - true_root) < target_precision: break # 更新区间 if f(l) * f(x_k) < 0: r = x_k else: l = x_k return x_k, iter_count # 执行并输出结果 calculated_root, iterations = regula_falsi() print(f"试位法求得的√5: {calculated_root:.16f}") print(f"达到15位精度所需迭代次数: {iterations}")
试位法迭代次数说明
试位法是线性收敛的,收敛速度远慢于牛顿法,因此达到15位精度需要的迭代次数大概在50次左右(具体数值运行代码即可得到)。需要注意的是,基础试位法偶尔会出现“单侧停滞”的情况(其中一个区间端点长期不变),可以通过加权改进优化,但基础版本已经能满足收敛要求,只是迭代次数较多。
两种方法对比
- 牛顿法:二次收敛,迭代次数极少,但需要计算导数,且对初始值敏感(初始值离根过远可能不收敛)。
- 试位法:线性收敛,迭代次数多,但属于区间方法,只要初始区间包含根就一定收敛,无需计算导数。
内容的提问来源于stack exchange,提问作者undergrad

