【问题标题】:How do I make a clear table between a function and iterations, in MATLAB?如何在 MATLAB 中在函数和迭代之间制作清晰的表格?
【发布时间】:2018-08-24 06:34:55
【问题描述】:

在我的计算课程中,我被要求使用 MATLAB 中的梯形规则来确定区间 (0,20) 上的函数长度。

抛物线由以下函数给出:

y(x) = 0.1x^2 -2*x + 16

我首先通过弧长积分计算长度,使用 y 的导数:y'(x) = 0.2x - 2 我取了sqrt(1+(0.2x - 2)^2) 的积分。答案应该大约是29,5

现在,我在 MATLAB 中有以下内容:

y = @(x) sqrt(1+(0.2*x-2)^2);
x0=input('enter the value of Initial Limit x0');  *which is 0*
xn=input('enter the value of Final Limit xn'); *which is 20*
N=input('enter the total number of areas');
h=((xn-x0)/N);
area=0;
while(x0<xn)
    area=area+(h/2)*(y(x0)+y(x0+h));
    x0=x0+h;
end

fprintf('mysol for L=%.16f',area);

现在,我被要求以N=200,400,800,1600... 的顺序增加已使用区域的数量N,直到达到一定的准确度。

如何获得一张整洁的表格,在其中可以看到我的 N 与我的长度?

【问题讨论】:

  • 我不知道您是否需要 1) 一种显示表格的方法,2) 一种计算所有值的方法 3) 两者。你能指定吗?
  • @AnderBiguri 好吧,我需要一个表,其中有一列 N 值,旁边是长度值的列。因为当我将 N 加倍时,我应该得到更好的长度精度。如何获得自动计算这些值的表格?
  • 只需为 N=[200,400,800,1600] 创建一个 for 循环并将结果(而不是打印)保存在数组中
  • @AnderBiguri 但我应该把 for 循环放在哪里?它说错误,因为 N 的尺寸与公式不符。
  • 朋友,你需要学习一些基本的编程。

标签: matlab numerical-integration


【解决方案1】:

你很亲密。您的代码仅处理 N 的 1 个值的情况。正如 Ander 上面提到的那样,只需将这段代码包装在一个循环中。我们看到N 的初始值为 200,但您需要不断将数字加倍,直到您的估计面积和预测误差小于一定数量。请注意,29.5 是对答案的低精度估计,因此N 的值将由该区域指导。我建议提高您的值的精度,以确保您获得正确的 N 值。

如果你参考Wolfram Alpha上的不定积分,我们得到以下表达式:

因此,我们可以在 MATLAB 中创建一个匿名函数,只需将 20 代入该函数并减去 0 即可找到定积分。

>> format long g;
>> f = @(x)((x^3 - 30*x^2 - 25*sqrt(x^2 - 20*x + 125)*asinh(2 - x/5) + 325*x - 1250) / (10*sqrt(x^2 -20*x + 125)));
>> est = f(20) - f(0)

est =

          29.5788571508919

est 包含真实值。现在我们终于可以修改你的代码了。您需要做的是,当您使用梯形规则估计面积时,您需要检查估计值和真实值是否小于误差容差的一部分。我们可以尝试1e-8 之类的方法,这大致意味着您将获得大约 8 位的准确度。

因此,将一个名为err 的变量设置为0.01,在循环中运行它,您需要在退出前检查误差的变化是否小于这个量。您还需要一个表格,我们可以在其中显示数字N、估计值、真实值以及最后看到的错误。我们可以在每次迭代时在循环内打印出来。另请注意,您在估计中更改了x0 的值,因此您需要在循环中每次重置x0

% Get true value of area
f = @(x)((x^3 - 30*x^2 - 25*sqrt(x^2 - 20*x + 125)*asinh(2 - x/5) + 325*x - 1250) / (10*sqrt(x^2 -20*x + 125)));
est = f(20) - f(0);

% Set the error
err = 1e-8;

% Function setup
y = @(x) sqrt(1+(0.2*x-2)^2);
x0 = 0; % Prior knowledge
xn = 20; % Prior knowledge
N = 200; % Initial value of N

% Print header of table
fprintf('%4s %11s %11s %10s\n', 'N', 'Estimated', 'True', 'Error');

while true % Start loop
    x0 = 0; % Reset each time
    h=((xn-x0)/N);
    area=0;
    while(x0<xn)
        area=area+(h/2)*(y(x0)+y(x0+h));
        x0=x0+h;
    end
    er = abs(area - est) / est; % Calculate error 

    % Print table entry       
    fprintf('%4d %.8f %.8f %.8f\n', N, area, est, er);

    % Check for convergence
    if er <= err
        break;
    end
    N = N * 2; % Double N for the next iteration
end

当你运行它时,我得到了这个表:

   N   Estimated        True      Error
 200 29.57915529 29.57885715 0.00001008
 400 29.57893169 29.57885715 0.00000252
 800 29.63483340 29.57885715 0.00189244
1600 29.60682664 29.57885715 0.00094559
3200 29.57885832 29.57885715 0.00000004
6400 29.57885744 29.57885715 0.00000001

因此,这告诉我们使用N = 6400,这将为我们提供1e-8 所需的错误预算。这应该足以让你开始。祝你好运!

【讨论】:

    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多