求Secant Method失效但Bisection Method收敛的函数示例(区间[a,b],初始点a、b)
满足条件的函数示例:割线法失效但二分法收敛
我来给你举一个完美符合要求的例子,咱们一步步拆解清楚它为什么满足条件。
函数与区间定义
- 目标函数:
f(x) = 1/x - 1 - 测试区间:
[0.5, 2] - 区间内的根:
x=1(代入函数可得f(1)=1/1 -1=0)
二分法的收敛性分析
二分法的核心要求很简单:区间两端点的函数值必须异号(也就是f(a)*f(b) < 0),这样根据中间值定理,区间内必然存在至少一个根,迭代过程会不断缩小区间范围,最终收敛到根。
咱们验证一下:
f(0.5) = 1/0.5 -1 = 1(正数)f(2) = 1/2 -1 = -0.5(负数)- 两者乘积为
-0.5 < 0,完全满足二分法的启动条件。
迭代过程大概是这样的:
- 第一次取中点
1.25,f(1.25)=-0.2(负数),新区间变为[0.5, 1.25] - 第二次取中点
0.875,f(0.875)≈0.1429(正数),新区间变为[0.875, 1.25] - 后续每次迭代都会把区间缩小一半,最终必然收敛到根
x=1。
割线法的失效分析
割线法依赖两点的函数值来构造割线,迭代公式是:x_{n+1} = x_n - f(x_n) * (x_n - x_{n-1}) / (f(x_n) - f(x_{n-1}))
咱们从初始点x0=0.5和x1=2开始计算:
- 第一步计算x2:
此时x2 = 2 - (-0.5) * (2-0.5) / (-0.5 -1) = 2 - (-0.75) / (-1.5) = 2 - 0.5 = 1.5f(1.5)≈-0.3333 - 第二步计算x3:
你看,x3 = 1.5 - (-0.3333) * (1.5-2) / (-0.3333 - (-0.5)) = 1.5 - (0.16665) / 0.1667 ≈1.5 -1 = 0.5x3直接回到了初始点x0=0.5!接下来的迭代会进入0.5 → 2 →1.5 →0.5 →2...的死循环,永远碰不到根x=1,完全失效。
代码示例(Python)
用代码直观展示两种方法的表现:
def f(x): return 1/x - 1 # 二分法实现 def bisection(a, b, tol=1e-6): if f(a)*f(b) >= 0: raise ValueError("二分法要求区间端点函数值异号") while (b - a)/2 > tol: mid = (a + b)/2 if f(mid) == 0: return mid elif f(a)*f(mid) < 0: b = mid else: a = mid return (a + b)/2 # 割线法实现(展示循环失效) def secant(x0, x1, max_iter=10): print("=== 割线法迭代过程 ===") for i in range(max_iter): fx0 = f(x0) fx1 = f(x1) if abs(fx1 - fx0) < 1e-10: print("分母接近0,无法继续迭代") break x2 = x1 - fx1 * (x1 - x0)/(fx1 - fx0) print(f"迭代{i+1}: x={x2:.4f}, f(x)={f(x2):.4f}") # 检查是否回到初始点,判断循环 if abs(x2 - x0) < 1e-8: print("割线法陷入循环,失效!") break x0, x1 = x1, x2 # 测试二分法 print("=== 二分法结果 ===") print(f"收敛到根:{bisection(0.5, 2):.6f}") # 测试割线法 secant(0.5, 2)
运行这段代码后,二分法会输出1.000000左右的结果,而割线法会在第3次迭代后回到初始点,提示陷入循环失效。
内容的提问来源于stack exchange,提问作者Ekber
相关产品推荐
相关产品推荐

