我在matlab中编写了euler方法的代码,现在我必须绘制近似值和精确结果。问题是我不知道如何介绍分析解决方案并将其绘制出来。我做了这个,但是没用。
function [t,w] = euler (f,y0,a,b,h) %func=f(x,y)=dy/dx
%a and b the interval ends
%h=distance between partitions
%y0= initial value
s=input('Give an equation in x: ','s'); %the solution of the ODE
n=(b-a)/h;
t=zeros(1,n+1);
w=zeros(1,n+1);
t(1)=a;
w(1)=y0;
for i=1:n
w(i+1)=w(i)+h*f(t(i),w(i));
t(i+1)=a+h*i;
end
w
x=a:h:b;
y=s;
plot(x,y,'k')
hold on
plot(t,w,'r')
hold off
endfunction
解析解为y = -x-1 + 2 * exp(x),ODE为y'= x + y。
答案 0 :(得分:0)
显式的euler方法并非无条件稳定,因此请确保选择足够小的时间步进行测试。我几乎没有更改您代码中的任何内容,但是我需要使它更具可读性。如果问题仍然存在,请上传剧情的屏幕截图。
function [x,y] = euler(y0,a,b,h)
% Left out f for algorithm test!
% a and b the interval ends
% h=distance between partitions ~
% y0= initial value
s=@(x) 2*exp(x) - (x+1);
f=@(x,y) x + y;
%s=input('Give an equation in x: ','s'); %the solution of the ODE
x = a:h:b;
n=length(x);
y=zeros(n,1);
y(1)=y0;
for i=1:n-1
y(i+1)=y(i)+h*f(x(i),y(i));
end
plot(x,s(x),'k')
hold on
plot(x,y,'r')
hold off
endfunction
我建议您坚持使用尽可能少的变量。尽量不要将时域和时域混在一起,函数常常依赖于两者,然后将y(x)与时间步长混为一谈。
现在应该可以解决了。请注意,y0必须在给定的a值上匹配解决方案函数的一点。
s(a)= y0
干杯
巴勃罗