对于我的计算课程,我有以下功能:
y'(x) = -8y(x) + 0.5x + 1/16
,初始值为y(0)=2
。
现在,我被要求在MATLAB中使用Euler的方法来解决这个等式。
我的代码应该提供2个数组的输出: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
有人可以解释我的代码有什么问题吗?
答案 0 :(得分:1)
首先,请注意在功能块中分配参数参数是错误的! (即a
,b
,ybouco
和N
)应通过调用函数传递参数。除了手动在脚本中分配参数之外,用户还可以分配写入参数。
一种方法是调用函数并在命令窗口中分配值,如下所示:
[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
然后通过在命令窗口中调用该函数,您将得到以下结果:
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,您将获得更准确的结果和如下的平滑图表:
答案 1 :(得分:0)
错误消息是因为您有作业
y(x) = 2*exp(-8*x)+(1/16)*x;
其中未定义x
。 x
中的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);