欧拉及改进的欧拉法求解常微分方程

欧拉及改进的欧拉法求解常微分方程
欧拉及改进的欧拉法求解常微分方程

生物信息技术0801 徐聪U200812594

#include

#include

void f1(double *y,double *x,double *yy)

{

y[0]=2.0;

x[0]=0.0;

yy[0]=2.0;

for(int i=1;i<=9;i++)

{

x[i]=x[i-1]+0.2;

y[i]=y[i-1]+0.2*(y[i-1]-x[i-1]);

yy[i]=x[i]+1+exp(x[i]);

printf("若x=%f,计算值是%f,真实值是%f,截断误差是%f\n ",x[i],y[i],yy[i],y[i]-yy[i]);

}

};

void f2(double *y,double *x,double *yy)

{

y[0]=1.0;

x[0]=0.0;

yy[0]=1.0;

for(int i=1;i<=9;i++)

{

x[i]=x[i-1]+0.2;

y[i]=y[i-1]+0.2*(2*y[i-1]+x[i-1]*x[i-1]);

yy[i]=-0.5*(x[i]*x[i]+x[i]+0.5)+1.25*exp(2*x[i]);

printf("若x=%f,计算值是%f,真实值是%f,截断误差是%f\n ",x[i],y[i],yy[i],y[i]-yy[i]);

}

};

void f3(double *y,double *x,double *yy,double *y0)

{

y[0]=2.0;

x[0]=0.0;

yy[0]=2.0;

for(int i=1;i<=9;i++)

{

x[i]=x[i-1]+0.2;

y0[i]=y[i-1]+0.2*(y[i-1]-x[i-1]);

y[i]=y[i-1]+0.1*(y[i-1]-x[i-1]+y0[i-1]-x[i-1]);

yy[i]=x[i]+1+exp(x[i]);

printf("若x=%f,计算值是%f,真实值是%f,截断误差是%f\n ",x[i],y[i],yy[i],y[i]-yy[i]);

}

};

void f4(double *y,double *x,double *yy,double *y0)

{

y[0]=1.0;

x[0]=0.0;

yy[0]=1.0;

for(int i=1;i<=9;i++)

{

x[i]=x[i-1]+0.2;

y0[i]=y[i-1]+0.2*(2*y[i-1]+x[i-1]*x[i-1]);

y[i]=y[i-1]+0.1*(2*y0[i-1]+x[i-1]*x[i-1]+2*y[i-1]+x[i-1]*x[i-1]);

yy[i]=-0.5*(x[i]*x[i]+x[i]+0.5)+1.25*exp(2*x[i]);

printf("若x=%f,计算值是%f,真实值是%f,截断误差是%f\n ",x[i],y[i],yy[i],y[i]-yy[i]);

}

};

void main()

{

double y[10],x[10],yy[10],y0[10];

printf("\n常微分方程组是y'=y-x and y(0)=2采用欧拉法求解得\n");

f1(y,x,yy);

printf("\n常微分方程组是y'=x*x+2y and y(0)=1采用欧拉法求解得\n");

f2(y,x,yy);

printf("\n常微分方程组是y'=y-x and y(0)=2采用欧拉改进法求解得\n");

f1(y,x,yy);

printf("\n常微分方程组是y'=x*x+2y and y(0)=1采用欧拉改进法求解得\n");

f1(y,x,yy);

}

常微分方程作业欧拉法与改进欧拉法

