MATLAB 中的欧拉方法:代码不起作用
Euler's method in MATLAB: code doesn't work
对于我的计算机课程,我获得了以下功能:
y'(x) = -8y(x) + 0.5x + 1/16
和 y(0)=2
的初始值。
现在,我被要求在 MATLAB 中使用欧拉法求解这个方程。
我的代码应该给出 2 个数组的输出:xar
和 yar
,其中我看到 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参数是错误的! (即 a
、b
、ybouco
和 N
)应该通过调用函数来传递参数。除了在脚本中手动分配参数外,编写由用户分配的参数没有任何用处。
一种方法是调用函数并在 命令中赋值 window,如下所示:
[x,y]=Euler(0,3,2,10)
其中 a=0
、b=3
、ybouco=2
和 N=10
作为输入传递给函数,并返回 x
和 y
通过函数作为输出。
此外,当您数值 求解 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);
对于我的计算机课程,我获得了以下功能:
y'(x) = -8y(x) + 0.5x + 1/16
和 y(0)=2
的初始值。
现在,我被要求在 MATLAB 中使用欧拉法求解这个方程。
我的代码应该给出 2 个数组的输出:xar
和 yar
,其中我看到 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参数是错误的! (即 a
、b
、ybouco
和 N
)应该通过调用函数来传递参数。除了在脚本中手动分配参数外,编写由用户分配的参数没有任何用处。
一种方法是调用函数并在 命令中赋值 window,如下所示:
[x,y]=Euler(0,3,2,10)
其中 a=0
、b=3
、ybouco=2
和 N=10
作为输入传递给函数,并返回 x
和 y
通过函数作为输出。
此外,当您数值 求解 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);