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

时间:2018-03-24 15:51:52

标签: matlab ode

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

现在,我被要求在MATLAB中使用Euler的方法来解决这个等式。

我的代码应该提供2个数组的输出:xaryar,其中我看到x - 值与y - 值,但是,如果我运行我的代码,它会说:"未定义的变量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

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

2 个答案:

答案 0 :(得分:1)

首先,请注意在功能块中分配参数参数是错误的! (即abyboucoN)应通过调用函数传递参数。除了手动在脚本中分配参数之外,用户还可以分配写入参数。

一种方法是调用函数并在命令窗口中分配值,如下所示:

[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

然后通过在命令窗口中调用该函数,您将得到以下结果:

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结果并获取以下图表:

enter image description here

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

enter image description here

答案 1 :(得分:0)

错误消息是因为您有作业

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

其中未定义xx中的y(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);