P77 31.利用改进欧拉方法计算下列初值问题,并画出近似解的草图:dy + =t = t y y ≤ ≤ ,2 ;5.0 0,3 )0( )1(= ,1 ? dt 代码: %改进欧拉法 function Euler(t0,y0,inv,h) n=round(inv(2)-inv(1))/h; t(1)=t0; y(1)=y0; for i=1:n y1(i+1)=y(i)+h*fun(t(i),y(i)); t(i+1)=t(i)+h; y(i+1)=y(i)+1/2*h*(fun(t(i),y(i))+ fun(t(i+1),y1(i+1))) end plot(t,y,'*r') function y=fun(t,y); y=y+1; 调用:Euler(0,3,[0,2],0.5) 得到解析解:hold on; y=dsolve('Dy=y+1','(y(0)=3)','t'); ezplot(y,[0,2]) 图像:

dy y =t - t y ;2.0 t = ≤ )0( 0,5.0 ,4 )2(2= ≤ ? ,2 dt 代码: function Euler1(t0,y0,inv,h) n=round(inv(2)-inv(1))/h; t(1)=t0; y(1)=y0; for i=1:n y1(i+1)=y(i)+h*fun(t(i),y(i)); t(i+1)=t(i)+h; y(i+1)=y(i)+1/2*h*(fun(t(i),y(i))+ fun(t(i+1),y1(i+1))) end plot(t,y,'*r') function y=fun(t,y); y=y^2-4*t; 调用: Euler1(0,0.5,[0,2],0.2) 图像:

欧拉及改进的欧拉法求解常微分方程

生物信息技术0801 徐聪U200812594 #include #include void f1(double *y,double *x,double *yy) { y[0]=2.0; x[0]=0.0; yy[0]=2.0; for(int i=1;i<=9;i++) { x[i]=x[i-1]+0.2; y[i]=y[i-1]+0.2*(y[i-1]-x[i-1]); yy[i]=x[i]+1+exp(x[i]); printf("若x=%f,计算值是%f,真实值是%f,截断误差是%f\n ",x[i],y[i],yy[i],y[i]-yy[i]); } }; void f2(double *y,double *x,double *yy) { y[0]=1.0; x[0]=0.0; yy[0]=1.0; for(int i=1;i<=9;i++) { x[i]=x[i-1]+0.2; y[i]=y[i-1]+0.2*(2*y[i-1]+x[i-1]*x[i-1]); yy[i]=-0.5*(x[i]*x[i]+x[i]+0.5)+1.25*exp(2*x[i]); printf("若x=%f,计算值是%f,真实值是%f,截断误差是%f\n ",x[i],y[i],yy[i],y[i]-yy[i]); } }; void f3(double *y,double *x,double *yy,double *y0) { y[0]=2.0; x[0]=0.0; yy[0]=2.0; for(int i=1;i<=9;i++) { x[i]=x[i-1]+0.2; y0[i]=y[i-1]+0.2*(y[i-1]-x[i-1]); y[i]=y[i-1]+0.1*(y[i-1]-x[i-1]+y0[i-1]-x[i-1]);

常微分方程的Euler解法

毕业论文 题目:常微分方程的Euler解法 及其程序设计 学院:数学与信息科学学院 专业:数学与应用数学 毕业年限: 2011年6月 学生: 学号: 指导教师:

常微分方程的Euler解法及其程序设计 摘要本文总结了常微分方程的Euler解法,对各种格式给出了误差估计,设计了这些格式的计算程序. 关键词常微分方程;Euler解法;误差分析;程序设计 Euler Method of Ordinary Differential Equation and Its Programming Abstract Euler method of ordinary differential equation is summarized,the error of each format is analyzed and its programming is designed in this paper. Keywords Ordinary differential equation; Euler method; Error analysis; Programming

科学技术中常常需要求解常微分方程的定解问题,这类问题最简单的形式,即为微分方程 (,)dy f x y dx = (1) 的初值问题 00(,),(). dy f x y dx y x y ?=???=? (2) 定理 (存在与唯一性定理)如果方程(1)的右端函数(,)f x y 在闭矩形域 000000:,R x a x x a y b y y b -≤≤+-≤≤+ 上满足如下条件: (1)在R 上连续; (2)在R 上关于变量y 满足利普希茨(Lipschitz )条件,即存在常数L ,使 对于R 上任何一对点(,)x y 和(,)x y 有不等式: (,)(,)f x y f x y L y y -≤-, 则初值问题(2)在区间00000x h x x h -≤≤+上存在唯一解 00(),()y y x y x y ==, 其中0(,)min(,),max (,)x y R b h a M f x y M ∈==. 根据存在与唯一性定理,只要(,)f x y 关于y 满足Lipschitz 条件 (,)(,)f x y f x y L y y -≤-, 即可保证其解()y y x =存在并唯一. 然而解析方法只能用来求解少数较简单和典型的常微分方程,例如线性常系数微分方程等,对于变系数常微分方程的解析求解就比较困难,而一般的非线性常微分方程就更不用说,因此,在大多数情况下,实际问题中归结出来的微分方程主要靠数值解法求解.

用Euler法、改进的Euler法及四阶的龙格库塔法求解初值问题

微分方程数值解课程设计题目 1(30分)分别用Euler 法、改进的Euler 法及四阶的龙格库塔 法求解初值问题:????? =- =1 )0(2'u u t u u 1 0≤> Euler('fun',0,1,0.1,10) T = Columns 1 through 10 0 0.1000 0.2000 0.3000 0.4000 0.5000 0.6000 0.7000 0.8000 0.9000 1.0000 1.1000 1.1918 1.2774 1.3582 1.4351 1.5090 1.5803 1.6498 1.7178 Column 11 1.0000 1.7848 ②.当h=0.2时 >> Euler('fun',0,1,0.2,5) T = 0 0.2000 0.4000 0.6000 0.8000 1.0000 1.0000 1.2000 1.3733 1.5315 1.6811 1.8269 (3).改进的Euler 法: M 文件:Euler_modify.m function E=Euler_modify(fun,x0,y0,h,N) x=zeros(1,N+1);y=zeros(1,N+1);

实验8欧拉法_改进欧拉法_线性多步法

西华数学与计算机学院上机实践报告 课程名称:计算方法A 年级:2010级 上机实践成绩: 指导教师:严常龙 姓名:李国强 上机实践名称:解常微分方程初值问题 学号:362011********* 上机实践日期:2013.12.25 上机实践编号:8 上机实践时间:14:00 一、目的 1.通过本实验加深对欧拉法、改进欧拉法、线性多步法的构造过程的理解; 2.能对上述四种方法提出正确的算法描述编程实现,观察计算结果的改善情况。 二、内容与设计思想 自选常微分方程的初值问题,分别用欧拉法、改进欧拉法求解。 分别用以上两种方法求解常微分方程初值问题: 2 '()1,([0.0,1.4],0.1)(0)0.0 y x y h y ?=+=?=?求解区间取步长 三、使用环境 操作系统:Win 8 软件平台:Visual C++ 6.0 四、核心代码及调试过程 #include #include #define f(y) (y*y+1) #define m 0.0//初值为0 #define h 0.1//步长为0.1 #define n 14//迭代次数为14 #define a 0.0//定义区间长度 #define d 1.4 void gjol();//改进欧拉法 void ol();//欧拉法 main() { ol(); printf("\n"); gjol(); } void gjol() {

int i; float y[n+1]; y[0]=m;//赋初值 printf("改进欧拉法\n"); for(i=0;i

Euler法和改进的Euler法实验报告

用Euler法和改进的Euler法求u’=-5u(0≤t≤1),u(0)=1的数值解,步长h=0.1,0.05,并比较两个算法的精度。 解: 1)当步长h=0.1时 编写程序如下所示 clf clear clc %直接求解微分方程 y=dsolve('Dy=-5*y','y(0)=1','t') %Euler法 h=0.1; t=0:h:1; n=length(t); u=zeros(1,n); u(1)=1; zbu(1,1)=t(1); zbu(2,1)=u(1); for i=2:n f=-5*u(i-1); u(i)=u(i-1)+h*f; zbu(1,i)=t(i); zbu(2,i)=u(i); end zbu %改进的Euler法 v=zeros(1,n); v0=zeros(1,n); v(1)=1; zbv(1,1)=t(1); zbv(2,1)=v(1); for i=2:n f=-5*v(i-1); v0(i)=v(i-1)+h*f; v(i)=v(i-1)+h/2*(f-5*v0(i)); zbv(1,i)=t(i); zbv(2,i)=v(i); end zbv plot(t,u,'r*','markersize',10) hold on, plot(t,v,'r.','markersize',20)

