如何修改Matlab二分法程序,先输出原始值再输出更新值?
解决MATLAB二分法先输出原始值再输出更新值的问题
看起来你在写二分法代码时,卡在了输出顺序上——现在的逻辑是先更新xl/xu再输出,导致看不到更新前的原始状态。其实只要调整一下代码的执行顺序就能轻松解决,我来给你拆解清楚:
问题根源
你当前的代码流程是:计算xmid → 判断条件并更新xl/xu → 输出数值。这时候输出的xl/xu已经是修改后的值,自然看不到迭代前的原始状态。
修改方案:先输出,再更新
核心思路就是把输出操作提前到变量更新之前,确保输出的是未修改的原始xl和xu。这里有两种简洁的实现方式:
方式1:直接输出未修改的xl/xu(最简洁)
不需要额外变量,直接在计算xmid后、修改xl/xu前输出,此时xl和xu还保持着原始值:
% 提前初始化必要变量(循环外执行) tol = 1e-6; % 替换成你的误差阈值 xnew(1) = 0; % 初始值根据你的需求调整 xl = 0; xu = 2; % 示例初始区间,替换成你的初始值 f = @(x) x^2 - 2; % 示例目标函数,替换成你的f(x) % 输出表头,让结果更清晰 fprintf('Iteration \t xl (original) \t xu (original) \t xmid \n'); for i=2:10000 xmid = (xl + xu)/2; % 先输出原始值!此时xl和xu还未被修改 fprintf('%2i \t %f \t %f \t %f \n', i-1, xl, xu, xmid); % 再执行二分法的更新逻辑 if f(xl)*f(xmid) > 0 xl = xmid; else xu = xmid; end xnew(i) = xmid; % 误差判断,满足条件就退出循环 if abs((xnew(i)-xnew(i-1))/xnew(i)) < tol break; end end
方式2:用临时变量保存原始值(更直观)
如果你想更明确地区分原始值和更新后的值,可以用临时变量先保存xl和xu的初始状态,再输出:
% 初始化部分同上 tol = 1e-6; xnew(1) = 0; xl = 0; xu = 2; f = @(x) x^2 - 2; fprintf('Iteration \t xl (original) \t xu (original) \t xmid \n'); for i=2:10000 % 先保存原始值 xl_original = xl; xu_original = xu; xmid = (xl + xu)/2; % 输出保存的原始值 fprintf('%2i \t %f \t %f \t %f \n', i-1, xl_original, xu_original, xmid); % 再更新变量 if f(xl)*f(xmid) > 0 xl = xmid; else xu = xmid; end xnew(i) = xmid; if abs((xnew(i)-xnew(i-1))/xnew(i)) < tol break; end end
额外注意点
- 把
xnew(1)=0移到循环外面!原来的代码每次循环都会重置xnew(1)为0,会导致后续的误差判断逻辑出错。 - 确保你在循环前已经定义了
xl、xu、tol和f(x)的初始值,不然代码会报错。
这样修改后,你就能在每次迭代中先看到原始的xl/xu,再执行更新操作啦。
内容的提问来源于stack exchange,提问作者Abood
相关产品推荐
相关产品推荐

