Matlab中使用trapz函数积分时结果不更新的问题求助
问题分析与修复
核心问题点
- 误差未取绝对值:直接用
epsilon = I_new - I会导致后续积分结果小于前一次时,epsilon变为负数,直接不满足epsilon >= tol的循环条件,循环提前终止,看起来像是I_new没更新。 - 初始epsilon设置不合理:初始将
epsilon = I,若I远大于tol,第一次循环会执行,但后续误差符号反转后循环立刻停止;若I小于tol,循环直接不执行。 - 潜在函数向量化缺陷:如果
L(t)仅支持标量输入(未做向量化处理),传入向量t1时无法正确计算每个点的函数值,会导致y1结果错误,积分值始终不变。
修复后的代码
N = 1; % 初始网格区间数 t = linspace(t0, tf, N+1); % 用linspace避免步长精度问题 y = L(t); % 确保L(t)支持向量输入 I = trapz(t, y); tol = 1e-6; % 替换为你的目标容差 epsilon = inf; % 初始设为无穷大,确保进入循环 while abs(epsilon) >= tol N = N * 2; % 建议区间数翻倍,比逐次+1收敛更快、变化更明显 t = linspace(t0, tf, N+1); y = L(t); I_new = trapz(t, y); epsilon = I_new - I; I = I_new; end
额外建议
- 用
linspace(t0, tf, N+1)生成网格比t0:tstep:tf更可靠,避免浮点数精度问题导致最后一个点不等于tf。 - 若
L(t)只能处理标量,可改用y = arrayfun(@L, t)生成函数值数组。
内容的提问来源于stack exchange,提问作者stefano.sil
相关产品推荐
相关产品推荐

