欧拉';MATLAB中的s方法:代码不';行不通

欧拉';MATLAB中的s方法:代码不';行不通,matlab,ode,Matlab,Ode,在我的计算机课程中,我被赋予以下功能: y'(x)=-8y(x)+0.5x+1/16,初始值为y(0)=2 现在,我被要求在MATLAB中用欧拉方法求解这个方程 我的代码应该给出两个数组的输出:xar和yar,其中我看到了x-值和y-值,但是,如果我运行代码,它会说:“未定义的变量x”。这是我的密码: function [xar,yar] = Euler(a,b,ybouco,N) % a is the lower limit % b is the upper limit % ybouco i

在我的计算机课程中,我被赋予以下功能:
y'(x)=-8y(x)+0.5x+1/16
,初始值为
y(0)=2

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

我的代码应该给出两个数组的输出:
xar
yar
,其中我看到了
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

有人能解释一下我的代码有什么问题吗?

首先,请注意,在函数块中指定参数是错误的!(即
a
b
ybouco
N
)应通过调用函数通过参数传递。除了在脚本中手动分配参数外,编写由用户分配的参数没有任何用处

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

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,y]=Euler(0,3,2,10)

其中,
a=0
b=3
ybouco=2
N=10
作为输入传递给函数,函数作为输出返回
x
y

另外,当你在数值上求解一个常微分方程时,这意味着你不知道解析的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
您还可以
绘制
结果并获得以下图表:

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

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

错误消息是因为您有工作分配

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);

消息错误是不言自明的。。。在初始化之前,您正在使用一个
x
变量。。错误消息还应说明哪一行存在错误,以便您可以轻松更正。
0.5x
在MATLAB中无效。您将
N
作为参数,但您指定了
N=10
,这是为什么?