% 求微分方程:Euler法
clear
clc
close all

x_in=3; %要求点的自变量值；
y=@(x)exp(-0.5*x.^2); %精确值
x=0:0.001:x_in;

h=0.001;
x0=0;
m=(x_in-x0)/h;
yy=zeros(1,m+1);
yy(1)=1; %初始条件；
xx=x0:h:x0+m*h;

for n=1:m   %Euler method
%    xx(n)=x0+(n-1)*h;
    yy(n+1)=yy(n)-h*xx(n)*yy(n);
end
%xx(m+1)=x0+m*h;

subplot(2,1,1);plot(x,y(x),'r',xx,yy,'b')
legend('精确解','Euler法')
xlabel('x')
ylabel('y')
title('采用Euler法求解常微分方程的初值问题')

xx=x0:h:x0+m*h;
subplot(2,1,2);plot(xx,y(xx)-yy(fix((xx-x0)/h)+1),'r')
xlabel('x')
ylabel('error')
title('Euler法的误差')
%注意fix是去尾法取整函数，round是四舍五入取整函数，ceil(x)是取大于x的最小整数

fprintf('y(x_in)的精确值为：%f\n',y(x_in));
fprintf('Euler法求得的值为：%f\n',yy(m+1));
error=y(x_in)-yy(m+1);
fprintf('Euler法误差为：%f\n',error);



