单点二分法求解f(x)=e^(-x)-x根的MATLAB代码错误排查求助
单点二分法求解$f(x)=e^{-x}-x$根的代码错误排查与修正
问题概述
尝试用单点二分法求解函数$f(x)=e^{-x}-x$的根(正确根约为0.567),但现有MATLAB代码输出结果为0.2246,存在多处逻辑错误,以下是错误分析与修正方案。
错误分析
1. 符号函数sgn逻辑完全错误
当前sgn函数的参数是x,但内部却调用w=f(x),这意味着调用sgn(f(a))时,实际计算的是f(f(a))的符号,而非输入参数f(a)的符号,完全偏离了符号函数的设计目的。
2. 函数参数被无意义覆盖
主函数bisection_mod定义了a,b,tol作为输入参数,但内部直接赋值a=-1;b=2;和tol=10^(-8);,导致外部传入的参数无效,也不符合函数封装性要求。
3. 迭代逻辑核心错误
- 初始
xnew设为0,不符合单点二分法从初始区间端点开始迭代的逻辑,导致第一次迭代起点错误。 xold的更新条件错误:仅当i>1时才更新,导致前两次迭代始终使用初始xold=-1,迭代路径完全偏离正确方向。- 迭代步长的计算逻辑混乱:
par=2^(i+1)的计数与步长衰减规则不匹配,不符合单点二分法的步长更新要求。
修正后的代码
1. 函数$f(x)$的定义(无需修改)
function [y] = f(x) y = exp(-x) - x; end
2. 修正后的符号函数sgn
function [z] = sgn(x) if x > 0 z = 1; elseif x == 0 z = 0; else z = -1; end end
3. 修正后的主程序
function [root, iter, err] = bisection_mod(a, b, tol) % 设置默认参数,若外部未传入则使用默认值 if nargin < 3 tol = 1e-8; if nargin < 2 b = 2; if nargin < 1 a = -1; end end end iter = 0; xold = a; % 从初始点a开始迭代 c = sgn(f(a)) * (b - a); % 计算初始方向系数 err = inf; % 初始化误差 while err > tol && iter < 100 xnew = xold + c / (2^(iter + 1)); % 单点二分法迭代公式 err = abs(xnew - xold); % 更新迭代起点 xold = xnew; iter = iter + 1; % 根据当前点的函数符号调整方向系数 c = sgn(f(xold)) * (b - a); end root = xold; end
验证结果
调用修正后的函数:
[root, iter, err] = bisection_mod(-1, 2, 1e-8); disp(root); % 输出约0.567143290409784,与正确根一致
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

