用显式欧拉格式和改进的欧拉格式求解常微分初值问题
2016-11-28 20:00
453 查看
一.实验内容
二.实验代码
1.欧拉格式
(1)先建立m文件,命名为fun.m ,输入代码如下:
function z=fun(x,y);
z=y-2*x./y;
(2)在MATLAB中建立M文件Euler.m,输入代码如下:
function ym=Euler(xn,yn,h)
ym=yn+h*f(xn,yn);
(3) 在MATLAB中建立M文件useEuler.m,输入代码如下:
function [x,y]=useEuler(x0,x1,y0,h)
n=floor((x1-x0)/h+0.5);
x=zeros(n+1,1);
y=zeros(n+1,1);
x(1)=x0;
y(1)=y0;
for i=2:n+1
x(i,1)=x(i-1,1)+h;
y(i,1)=Euler(x(i-1,1),y(i-1,1),h);
End
(4)画图
x0=0;
x1=1;
y0=1;
h=0.1;
[x,y]=useEuler(x0,x1,y0,h);
plot(x,y);
yy=sqrt(2*x+1);
plot(x,yy,'b.');
2.改进的Euler格式
(1) 在MATLAB中建立M文件f.m,输入代码如下:
function z=f(x,y)
z=y-2*x./y;
(2) 在MATLAB中建立M文件improveEuler.m,输入代码如下:
function ym=improveEuler(xn,yn,ys,h)
ym=yn+h.*(f(xn,yn)+f(xn+h,ys))./2;
(3) i=1;
xn=a;
yn=b;
ym=y(2);
while i<n
ys=improveEuler(xn,yn,ym,h);
i=i+1;
y2(i)=ys;
xn=xn+h;
yn=ys;
ym=y(i+1);
end
ys=improveEuler(xn,yn,ym,h);
y2(n+1)=ys;
(4)在MATLAB中建立M文件useimproveEuler.m,输入代码如下:
function [x,y,y2]=useimproveEuler(a,b,h,n)
i=1;
xn=a;
yn=b;
x=zeros(n+1,1);
y=zeros(n+1,1);
y2=zeros(n+1,1);
x(1)=a;
y(1)=b;
y2(1)=b;
while i<=n
ym=Euler(xn,yn,h);
i=i+1;
xn=xn+h;
x(i)=xn;
yn=ym;
y(i)=yn;
end
(4)画图
a=0;
b=1;
h=0.1;
n=10;
[x,y2]=useimproveEuler(a,b,h,n);
plot(x,y,'b.');
hold on;
plot(x,y2,'r-');
yy=sqrt(2.*x+1);
plot(x,yy,'g-');
三.实验结果
1. 欧拉格式
运行程序,得到如下图像:
其中点表示欧拉格式迭代得到的数值解,绿线表示真实解。
2.改进的欧拉格式
其中红线表示改进的欧拉格式得到数值解,绿线表示真实解。
二.实验代码
1.欧拉格式
(1)先建立m文件,命名为fun.m ,输入代码如下:
function z=fun(x,y);
z=y-2*x./y;
(2)在MATLAB中建立M文件Euler.m,输入代码如下:
function ym=Euler(xn,yn,h)
ym=yn+h*f(xn,yn);
(3) 在MATLAB中建立M文件useEuler.m,输入代码如下:
function [x,y]=useEuler(x0,x1,y0,h)
n=floor((x1-x0)/h+0.5);
x=zeros(n+1,1);
y=zeros(n+1,1);
x(1)=x0;
y(1)=y0;
for i=2:n+1
x(i,1)=x(i-1,1)+h;
y(i,1)=Euler(x(i-1,1),y(i-1,1),h);
End
(4)画图
x0=0;
x1=1;
y0=1;
h=0.1;
[x,y]=useEuler(x0,x1,y0,h);
plot(x,y);
yy=sqrt(2*x+1);
plot(x,yy,'b.');
2.改进的Euler格式
(1) 在MATLAB中建立M文件f.m,输入代码如下:
function z=f(x,y)
z=y-2*x./y;
(2) 在MATLAB中建立M文件improveEuler.m,输入代码如下:
function ym=improveEuler(xn,yn,ys,h)
ym=yn+h.*(f(xn,yn)+f(xn+h,ys))./2;
(3) i=1;
xn=a;
yn=b;
ym=y(2);
while i<n
ys=improveEuler(xn,yn,ym,h);
i=i+1;
y2(i)=ys;
xn=xn+h;
yn=ys;
ym=y(i+1);
end
ys=improveEuler(xn,yn,ym,h);
y2(n+1)=ys;
(4)在MATLAB中建立M文件useimproveEuler.m,输入代码如下:
function [x,y,y2]=useimproveEuler(a,b,h,n)
i=1;
xn=a;
yn=b;
x=zeros(n+1,1);
y=zeros(n+1,1);
y2=zeros(n+1,1);
x(1)=a;
y(1)=b;
y2(1)=b;
while i<=n
ym=Euler(xn,yn,h);
i=i+1;
xn=xn+h;
x(i)=xn;
yn=ym;
y(i)=yn;
end
(4)画图
a=0;
b=1;
h=0.1;
n=10;
[x,y2]=useimproveEuler(a,b,h,n);
plot(x,y,'b.');
hold on;
plot(x,y2,'r-');
yy=sqrt(2.*x+1);
plot(x,yy,'g-');
三.实验结果
1. 欧拉格式
运行程序,得到如下图像:
其中点表示欧拉格式迭代得到的数值解,绿线表示真实解。
2.改进的欧拉格式
其中红线表示改进的欧拉格式得到数值解,绿线表示真实解。
相关文章推荐
- 改进的欧拉格式求解一阶微分的初值问题
- 经典格式式求解一阶微分的初值问题
- 快速排序的两种改进方法算法及topK问题求解
- 动态规划算法求解硬币找零问题改进与优化(Java)
- 四阶龙格-库塔法求解常微分方程的初值问题-matlab通用程序
- 间断初值双曲守恒问题的Lax-Friedrichs和后向欧拉数值解法
- C语言初步-第39讲:问题求解——求素数(输出格式控制)
- 求解常微分方程初值问题之改进Euler法:预报-校正公式
- 阿当姆斯方法求解微分方程初值问题:四阶龙格库塔提供出发值(C语言)
- 亚当姆斯预报_校正系统解一阶微分的初值问题
- 四阶龙格-库塔法求解常微分方程的初值问题
- 数值计算方法 求解初值问题(伪代码 c/c++ python)
- 常用守恒格式求解双曲问题(Lax-Friedrichts、local Lax-F、Roe、Engquist-Osher、Godunov、Lax-Wendroff)
- 问题的解决与改进
- 求解在SQL中使用了where列所遇到的问题
- 数据结构:栈和队列-迷宫问题求解
- 回溯法求解8皇后问题(转帖)
- 关于Oracle9i日期格式几点要说明的问题
- 解决DataGrid显示时间格式问题
- 以前的作业:八皇后问题求解