hold on, ezplot(y,[0,1]) hold on, title('Euler法和改进的Euler法比较(h=0.1)), grid on legend('Euler法','?改进的Euler法','解析解') %解真值 h=0.1; t=0:h:1; n=length(t); for i=1:n y(i)=1/exp(5*t(i)); %通过第一部分程序直接解得的解析解 zby(1,i)=t(i); zby(2,i)=y(i); end zby 我们可以得到计算后的结果图像如图一所示 图1 Euler法和改进的Euler法比较(h=0.1) 同时,我们得到Euler法,改进的Euler法和解析解的在各点处数值分别如下所示: t坐标0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 改进欧拉 1.0000 0.6250 0.3906 0.2441 0.1526 0.0954 0.0596 0.0373 0.0233 0.0146 0.0091

第8章 常微分方程数值解法 本章主要内容: 1.欧拉法

第8章 常微分方程数值解法 本章主要内容: 1.欧拉法、改进欧拉法. 2.龙格-库塔法。 3.单步法的收敛性与稳定性。 重点、难点 一、微分方程的数值解法 在工程技术或自然科学中,我们会遇到的许多微分方程的问题,而我们只能对其中具有较简单形式的微分方程才能够求出它们的精确解。对于大量的微分方程问题我们需要考虑求它们的满足一定精度要求的近似解的方法,称为微分方程的数值解法。本章我们主要 讨论常微分方程初值问题?????==00 )() ,(y x y y x f dx dy 的数值解法。 数值解法的基本思想是:在常微分方程初值问题解的存在区间[a,b]内,取n+1个节点a=x 0<x 1<…<x N =b (其中差h n = x n –x n-1称为步长,一般取h 为常数,即等步长),在这些节点上把常微分方程的初值问题离散化为差分方程的相应问题,再求出这些点的上的差分方程值作为相应的微分方程的近似值(满足精度要求)。 二、欧拉法与改进欧拉法 欧拉法与改进欧拉法是用数值积分方法对微分方程进行离散化的一种方法。 将常微分方程),(y x f y ='变为() *+=?++1 1))(,()()(n x n x n n dt t y t f x y x y 1.欧拉法(欧拉折线法) 欧拉法是求解常微分方程初值问题的一种最简单的数值解法。 欧拉法的基本思想:用左矩阵公式计算(*)式右端积分,则得欧拉法的计算公式为:N a b h N n y x hf y y n n n n -= -=+=+)1,...,1,0(),(1 欧拉法局部截断误差 11121 )(2 ++++≤≤''=n n n n n x x y h R ξξ或简记为O (h 2)。

MATLAB Euler法解常微分方程

Euler 法解常微分方程 Euler 法解常微分方程算法: Step 1 分别取积分上限、积分下限、步长 Step 2计算h n n +=判断b n ≤是否成立,成立转到Step 3,否则继续进行Step 4 Step 3 计算),(1n n n n y x hf y y +=+ Step 4 ),(1n n n n y x hf y y +=+ Euler 法解常微分方程算程序: function euler2(fun,y0,A,h) %fun--y' %y0---初值 %A----x 取值范围 %a----x 左区间端点值 %b----x 右区间端点值 %h----给定步长 x=min(A); b=max(A); y=y0; while x

0.4613 指导教师: 年 月 日 改进Euelr 法解常微分方程 改进Euler 法解常微分方程算法: Step 1 分别取积分上限、积分下限、步长 Step 2 取一个以h 为步长,a ,b 分别为左右端点的矩阵 Step 3 (1)做显性Euler 预测),( 1n n i i y x hf y y +=+ (2)将1+i y 带入,(),([2h 11++++=i i i i i x f y x f y y Step 4计算h n n +=判断b n ≤是否成立,成立返回Step 5 )],(),([2h 111+++++=i i i i i i y x f y x f y y 改进Euler 法解常微分方程算程序: function gaijineuler2(fun,y0,A,h) %fun--y' %y0---初值 %A----x 取值范围 %a----x 左区间端点值 %b----x 右区间端点值 %h----给定步长 a=min(A); b=max(A); x=a:h:b; y(1)=y0; for i=1:length(x)-1 w1=feval(fun,x(i),y(i)); y(i+1)=y(i)+h*w1; w2=feval(fun,x(i+1),y(i+1)); y(i+1)=y(i)+h*(w1+w2)/2; end x=x'

MATLAB求解常微分方程数值解

利用MATLAB求解常微分方程数值解

目录 1. 内容简介 (1) 2. Euler Method(欧拉法)求解 (1) 2.1. 显式Euler法和隐式Euler法 (2) 2.2. 梯形公式和改进Euler法 (3) 2.3. Euler法实用性 (4) 3. Runge-Kutta Method(龙格库塔法)求解 (5) 3.1. Runge-Kutta基本原理 (5) 3.2. MATLAB中使用Runge-Kutta法的函数 (7) 4. 使用MATLAB求解常微分方程 (7) 4.1. 使用ode45函数求解非刚性常微分方程 (8) 4.2. 刚性常微分方程 (9) 5. 总结 (9) 参考文献 (11) 附录 (12) 1. 显式Euler法数值求解 (12) 2. 改进Euler法数值求解 (12) 3. 四阶四级Runge-Kutta法数值求解 (13) 4.使用ode45求解 (14)

1.内容简介 把《高等工程数学》看了一遍,增加对数学内容的了解,对其中数值解法比较感兴趣,这大概是因为在其它各方面的学习和研究中经常会遇到数值解法的问题。理解模型然后列出微分方程,却对着方程无从下手,无法得出精确结果实在是让人难受的一件事情。 实际问题中更多遇到的是利用数值法求解偏微分方程问题,但考虑到先从常微分方程下手更为简单有效率,所以本文只研究常微分方程的数值解法。把一个工程实际问题弄出精确结果远比弄清楚各种细枝末节更有意思,因此文章中不追求非常严格地证明,而是偏向如何利用工具实际求解出常微分方程的数值解,力求将课程上所学的知识真正地运用到实际方程的求解中去,在以后遇到微分方程的时候能够熟练运用MATLAB得到能够在工程上运用的结果。 文中求解过程中用到MATLAB进行数值求解,主要目的是弄清楚各个函数本质上是如何对常微分方程进行求解的,对各种方法进行MATLAB编程求解,并将求得的数值解与精确解对比,其中源程序在附录中。最后考察MATLAB中各个函数的适用范围,当遇到实际工程问题时能够正确地得到问题的数值解。 2.Euler Method(欧拉法)求解 Euler法求解常微分方程主要包括3种形式,即显式Euler法、隐式Euler法、梯形公式法,本节内容分别介绍这3种方法的具体内容,并在最后对3种方法精度进行对比,讨论Euler法的实用性。 本节考虑实际初值问题 使用解析法,对方程两边同乘以得到下式

fortran下欧拉法求解常微分方程(实例)

1. Euler 公式 100(,)() i i i i y y hf x y y y x +=+??=? 实例: ,00(,),0,1,01f x y x y x y x =-==≤≤ 精确解为:1x y x e -=+- 程序代码: DIMENSION x(0:20),y(0:20),z(0:20),k(0:21) DOUBLE PRECISION x,y,z,k,h,x0,y0,z0,k0,n f(x,y)=x-y n=20 h=1/n x(0)=0 y(0)=0 DO i=0,n-1 y(i+1)=y(i)+f(x(i),y(i))*h x(i+1)=x(i)+h ENDDO k(0)=0 DO i=0,n z(i)=k(i)+exp(-k(i))-1 k(i+1)=k(i)+h END DO open(10,file='1.txt') WRITE(10,10) (x(i),y(i),z(i),i=0,20) WRITE(*,10) (x(i),y(i),z(i),i=0,20) 10 FORMAT(1x,f10.8,2x,f10.8,2x,f10.8/) END 输出结果: 0.00000000 0.00000000 0.00000000 0.05000000 0.00000000 0.00122942 0.10000000 0.00250000 0.00483742 0.15000000 0.00737500 0.01070798 0.20000000 0.01450625 0.01873075 0.25000000 0.02378094 0.02880078 ???=='00)(),(y x y y x f y ???=='0 0)(),(y x y y x f y

常微分方程欧拉算法

常微分方程欧拉算法 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

常微分方程欧拉算法 摘要:本文主要论述了常微分方程的欧拉算法的算法原理,误差分析,实例,程序,以及算法比较等内容。 关键词:常微分方程 显式欧拉法 隐式欧拉法 引言:微分方程初值问题模型是常见的一类数学模型。对于一些简单而典型的微分方程模型,譬如线性方程、某些特殊的一阶非线性方程等是可以设法求出其解析解的,并有理论上的结果可资利用。但在数学建模中碰到的常微分方程初值问题模型,通常很难,甚至根本无法求出其解析解,而只能求其近似解。因此,研究其数值方法,以便快速求得数值鳃有其重大意义。 一、欧拉算法原理 对于微分方程初值问题 的解在xy 平面上是一条曲线,称为该微分方程的积分曲线。积分曲线上一点(),x y 的切线斜率等于函数f 在点(),x y 的值,从初始点()000,P x y 出发,向该点的切线方向推进到下一个点()111,P x y ,然后依次做下去,得到后面的未知点。一般地,若知道(),n n n P x y 依上述方法推进到点()111,n n n P x y +++,则两点的坐标关系为: 即 这种方法就是欧拉(Euler )方法(也叫显式欧拉法或向前欧拉法)。当初值0y 已知,则n y 可以逐步算出 对微分方程()=x y dy f dx ,从n x 到1n x +积分,那么有 现在用左矩形公式()(),n n hf x y x 代替()()1 ,n n x x f t y t dt +?,n y 代替()n y x ,1n y +代替() 1n y x +就得到了欧拉方法。如果用右矩形公式()()11,n n hf x y x ++去代替右端积分,则得到另外一 个公式,该方法就称为隐式欧拉法(或后退欧拉法),其公式为 欧拉公式与隐式欧拉公式的区别在于欧拉公式是关于1n y +的一个直接计算公式,然而隐式欧拉公式右端含有1n y +,所以它实际上是关于1n y +的一个函数方程。 二、实例 例 取h=,用Euler 方法解

常微分方程欧拉算法

常微分方程欧拉算法 Prepared on 22 November 2020

常微分方程欧拉算法 摘要:本文主要论述了常微分方程的欧拉算法的算法原理,误差分析,实例,程序,以及算法比较等内容。 关键词:常微分方程 显式欧拉法 隐式欧拉法 引言:微分方程初值问题模型是常见的一类数学模型。对于一些简单而典型的微分方程模型,譬如线性方程、某些特殊的一阶非线性方程等是可以设法求出其解析解的,并有理论上的结果可资利用。但在数学建模中碰到的常微分方程初值问题模型,通常很难,甚至根本无法求出其解析解,而只能求其近似解。因此,研究其数值方法,以便快速求得数值鳃有其重大意义。 一、欧拉算法原理 对于微分方程初值问题 的解在xy 平面上是一条曲线,称为该微分方程的积分曲线。积分曲线上一点(),x y 的切线斜率等于函数f 在点(),x y 的值,从初始点()000,P x y 出发,向该点的切线方向推进到下一个点()111,P x y ,然后依次做下去,得到后面的未知点。一般地,若知道(),n n n P x y 依上述方法推进到点()111,n n n P x y +++,则两点的坐标关系为: 即 这种方法就是欧拉(Euler )方法(也叫显式欧拉法或向前欧拉法)。当初值0y 已知,则n y 可以逐步算出 对微分方程()=x y dy f dx ,从n x 到1n x +积分,那么有 现在用左矩形公式()(),n n hf x y x 代替()()1 ,n n x x f t y t dt +?,n y 代替()n y x ,1n y +代替() 1n y x +就得到了欧拉方法。如果用右矩形公式()()11,n n hf x y x ++去代替右端积分,则得到另外一 个公式,该方法就称为隐式欧拉法(或后退欧拉法),其公式为 欧拉公式与隐式欧拉公式的区别在于欧拉公式是关于1n y +的一个直接计算公式,然而隐式欧拉公式右端含有1n y +,所以它实际上是关于1n y +的一个函数方程。 二、实例 例 取h=,用Euler 方法解

用改进的欧拉方法和四阶龙格-库塔方法解初值问题

用改进的欧拉方法和四阶龙格-库塔方法解初值问题 一、题目: 取步长2.0=h ,分别用改进的欧拉方法和四阶龙格—库塔方法解初值问题 ? ??=≤≤+=.1)0(;10,'y x y x y 并比较结果。 二、基本思想: 1.改进的欧拉方法 改进的欧拉方法用梯形公式计算()()()()+1+1-=,.n n x n n x y x y x f x y x dx ?中的积分,并以 n y 和+1n y 分别表示()n y x 和()+1n y x 的近似值,就得到 ()()()+1+1+1=+,+,.2 n n n n n n h y y f x y f x y (梯形公式) 梯形公式也是一个一步法公式。由于公式右端也含有未知的+1n y ,故被称作是隐式的。隐式格式实际上是关于+1n y 的一个函数方程。为了避免解方程,可以采用欧拉方法计算初始值,再由梯形公式计算。这样建立起来的计算格式称为改进的欧拉格式: ()()()()+1+1+1=+,,=+,+,.2 p n n n n n n n n n y y hf x y h y y f x y f x y ????? 梯形公式也可以采用迭代法求解。如果仍然采用欧拉方法计算迭代初值,那么计算格式就是 []()[]()[]()() 0+1+1+1+1+1=+,,=+,+,.2n n n n k k n n n n n n y y hf x y h y y f x y f x y ????? 由于已假定(),f x y 满足里普希兹条件,所以有 [][][]()[]() [][]+1-1-1+1+1+1,+1+1+1+1+1-=-,-.22 k k k k k k n n n n n n n n h hL y y f x y f x y y y ≤ 从而,迭代的收敛条件是0<<1.2hL 2.四阶龙格-库塔方法 龙格—库塔方法不是用求导数的办法,而是用计算不同点上()y x f ,的函数值,然后对这些函数值作线性拟合,构造近似公式。组合的原则是使得近似公式与泰勒展开式有尽可能多的项吻合,以达到较高的精度。 改进的欧拉格式

MATLABEuler法解常微分方程

Euler法解常微分方程 Euler法解常微分方程算法: Step 1 分别取积分上限、积分下限、步长 Step 2计算判断是否成立,成立转到Step 3,否则继续进行Step 4 Step 3 计算 Step 4 Euler法解常微分方程算程序: function euler2(fun,y0,A,h) %fun--y' %y0---初值 %A----x取值范围 %a----x左区间端点值 %b----x右区间端点值 %h----给定步长 x=min(A); b=max(A); y=y0; while x

Step 3 (1)做显性Euler预测 (2)将带入 Step 4计算判断是否成立,成立返回Step 3,否则继续进行Step 5 Step 5 改进Euler法解常微分方程算程序: function gaijineuler2(fun,y0,A,h) %fun--y' %y0---初值 %A----x取值范围 %a----x左区间端点值 %b----x右区间端点值 %h----给定步长 a=min(A); b=max(A); x=a:h:b; y(1)=y0; for i=1:length(x)-1 w1=feval(fun,x(i),y(i)); y(i+1)=y(i)+h*w1; w2=feval(fun,x(i+1),y(i+1)); y(i+1)=y(i)+h*(w1+w2)/2; end x=x' y=y' 例:用改进Euler法计算下列初值问题(取步长h=0.25) 输入:fun=inline('-x*y^2') gaijineuler2(fun,2,[0 5],0.25) 得到: x = 0.2500 0.5000 0.7500 1.0000 1.2500 1.5000 1.7500 2.0000 2.2500 2.5000 2.7500

常微分方程作业欧拉法与改进欧拉法

常微分方程作业欧拉法与改进欧 拉法 P77 31.利用改进欧拉方法计算下列初值问题,并画出近似解的草图: (1) 3 =y 1,y(0) =3,0汀岂2, :t=0.5; dt 代码: %改进欧拉法 fun cti on Euler(t0,y0,i nv,h) n=rou nd(i nv(2)-in v(1))/h; t(1)=t0; y(1)=y0; for i=1: n y1(i+1)=y(i)+h*fun(t(i),y(i)); t(i+1)=t(i)+h;

y(i+1)=y (i)+1/2*h*(fu n( t(i),y(i))+ fun( t(i+1),y1(i+1))) end plot(t,y,'*r') fun cti on y=fun (t,y); y=y+1; 调用:Euler(0,3,[0,2],0.5) 得到解析解:hold on; y=dsolve('Dy=y+1','(y(0)=3)', 't'); ezplot(y,[0,2])

图像: (2)女=y2—4t,y(0) =0.5,0 叭乞2, :t =0.2; dt 代码: function Euler1(t0,y0,inv,h) n=rou nd(i nv(2)-in v(1))/h; t(1)=t0; y(1)=y0; for i=1: n y1(i+1)=y(i)+h*fu n(t(i),y(i)); t(i+l)=t(i)+h; y(i+1)=y (i)+1/2*h*(fu n( t(i),y(i))+ fun( t(i+1),y1(i+1)))

end plot(t,y,'*r') fun cti on y=fun (t,y); y=y A2-4*t; 调用: Euler1(0,0.5,[0,2],0.2) 图像:

改进欧拉(c语言程序)

1)改进欧拉法求解常微分方程的初值问题 #include float func(float x,float y) { return(y-x); } float euler(float x0,float xn,float y0,int N) { float x,y,yp,yc,h; int i; x=x0; y=y0; h=(xn-x0)/(float)N; for(i=1;i<=N;i++) { yp=y+h*func(x,y); x=x0+i*h; yc=y+h*func(x,yp); y=(yp+yc)/2.0; } return(y); } main() { float x0,xn,y0,e; int n; printf("\ninput n:\n "); scanf("%d",&n); printf("input x0,xn:\n "); scanf("%f,%f",&x0,&xn); printf("input y0:\n "); scanf("%f",&y0); e=euler(x0,xn,y0,n); printf("y(%f)=%6.4f",y0,e); } input n: 20 input x0,xn: 1,6 input y0: 2 y(2.000000)=7.0000Press any key to continue (2)四阶龙格—库塔法

#include float func(float x,float y) { return(x-y); } float runge_kutta(float x0,float xn,float y0,int N) { float x,y,y1,y2,h,xh; float d1,d2,d3,d4; int i; x=x0; y=y0; h=(xn-x0)/(float)N; for(i=1;i<=N;i++) { xh=x+h/2; d1=func(x,y); d2=func(xh,y+h*d1/2.0); d3=func(xh,y+h*d2/2.0); d4=func(xh,y+h*d3); y=y+h*(d1+2*d2+2*d3+d4)/6.0; x=x0+i*h; } return(y); } main() { float x0,xn,y0,e; int N; printf("\ninput n:\n "); scanf("%d",&N); printf("input x0,xn:\n "); scanf("%f,%f",&x0,&xn); printf("input y0:\n "); scanf("%f",&y0); e=runge_kutta(x0,xn,y0,N); printf("y(%f)=%8.6f",y0,e); } input n: 10 input x0,xn: 1,2 input y0: 5 y(5.000000)=2.833863Press any key to continue

欧拉法解常微分方程

数学与计算科学学院 实验报告 实验项目名称 Eular 方法求解一阶常微分方程数值解 所属课程名称 偏微分方程数值解 _________________ 实验类型 ________________ 验证性 _______________________ 实验日期 ___________ 2015-3-26 _____________________ 级 __________ 号 _________ 名 ________________ 绩 ______________________ 一、实验概述: 【实验目的】 纟沙理工久 班 学 姓 成

熟练掌握应用显性Eular法和隐式Eular法求解一般一阶常微分方程的近似数值解。 【实验原理】 虽然求解常微分方程有各种各样的解析方法,但解析方法只能用来求解一些特殊类型的方程。求解从实际问题当中归结出来的微分方程主要靠数值解法。欧拉方法是一类重要的数值解法。这类方法回避解y(x)的函数表达式,而是寻求它在一系 列离散节点上的近似值,相邻的两个节点的间距称作步长。假定步长为定数。 欧拉方法是一类离散化方法,这类方法将寻求解y(x)的分析问题转化为计算离 散值值的代数问题,从而使问题获得了实质性的简化。然而随之带来的困难是,由于数据量往往很大,差分方法所归结出的可能是个大规模的代数方程组。 【实验环境】 1.硬件环境 22软件环境 MATLAB7.0 、实验内容:

【实验过程】(实验步骤) (一)实验任务 描述某种化学反应过程的方程,利用显性和隐形 Eualar 方法求解下列一阶线性 微分方程组的近似数值解: y i (0) 5(0) 0, y a (0) 0 (二)求解过程 Eular 方法: 一阶线性微分方程初值问题 y' f (x,y ),a x b y (a ) y 。 a x 0 x., .... x n b ( 1) X n x nh, h 为步长 方程离散化:差分和差商 y'g y1 y0 y1 y0 x 1 x 0 h 愀必)y/0 h y 1 y ° hf (x °,y °) (2) y n 1 y n hf (X °,y °) 通过初始值y ,依据递推公式(2)逐步算出Y 1,Y 2,....,y n 就为显性的Eular 方 法。 隐形Eular 方法: y 1 y ° hf(X 1,yJ y n 1 y n hf(X n1,y n1) 公式(3)即为隐式Eular 公式 (3) 4 0.04y 1 10 y 1y 2 0.04% 104 y-i y 2 3 1O 7y 2

改进Euler方法

第九章 解常微分方程初值问题 4. 改进Euler 方法 我们先用Euler 公式求的一个初步的近似值,再用梯形公式将它校正一次,即按(5)迭代一次得y 1+n ,这个结果称为校正值,这样建立的校正系统通常成为改进Euler 公式. y 1+n = y n +h /2(f (n n y x ,) + f (x n +1, n y + h* f (n n y x ,))) (6) 即迭代公式为: ? ???? +=+=+),,(*),,(*1p n n c n n n p y x f h y y y x f h y y (7)

进过计算得出改进Euler 法比Euler 法 明显改善了精度. 上机实验⑷ 上机题目:贬值求一阶常微分方程的初值问题 实验目的:掌握各种Euler 方法和梯形法。 进过计算结果来分析四种方法的优缺点,掌握规律。 分析结果。 实验要求:用不同的方法来解同一个例子。 ① 上机前充分准备,复习有关内容,写出计算步骤,查对程 序。②改进Euler 法在Matlab 环境中运算,并分析出最好的方法,再给出它的流程图。③实验结束后写出完整的实验报告。 算法说明:①经过所给出的方程组和初值初步改变方程组。 ②由以上四种方法的计算公式来逐步计算y 的每个值。 ③最后为了方便比较列为表最适合。 上机例题:例1.后退Euler 方法解初值问题,h =0.1 ? ??=??='1y(0)1x 0 2x/y, -y y Matlab 程序: function[x,y]=gaijing(f,x0,y0,a,b,n) h=(b-a)/n; %定义并计算步长 for k=1:n+1 x(k)=a+(k-1)*h; %计算x(k) end y(1)=y0; for i=1:n yp=y(i)+h*subs(subs(f,x(i)),y(i)); %由改进Euler 的公式计算. yc=y(i)+h*subs(subs(f,x(i+1)),yp); y(i+1)=(1/2)*(yp+yc); end disp(sprintf(' i x(i) y(i)')); %为了方便以规定格式先输出 i,x(i),y(i). for i=1:n disp(sprintf(' %d %f %f',i,x(i+1),y(i+1))); %为了方便观察结果在先输出的 格式下输出结果 end s=y(i); 运行结果: [x,y]=gaijing('y-2*x/y',0,1,0,1,10) i x(i) y(i) 1 0.100000 1.095909

欧拉法,改进欧拉法,斐波那契法基础原理及经过流程图

1欧拉法求微分方程 方法说明 欧拉(Euler)法是解常微分方程初值问题 (4.1) 最简单的数值方法,其具体做法是,将区间[a,b]进行N等分: ,步长.并将式(4.1)写成等价的积分形式 (4.2) 再对式(4.2)右端积分用矩形公式计算,则有 , (4.3) 在式(4.3)右端取,舍去余项。则得 , 作为的近似值。 在式(4.3)右端取,舍去余项,则得

y2=y1+?f(x1,y1) 作为的近似值. 一般地,在式(4.3)右端取舍去余项,则得 (4.4) 作为的近似值.式(4.4)为欧拉法计算公式. 我们知道微分方程的解是平面上的一族积分曲线,这族曲线中过点的积分曲线就是初值问题式(4.1)的解. 欧拉法的几何意义是,过点引斜率为的积分曲线的切线,此切线与直线的交点为,再过点引以为斜率的切线与直线的交点为,依此类推,从出发,作以为斜率的切线,此切线与直线交点为.于是便得到过点的一条折线,见图4.1.过的积分曲线则用此折线来代替.因此,这种方法亦称折线法. 图4.1

例:用欧拉法求微分方程[ ]2',(0)1,0.1,0,1x y y y h y 区间为=-== 欧拉法流程图如下: 欧拉法程序如下: clear; clc; x1=0; x2=1; h=0.1; x0=0; y0=1; N=(x2-x1)/h;%要计算的次数 x(1)=x0; y(1)=y0; for n=1:N x(n+1)=x(n)+h;

y(n+1)=y(n)+h*(y(n)-2*x(n)/y(n)); end X=x Y=y 2改进欧拉法求微分方程 方法说明 由于欧拉法采用矩形公式计算积分产生较大截断误差.改进欧拉法(又称改进折线法)是采取梯形公式来计算式(4.3)右端积分,则有 (5.1) 在式(5.1)右端取,舍去余项,则得 将作为的近似值. 在式(5.1)右端再取,舍去余项,则得 将作为的近似值. 一般地,在式(5.1)右端取,舍去余项.则得 (5.2)

相关文档
最新文档