MATLAB 中的欧拉方法:代码不起作用

Euler's method in MATLAB: code doesn't work

对于我的计算机课程,我获得了以下功能: y'(x) = -8y(x) + 0.5x + 1/16y(0)=2 的初始值。

现在,我被要求在 MATLAB 中使用欧拉法求解这个方程。

我的代码应该给出 2 个数组的输出:xaryar,其中我看到 x 值与 y 值,但是,如果我 运行 我的代码,它会显示:"undefined variable x"。这是我的代码:

function [xar,yar] =  Euler(a,b,ybouco,N)
% a is the lower limit
% b is the upper limit
% ybouco is the initial value
% N is the number of intervals

a=0;
b=3;
ybouco=2;
N=10;
h=(b-a)/N;
T=a:h:b;

y(1)=ybouco;

f = @(x) -8*y(x) + 0.5x + (1/16);
y(x) = 2*exp(-8*x)+(1/16)*x;

for i = 1:N

y (i+1) = y(i)+h*f(T(i));

end

end

有人可以解释我的代码有什么问题吗??

首先要注意,在函数块中赋argument参数是错误的! (即 abyboucoN)应该通过调用函数来传递参数。除了在脚本中手动分配参数外,编写由用户分配的参数没有任何用处。

一种方法是调用函数并在 命令中赋值 window,如下所示:

[x,y]=Euler(0,3,2,10)

其中 a=0b=3ybouco=2N=10 作为输入传递给函数,并返回 xy通过函数作为输出。

此外,当您数值 求解 ODE 时,这意味着您不知道y 分析。

所以你应该省略代码的分配部分并做如下的小改动:

function [xar,yar] =  Euler(a,b,ybouco,N)
h=(b-a)/N;
T=a:h:b;
y(1)=ybouco;
for i = 1:N
    f(i) = -8*y(i) + 0.5*T(i) + (1/16);
    y(i+1) = y(i)+h*f(i);
end
xar=T;
yar=y;
end

然后调用window命令中的函数,会得到如下结果:

x =

  Columns 1 through 8

         0    0.3000    0.6000    0.9000    1.2000    1.5000    1.8000    2.1000

  Columns 9 through 11

    2.4000    2.7000    3.0000

y =

  Columns 1 through 8

    2.0000   -2.7813    3.9575   -5.4317    7.7582  -10.6627   15.1716  -20.9515

  Columns 9 through 11

   29.6658  -41.1533   58.0384

你也可以plot结果得到下图:

如果将 N 从 10 增加到 100,您将获得更准确的结果和如下所示的平滑图表:

错误信息是因为你有作业

y(x) = 2*exp(-8*x)+(1/16)*x;

其中 x 未定义。 y(x) 中的 x 索引到数组 y.

也许你打算写

y = @(x) 2*exp(-8*x)+(1/16)*x;

定义一个匿名函数。但这会与您已经定义的数组 y 发生冲突。也许只是删除这一行?

此外,

h=(b-a)/N;
T=a:h:b;

最好写成

T = linspace(a,b,N);