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

Matlab矩形法求积分结果异常:预期约20却得29.5,求排查

问题分析与修正

你的矩形法积分代码存在几个关键问题,导致结果偏离预期值(该积分的精确值约为20.415,和你提到的“约20”接近),下面逐一拆解问题并给出修正方案:

1. 迭代次数n未正确设置

你把n初始设为0,这会直接导致循环for i=0:n-1跳过执行(因为0到-1的区间不成立),但你得到了29.5的结果,推测你实际运行时可能修改过n的值,但无论如何,n的正确取值应该是区间内的总步数:

n = (b - a)/h; % 计算[1,10]区间内、步长0.25的总步数,结果为36

2. 循环内未更新采样点xn

你只在循环外计算了一次xn = a + (n * h),这会导致每次循环都累加同一个函数值(对应x=10的点,√10≈3.1623,3.1623360.25≈28.46,和你的29.5结果接近,可能你实际把n设成了37)。正确的做法是在每次循环中计算当前区间的采样点:

  • 左矩形法:取每个区间的左端点a + i*h
  • 右矩形法:取每个区间的右端点a + (i+1)*h

3. 语法细节优化

变量定义语句末尾建议加分号,避免Matlab输出冗余信息;另外用sqrt(x)替代x^(1/2)会更稳定(尤其处理负数场景时,不过这里x都是正数,影响不大)。


修正后的代码示例

左矩形法实现

f = @(x) sqrt(x); % 定义被积函数
a = 1;
b = 10;
h = 0.25;
n = (b - a)/h; % 计算总步数
s = 0;

for i = 0:n-1
    xn = a + i*h; % 取当前区间左端点
    s = s + f(xn);
end

rectangle_result = h * s;
disp(rectangle_result); % 输出结果约为19.91

右矩形法实现

f = @(x) sqrt(x);
a = 1;
b = 10;
h = 0.25;
n = (b - a)/h;
s = 0;

for i = 0:n-1
    xn = a + (i+1)*h; % 取当前区间右端点
    s = s + f(xn);
end

rectangle_result = h * s;
disp(rectangle_result); % 输出结果约为20.91

如果想要更接近精确值的中点矩形法,也可以这样实现:

f = @(x) sqrt(x);
a = 1;
b = 10;
h = 0.25;
n = (b - a)/h;
s = 0;

for i = 0:n-1
    xn = a + i*h + h/2; % 取当前区间中点
    s = s + f(xn);
end

rectangle_result = h * s;
disp(rectangle_result); % 输出结果约为20.41,几乎和精确值一致

内容的提问来源于stack exchange,提问作者Waleed Al-khatib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:25:28