【问题标题】:Calculating Errors of the Trapezoidal Rule in MATLAB在 MATLAB 中计算梯形规则的误差
【发布时间】:2014-06-19 11:01:44
【问题描述】:

我正在尝试计算误差如何取决于梯形规则的步长 h。 h 值越小,误差应该越小,但对我来说这不会发生。这是我的代码:

Iref 是分别用 Simpson 方法和 MATLAB 函数 quad 计算和验证的参考值

for h = 0.01:0.1:1
    x = a:h:b;
    v = y(x);
    Itrap = (sum(v)-v(1)/2-v(end)/2)*h;
    Error = abs(Itrap-Iref)
end

我认为我使用 h 的方式有问题,因为梯形规则适用于已知积分。如果有人可以帮助我,我会非常高兴,因为我不明白为什么错误会以这种方式“跳来跳去”。

【问题讨论】:

  • 首先请注意,您的黎曼和作为 h->0 的收敛不是“单调”的,因为没有更好的词。接下来是——你能解释一下你计算Iref的方法吗?辛普森的方法和quad“验证”是什么意思?两者都是近似值。请澄清。无论如何,请让数学问题一清二楚。 SO 用于编程问题。

标签: matlab numerical-methods


【解决方案1】:

我想知道问题的一部分是否可能是因为 x 的构造方式,并非所有间隔(对于每个步长 h)都具有相同的 a 和 b。使用附加的 fprintf 语句尝试以下操作:

for h = 0.01:0.1:1
    x = a:h:b;
    fprintf('a=%f  b=%f\n',x(1),x(end));
    v = y(x);
    Itrap = (sum(v)-v(1)/2-v(end)/2)*h;
    Error = abs(Itrap-Iref);
end

根据您的a 和b(我选择a=0 和b=5),所有a 值都是相同的(如预期的那样),但b 从4.55 到5.0 不等。

我认为您总是希望为您选择的每个步长保持间隔 [a,b] 相同,以便在每次迭代之间进行更好的比较。因此,与其迭代步长,不如迭代n,即[a,b] 内等距子区间的数量。

而不是

for h = 0.01:0.1:1
    x = a:h:b;     

你可以做更多类似的事情

% iterate over each value of n, chosen so that the step size
% is similar to what you had before
for n = [501 46 24 17 13 10 9 8 7 6]

    % create an equally spaced vector of n numbers between a and b
    x = linspace(a,b,n);

    % get the step delta
    h = x(2)-x(1);

    v = y(x);
    Itrap = (sum(v)-v(1)/2-v(end)/2)*h;
    Error = abs(Itrap-Iref);

    fprintf('a=%f  b=%f len=%d h=%f Error=%f\n',x(1),x(end),length(x),h,Error);
end

当您评估上述代码时,您会注意到a 和b 对于每次迭代都是一致的,h 大致是您之前选择的,并且Error 确实会随着步长的增加而增加。

试试上面的,看看会发生什么!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 2014-02-04
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2015-06-21
    • 2018-11-17
    相关资源
    最近更新 更多