% 例题3-1：求微分方程:Euler法、泰勒级数法
clear
clc;close all
format long

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

h=0.1;
x0=0;
m=(x_in-x0)/h;
xx=x0:h:x0+m*h;
%%%%%%%%%%Euler法%%%%%%%%%%%%%%%%%%%
yy=zeros(1,m+1);
yy(1)=1;
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;

%%%%%%%%%%泰勒级数法%%%%%%%%%%%%%%%%%%%
yyy=zeros(1,m+1);
yyy(1)=1;
for n=1:m
    yyy(n+1)=yyy(n)-h*xx(n)*yyy(n)+0.5*h^2*(-yyy(n)+xx(n)^2*yyy(n));
end
figure;plot(x,y(x),'r',xx,yy,'b',xx,yyy,'k') %画Euler法与泰勒级数法结果
legend('精确解','Euler法','泰勒级数法')
xlabel('x')
ylabel('y')
title('采用Euler法和泰勒级数法求解常微分方程的初值问题')


figure; plot(xx,y(xx)-yy,'r',xx,y(xx)-yyy,'b')
legend('Euler法','泰勒级数法')
xlabel('x')
ylabel('error')
title('Euler法和泰勒级数法的误差')

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

