如何在 MATLAB 中明确 table 函数和迭代之间的关系?

How do I make a clear table between a function and iterations, in MATLAB?

在我的计算机课程中,要求我使用 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,直到我达到一定的准确度。

我如何得到一个整洁的 table,我可以在其中看到我的 N 与我的长度?

你们很亲近。您的代码仅处理 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,运行这个,你需要在退出前检查错误的变化是否小于这个数量。您还需要一个 table,我们可以在其中显示数字 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

当你运行这个,我得到这个table:

   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 所需的错误预算。这应该足以让你开始。祝你好运!