You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单点二分法求解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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:10:33