龙格-库塔方法微积分教学

龙格-库塔方法微积分教学
龙格-库塔方法微积分教学

龙格-库塔方法

8.2.1 二阶龙格-库塔方法

常微分方程初值问题:

做在点的泰勒展开:

这里。取,就有

(8.11)

截断可得到近似值的计算公式,即欧拉公式:

若取,式(8.11)可写成:

(8.12)

截断可得到近似值的计算公式:

上式为二阶方法,一般优于一阶的欧拉公式(8.2),但是在计算时,需要计算在点的值,因此,此法不可取。

龙格-库塔设想用在点和

值的线性组合逼近式(8.12)的主体,即用

(8.13)

逼近

得到数值公式:

(8.14)

或更一般地写成

对式(8.13)在点泰勒展开得到:

将上式与式(8.12)比较,知当满足

时有最好的逼近效果,此时式(8.13)-式(8.14)。这是4个未知数的3个方程,显然方程组有无数组解。

若取,则有二阶龙格-库塔公式,也称为改进欧拉公式:

(8.15)

若取,则得另一种形式的二阶龙格-库塔公式,也称中点公式:

(8.16)从公式建立过程中可看到,二阶龙格-库塔公式的局部截断误差仍为,是二阶精度的计算公式。类似地,可建立高阶的龙格-库

龙格库塔方法matlab实现

龙格库塔方法matlab实现~ function ff=rk(yy,x0,y0,h,a,b)%yy为y的导函数,x0,y0,为初值,h为步长,a,b为区间 c=(b-a)/h+1;i1=1; %c为迭代步数;i1为迭代步数累加值 y=y0;z=zeros(c,6); %z生成c行,5列的零矩阵存放结果; %每行存放c次迭代结果,每列分别存放k1~k4及y的结果 for x=a:h:b if i1<=c k1=feval(yy,x,y); k2=feval(yy,x+h/2,y+(h*k1)/2); k3=feval(yy,x+h/2,y+(h*k2)/2); k4=feval(yy,x+h,y+h*k3); y=y+(h/6)*(k1+2*k2+2*k3+k4); z(i1,1)=x;z(i1,2)=k1;z(i1,3)=k2;z(i1,4)=k3;z(i1,5)=k4;z(i1,6)=y; i1=i1+1; end end fprintf(‘结果矩阵,第一列为x(n),第二列~第五列为k1~k4,第六列为y(n+1)的结果') z %在命令框输入下列语句 %yy=inline('x+y'); %>> rk(yy,0,1,0.2,0,1) %将得到结果 %结果矩阵,第一列为x(n),第二列~第五列为k1~k4第六列为y(n+1)的结果 %z = % 0 1.0000 1.2000 1.2200 1.4440 1.2428 % 0.2000 1.4428 1.6871 1.7115 1.9851 1.5836 % 0.4000 1.9836 2.2820 2.3118 2.6460 2.0442 % 0.6000 2.6442 3.0086 3.0451 3.4532 2.6510 % 0.8000 3.4510 3.8961 3.9407 4.4392 3.4365 % 1.0000 4.4365 4.9802 5.0345 5.6434 4.4401

matlab编的4阶龙格库塔法解微分方程的程序

matlab编的4阶龙格库塔法解微分方程的程序 2010-03-10 20:16 function varargout=saxplaxliu(varargin) clc,clear x0=0;xn=1.2;y0=1;h=0.1; [y,x]=lgkt4j(x0,xn,y0,h); n=length(x); fprintf(' i x(i) y(i)\n'); for i=1:n fprintf('%2d %4.4f %4.4f\n',i,x(i),y(i)); end function z=f(x,y) z=-2*x*y^2; function [y,x]=lgkt4j(x0,xn,y0,h) x=x0:h:xn; n=length(x); y1=x; y1(1)=y0; for i=1:n-1 K1=f(x(i),y1(i)); K2=f(x(i)+h/2,y1(i)+h/2*K1); K3=f(x(i)+h/2,y1(i)+h/2*K2); K4=f(x(i)+h,y1(i)+h*K3); y1(i+1)=y1(i)+h/6*(K1+2*K2+2*K3+K4); end y=y1; 结果: i x(i) y(i) 1 0.0000 1.0000 2 0.1000 0.9901 3 0.2000 0.9615 4 0.3000 0.9174 5 0.4000 0.8621 6 0.5000 0.8000 7 0.6000 0.7353 8 0.7000 0.6711 9 0.8000 0.6098 10 0.9000 0.5525 11 1.0000 0.5000 12 1.1000 0.4525 13 1.2000 0.4098

龙格库塔积分算法

龙格库塔法 龙格库塔法是常用于模拟常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家C. Runge和M.W. Kutta于1900年左右发明。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。 龙格库塔法是一种在工程上应用广泛的高精度单步算法,可以应用在物理、工程、控制、动力学中,如模糊控制、弹道分析以及分析光纤特性等,在系统仿真中得到广泛应用。 龙格库塔法源自于相应的泰勒级数方法,在每一插值节点用泰勒级数展开,其截断误差阶数也是,根据可省略更高阶的导数计算, 这种方法可构造任意阶数的龙格库塔法。其中4 阶龙格库塔法是最常用的一种方法。因为它相当精确、稳定、容易编程。在计算中一般不必使用高阶方法, 因为附加的计算误差可由增加精度来弥补。如果需要较高的精度, 可采取减小步长的方法即可。4 阶龙格库塔法的精度类似4 阶泰勒级数法的精度。 1、初值问题 对于一阶常微分方程的初值问题 根据常微分方程的理论可知,此初值问题的解在区间[a,b]上存在,且唯一。 2、离散化

取步长h=(b-a)/n,将区间[a , b]分成n个子区间: a=<=b 在其中任意两点的曲线段上,根据积分中值定理,一段光滑曲 线上至少有一点,它的斜率与整段曲线的平均斜率相同, 得=y’() (0<<1) 其中,= 可以将上式改写成y()=y()+h*K (2.1) 其中K为平均斜率,K=f() 公式(2.1)表明,如果能够确定平均斜率K,就可以根据(2.1)式得到y()的值。 欧拉法和龙格库塔法就是用不同方法确定不同精度的平均斜率K,从而求得y()的近似值。 3、Euler法 欧拉法虽然精度低,但它是最简单的一种显式单步法,也是龙 格库塔法的基础。 首先,令、为y() 及y()的近似值,并且令平均斜 率K=f(),即以点的斜率作为平均斜率K,便得到欧拉公式=+h* f() (3.1) 4、改进的欧拉法 此种方法是取、两点的斜率的平均值作为平均斜率K, 即K= ,其中、均为y()以及y()的近似值,就得到 改进后的欧拉公式(4.1)

Matlab中龙格-库塔(Runge-Kutta)方法原理及实现

函数功能编辑本段回目录 ode是专门用于解微分方程的功能函数,他有ode23,ode45,ode23s等等,采用的是Runge-Kutta算法。ode45表示采用四阶,五阶runge-kutta单步算法,截断误差为(Δx)3。解决的是Nonstiff(非刚性)的常微分方程.是解决数值解问题的首选方法,若长时间没结果,应该就是刚性的,换用ode23来解. 使用方法编辑本段回目录 [T,Y] = ode45(odefun,tspan,y0) odefun 是函数句柄,可以是函数文件名,匿名函数句柄或内联函数名 tspan 是区间[t0 tf] 或者一系列散点[t0,t1,...,tf] y0 是初始值向量 T 返回列向量的时间点 Y 返回对应T的求解列向量 [T,Y] = ode45(odefun,tspan,y0,options) options 是求解参数设置,可以用odeset在计算前设定误差,输出参数,事件等 [T,Y,TE,YE,IE] =ode45(odefun,tspan,y0,options) 在设置了事件参数后的对应输出 TE 事件发生时间 YE 事件解决时间 IE 事件消失时间 sol =ode45(odefun,[t0 tf],y0...) sol 结构体输出结果 应用举例编辑本段回目录 1 求解一阶常微分方程

程序: 一阶常微分方程 odefun=@(t,y) (y+3*t)/t^2; %定义函数 tspan=[1 4]; %求解区间 y0=-2; %初值 [t,y]=ode45(odefun,tspan,y0); plot(t,y) %作图 title('t^2y''=y+3t,y(1)=-2,1

Matlab中龙格-库塔(Runge-Kutta)方法原理及实现

Matlab中龙格-库塔(Runge-Kutta)方法原理及实现 龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。该算法是构建在数学支持的基础之上的。龙格库塔方法的理论基础来源于泰勒公式和使用斜率近似表达微分,它在积分区间多预计算出几个点的斜率,然后进行加权平均,用做下一点的依据,从而构造出了精度更高的数值积分计算方法。如果预先求两个点的斜率就是二阶龙格库塔法,如果预先取四个点就是四阶龙格库塔法。一阶常微分方程可以写作:y'=f(x,y),使用差分概念。 (Yn+1-Yn)/h= f(Xn,Yn)推出(近似等于,极限为Yn') Yn+1=Yn+h*f(Xn,Yn) 另外根据微分中值定理,存在0

所以,为了更好更准确地把握时间关系,应自己在理解龙格库塔原理的基础上,编写定步长的龙格库塔函数,经过学习其原理,已经完成了一维的龙格库塔函数。 仔细思考之后,发现其实如果是需要解多个微分方程组,可以想象成多个微分方程并行进行求解,时间,步长都是共同的,首先把预定的初始值给每个微分方程的第一步,然后每走一步,对多个微分方程共同求解。想通之后发现,整个过程其实很直观,只是不停的逼近计算罢了。编写的定步长的龙格库塔计算函数: function [x,y]=runge_kutta1(ufunc,y0,h,a,b)%参数表顺序依次是微分方程组的函数名称,初始值向量,步长,时间起点,时间终点(参数形式参考了ode45函数) n=floor((b-a)/h);%求步数 x(1)=a;%时间起点 y(:,1)=y0;%赋初值,可以是向量,但是要注意维数 for ii=1:n x(ii+1)=x(ii)+h; k1=ufunc(x(ii),y(:,ii)); k2=ufunc(x(ii)+h/2,y(:,ii)+h*k1/2); k3=ufunc(x(ii)+h/2,y(:,ii)+h*k2/2); k4=ufunc(x(ii)+h,y(:,ii)+h*k3); y(:,ii+1)=y(:,ii)+h*(k1+2*k2+2*k3+k4)/6; %按照龙格库塔方法进行数值求解

四阶龙格库塔法的编程(赵)

例题一 四阶龙格-库塔法的具体形式为: 1.1程序: /*e.g: y'=t-y,t∈[0,1] /*y(0)=0 /*使用经典四阶龙格-库塔算法进行高精度求解 /* y(i+1)=yi+( K1+ 2*K2 +2*K3+ K4)/6 /* K1=h*f(ti,yi) /* K2=h*f(ti+h/2,yi+K1*h/2) /* K3=h*f(ti+h/2,yi+K2*h/2) /* K4=h*f(ti+h,yi+K3*h) */ #include #include #define N 20 float f(float d,float p) //要求解的微分方程的右部的函数e.g: t-y { float derivative; derivative=d-p; return(derivative); } void main() { float t0; //范围上限

float t; //范围下限 float h; //步长 float nn; //计算出的点的个数,即迭代步数 int n; //对nn取整 float k1,k2,k3,k4; float y[N]; //用于存放计算出的常微分方程数值解 float yy; //精确值 float error;//误差 int i=0,j; //以下为函数的接口 printf("input t0:"); scanf("%f",&t0); printf("input t:"); scanf("%f",&t); printf("input y[0]:"); scanf("%f",&y[0]); printf("input h:"); scanf("%f",&h); // 以下为核心程序 nn=(t-t0)/h; printf("nn=%f\n",nn); n=(int)nn; printf("n=%d\n",n); for(j=0;j<=n;j++) { yy=t0-1+exp(-t0); //解析解表达式 error=y[i]-yy; //误差计算 printf("y[%f]=%f yy=%f error=%f\n",t0,y[i],yy,error);//结果输出k1=h*f(t0,y[i]); //求K1 k2=h*f((t0+h/2),(y[i]+k1*h/2)); //求K2 k3=h*f((t0+h/2),(y[i]+k2*h/2)); //求K3

龙格库塔法例题

四阶龙格一库塔法 通常所说的龙格一库塔法是指四阶而言的.我们可以仿二阶、三阶的情形推导出常用的标准四阶龙格一库塔公式 (9.22) 公式(9.22)的局部截断误差的阶为. 龙格一库塔法具有精度高,收敛,稳定(在一定的条件下),计算过程中可以改变步长,不需要计算高阶导数值等优点.但仍需计算在一些点上的值,如四阶龙格-库塔法每计算一步需要算四次 的值,这给实际计算带来一定的复杂性,因此,多用来计算“表头”.(即开始几点的近似值).例3.用标准龙格一库塔法求初值问题 在处的解. 解因与.若应用标准龙格一库塔方法公式(9.22)计算,对于n=0时,则有

于是得 这个值与准确解在处的值已十分接近.再对n=1,2,3,4应用式(9.22)计算,具体计算结果如表3所示:

例3写出用四阶龙格――库塔法求解初值问题 的计算公式,取步长h=0.2计算y(0.4)的近似值。至少保留四位小数。 解此处f(x,y)=8-3y,四阶龙格――库塔法公式为 其中κ1=f(x k,y k);κ2=f(x k+0.5h,y k+0.5hκ1); κ3=f(x k+0.5h,y k+0.5hκ2);κ4=f(x k+h,y k+hκ3) 本例计算公式为: 其中κ1=8-3y k;κ2=5.6-2.1y k; κ3=6.32-2.37y k;κ4=4.208-1.578y k =1.2016+0.5494y k (k=0,1,2,…) 当x0=0,y0=2, y(0.2)≈y1=1.2016+0.5494y0=1.2016+0.5494×2=2.3004 y(0.4)≈y2=1.2016+0.5494y1=1.2016+0.5494×2.3004=2.4654

四阶龙格库塔法原理C代码

/** ***四阶Runge-Kutta法*** 经典格式: y(n+1) = y(n) + h/6 ( K1 + 2*K2 + 2*K3 + K4 ) K1 = f( x(n) , y(n) ) K2 = f( x(n+1/2) , y(n) + h/2*K1 ) K3 = f( x(n+1/2) , y(n) + h/2*K2 ) K4 = f( x(n+1) , y(n) + h*K3 ) Runge-Kutta法是基于泰勒展开方法,因而需要所求解具有较好的光滑性。 属性:差分方法 《数值分析简明教程》-2 Editon -高等教育出版社- page 105 算法流程图代码维护:2005.6.14 DragonLord **/ #include #include #include /* 举例方程: y'= y - 2*x / y ( 0>x0>>y0>>h>>N) { int n=0;

for(;n

龙格库塔方法及其matlab实现

龙格-库塔方法及其matlab实现 摘要:本文的目的数值求解微分方程精确解,通过龙格-库塔法,加以利用matlab为工具 达到求解目的。龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法,用于数值求解微分方程。MatLab软件是由美国Mathworks公司推出的用于数值计算和图形 处理的科学计算系统环境。MatLab是英文MATrix LABoratory(矩阵实验室)的缩写。在MratLab环境下,用户可以集成地进行程序设计、数值计算、图形绘制、输入输出、文件 管理等各项操作。 关键词:龙格-库塔 matlab 微分方程 1.前言 1.1:知识背景 龙格-库塔法(Runge-Kutta)是用于非线性常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家卡尔·龙格和马丁·威尔海姆·库塔于1900年左右发明。通常所说的龙格库塔方法是相对四阶龙格库塔而言的,成为经典四阶龙格库塔法。该方法具有精度高,收敛,稳定,计算过程中可以改变步长不需要计算高阶导数等优点,但是仍需计算在 一些点上的值,比如四阶龙格-库塔法没计算一步需要计算四步,在实际运用中是有一定复杂性的。 Matlab是在20世纪七十年代后期的事:时任美国新墨西哥大学计算机科学系主任的Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库 程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。 经几年的校际流传,在Little的推动下,由Little、Moler、Steve Bangert合作,于1984年成立了MathWorks公司,并把MATLAB正式推向市场。从这时起,MATLAB的内核 采用C语言编写,而且除原有的数值计算能力外,还新增了数据图视功能。 MATLAB以商品形式出现后,仅短短几年,就以其良好的开放性和运行的可靠性, 使原先控制领域里的封闭式软件包(如英国的UMIST,瑞典的LUND和SIMNON,德国的KEDDC)纷纷淘汰,而改以MATLAB为平台加以重建。在时间进入20世纪九十年代的时候,MATLAB已经成为国际控制界公认的标准计算软件。 到九十年代初期,在国际上30几个数学类科技应用软件中,MATLAB在数值计算方面独占 鳌头,而Mathematica和Maple则分居符号计算软件的前两名。Mathcad因其提供计算、 图形、文字处理的统一环境而深受中学生欢迎。 1.2研究的意义 精确求解数值微分方程,对龙格库塔的深入了解与正确运用,主要是在已知方程导数和初 值信息,利用计算机仿真时应用,省去求解微分方程的复杂过程。利用matlab强大的数值计算功能,省去认为计算的过程,达到快速精确求解数值微分方程。在实际生活中可以利 用龙格库塔方法和matlab的完美配合解决问题。 1.3研究的方法 对实例的研究对比,实现精度的要求,龙格库塔是并不是一个固定的公式,所以只是对典 型进行分析

二阶龙格库塔方法

2012-2013(1)专业课程实践论文二阶Runge-Kutta方法 董文峰,0818180123,R数学08-1班

由改进的Euler 方法得到: ()) ,(),(21121 211 K y h x hf K y x hf K K K y y i i i i i i ++==++=?????+ 凡满足条件式有一簇形如上式的计算格式,这些格式统称为二阶龙格—库塔格式。因此改进的欧拉格式是众多的二阶龙格—库塔法中的一种特殊格式。 若取1,0,2121212=== =c c b a ,就是另一种形式的二阶龙格 - 库塔公式。 ??????? ++==+=+)2,2() ,(12121K h y h x f K y x f K hK y y n n n n n n (1) 此计算公式称为变形的二阶龙格—库塔法。 二级龙格-库塔方法是显式单步式,每前进一步需要计算两个函数值。由上面的讨论可知,适当选择四个参数y0,a,b,n ,可使每步计算两次函数值的二阶龙格-库塔方法达到二阶精度。下面以式子(1)为依据利用VC++6.0编译程序进行问题的求解。

#include #include /*n表示几等分,n+1表示他输出的个数*/ int RungeKutta(double y0,double a,double b,int n,double *x,double *y,double (*function)(double,double)) { double h=(b-a)/n,k1,k2; int i; x[0]=a; y[0]=y0; for(i=0;i

龙格-库塔法MATLAB

1. matlab 新建.m文件,编写龙格-库塔法求解函数 function [x,y]=runge_kutta1(ufunc,y0,h,a,b)%参数表顺序依次是微分方程组的函数名称,初始值向量,步长,时间起点,时间终点(参数形式参考了ode45函数) n=floor((b-a)/h); %求步数 x(1)=a;%时间起点 y(:,1)=y0;%赋初值,可以是向量,但是要注意维数 for ii=1:n x(ii+1)=x(ii)+h; k1=ufunc(x(ii),y(:,ii)); k2=ufunc(x(ii)+h/2,y(:,ii)+h*k1/2); k3=ufunc(x(ii)+h/2,y(:,ii)+h*k2/2); k4=ufunc(x(ii)+h,y(:,ii)+h*k3); y(:,ii+1)=y(:,ii)+h*(k1+2*k2+2*k3+k4)/6; %按照龙格库塔方法进行数值求解 end 2.另外再新建一个.,m文件,定义要求解的常微分方程函数 function dx=fun1(t,x) dx =zeros(2,1);%初始化列向量 dx(1) =0.08574*x(2)-1.8874*x(1)-20.17; dx(2) =1.8874*x(1)-0.08574*x(2)+115.16; 3,再新建一个.m文件,利用龙格-库塔方法求解常微分方程 [T1,F1]=runge_kutta1(@fun1,[46.30 1296 ],1,0,20); %求解步骤2定义的fun1常微分方程,@fun1是调用其函数指针,从0到20,间隔为1 subplot(122) plot(T1,F1)%自编的龙格库塔函数效果 title('自编的龙格库塔函数') grid 运行步骤3文件即可得到结果,F1为估测值 或者可以调用matlab自带函数ode45求解 方法如下:

欧拉法与龙格库塔法比较分析

解微分方程的欧拉法,龙格-库塔法简单实例比较 欧拉方法(Euler method)用以对给定初值的常微分方程(即初值问题)求解分为前EULER 法、后退EULER 法、改进的EULER 法。 缺点: 欧拉法简单地取切线的端点作为下一步的起点进行计算,当步数增多时,误差会因积累而越来越大。因此欧拉格式一般不用于实际计算。 改进欧拉格式(向前欧拉公式): 为提高精度,需要在欧拉格式的基础上进行改进。采用区间两端的斜率的平均值作为直线方程的斜率。改进欧拉法的精度为二阶。 算法: 微分方程的本质特征是方程中含有导数项,数值解法的第一步就是设法消除其导数值。对于常微分方程: (,)dy f x y dx = [,]x a b ∈ 0()y a y = 可以将区间[,]a b 分成n 段,那么方程在第i x 点有'()(,())i i i y x f x y x =,再用向前差商近似代替导数则为: ((1)()) (,())i i i i y x y x f x y x h +-= 在这里,h 是步长,即相邻两个结点间的距离。因此可以根据i x 点和i y 的数值计算出1i y +来: 1(,)i i i i y y h f x y +=+?0,1,2,i L = 这就是向前欧拉公式。 改进的欧拉公式:

将向前欧拉公式中的导数(,)i i f x y 改为微元两端导数的平均,即上式便是梯形的欧拉公式。 可见,上式是隐式格式,需要迭代求解。为了便于求解,使用改进的欧拉公式: 数值分析中,龙格-库塔法(Runge-Kutta )是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。实际上,龙格-库塔法是欧拉方法的一种推广,向前欧拉公式将导数项简单取为(,)n n f x y ,而改进的欧拉公式将导数项取为两端导数的平均。 龙格-库塔方法的基本思想: 在区间1[,]n n x x +内多取几个点,将他们的斜率加权平均,作为导数的近似。 龙格库塔法的家族中的一个成员如此常用,以至于经常被称为“RK4”或者就是“龙格库塔法”。 令初值问题表述如下。 '(,)y f t y =00()y t y = 则,对于该问题的RK4由如下方程给出: 11234(22)6 n n h y y k k k k +=++++ 其中 1(,)n n k f t y = 21(,)22 n n h h k f t y k =++ 32(,)22 n n h h k f t y k =++ 43(,)n n k f t h y hk =++

计算机仿真(龙格库塔方法)的软件VB设计与实现

计算机仿真(龙格库塔方法)的软件VB设计与实现 Dim a(0 To 10) As Single, b(0 To 10) As Single, c(0 To 10) As Single, d(0 To 10) As Single Dim e(0 To 10) As Single, h(0 To 10) As Single, p(0 To 10) As Single, q(0 To 10) As Single Dim n1 As Byte, n2 As Byte 'n1表示的是y 的阶数,n2表示的是输入函数的阶数 Dim i As Integer Dim f(0 To 2000) As Single 'f(m)=y,也就是各个时刻的y值 Dim X0(0 To 12) As Single, X1(0 To 12) As Single Dim dt As Single, u As Single 'dt为采样周期,u为输入Dim q1 As Single, p1 As Single, h1 As Single, e1 As Single Dim b0(0 To 10) As Single, bn(-4 To 10) As Single Dim m As Integer Dim max As Single Private Sub Combo1_Click() n1 = Combo1.ListIndex + 1 'n1表示的是y的阶数 For i = n1 + 1 To 8 Text1(i).Visible = False Label1(i).Visible = False Label9(i).Visible = False Next For i = 0 To n1 Text1(i).Visible = True Label1(i).Visible = True Label9(i).Visible = True Next Combo2.Clear Combo2.Text = "请选择输出u的最大阶数" For i = 0 To n1 Combo2.AddItem ((i) & "阶") Next End Sub Private Sub Combo2_Click() n2 = Combo2.ListIndex 'n2表示的是输入函数的阶数 For i = n2 + 1 To 8 Text2(i).Visible = False

龙格库塔法-原理及程序实现

龙格库塔法一、基本原理:

可以得出四阶龙格-库塔公式,也就是在工程中应用广泛的经典龙格-库塔算法,即: yi+1=yi+h*( K1+ 2*K2 +2*K3+ K4)/6 K1=f(xi,yi) K2=f(xi+h/2,yi+h*K1/2) K3=f(xi+h/2,yi+h*K2/2) K4=f(xi+h,yi+h*K3) 通常所说的龙格-库塔法就是指四阶——龙格库塔法,我们可以仿二阶、三阶的情形推导出常用的标准四阶龙格-库塔法公式。 (1) 计算公式(1)的局部截断误差是。 龙格-库塔法具有精度高,收敛,稳定(在一定条件下),计算过程中可以改变步长,不需要计算高阶导数等优点,但仍需计算 在一些点上的值,如四阶龙格-库塔法每计算一步需要计算四次 的值,这给实际计算带来一定的复杂性,因此,多用来计算“表头”。 二、小程序 #include #include

#define f(x,y) (-1*(x)*(y)*(y)) void main(void) { double a,b,x0,y0,k1,k2,k3,k4,h; int n,i; printf("input a,b,x0,y0,n:"); scanf("%lf%lf%lf%lf%d",&a,&b,&x0,&y0,&n); printf("x0\ty0\tk1\tk2\tk3\tk4\n"); for(h=(b-a)/n,i=0;i!=n;i++) { k1=f(x0,y0); k2=f(x0+h/2,y0+k1*h/2); k3=f(x0+h/2,y0+k2*h/2); k4=f(x0+h,y0+h*k3); printf("%lf\t%lf\t",x0,y0); printf("%lf\t%lf\t",k1,k2); printf("%lf\t%lf\n",k3,k4); y0+=h*(k1+2*k2+2*k3+k4)/6; x0+=h; } printf("xn=%lf\tyn=%lf\n",x0,y0); }

龙格库塔方法解题

龙格库塔方法 从常微分方程数值解法的几何意义看,欧拉方法取一点n t 处的斜率() n n Q t f k ,1 =作为平均斜率,因此欧拉方法近似公式为 t k Q Q n n ?+=+11 向后的欧拉方法则采用点1+n t 处的斜率 ()112,++=n n Q t f k 作为平均斜率,即 t k Q Q n n ?+=+21 所以这两种方法也称作矩形法。改进的欧拉方法则取点n t 处和点1+n t 处斜率 1k 和2k 的平均值作为平均斜率,即 ()t k k Q Q n n ?++=+2112 1 因此改进的欧拉方法又称为梯形方法。可以预见,若去多点处斜率的加权平均值作为平均斜率,误差会更小,这就是龙格-库塔方法。 最常用的是四阶龙格库卡近似计算公式,即: ()t k k k k Q Q n n ?++++=+43211226 1 式中 () () 314221312 121,2,2,,tk Q t f k k t Q t f k k t Q t f k Q t f k n n n n n n n n ?+=??? ? ???+=???? ???+==+++ 使用标准四阶龙格——库塔法求解初值问题

()(){}10210≤≤='=x xy y y 计算所用程序如下所示 #include "stdio.h" #include "conio.h" float func(float x,float y) { return(2*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)/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); } void 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);

1、经典四阶龙格库塔法解一阶微分方程组

陕西科技大学 数值计算课程设计任务书 理学院信息与计算科学/应用数学专业信息08/数学08 班级学生: 题目:典型数值算法的C++语言程序设计 课程设计从2010 年 5 月17日起到2010 年 6 月18 日 1、课程设计的内容和要求(包括原始数据、技术要求、工作要求等): 每人需作10个算法的程序、必做6题、自选4题。 对每个算法要求用C++语言进行编程。 必选题: 1、经典四阶龙格库塔法解一阶微分方程组 2、高斯列主元法解线性方程组 3、牛顿法解非线性方程组 4、龙贝格求积分算法 5、三次样条插值算法(压紧样条)用C++语言进行编程计算 依据计算结果,用Matlab画图并观察三次样条插值效果。 6、M次多项式曲线拟合,据计算结果,用Matlab画图并观察拟合效果。 自选题:自选4道其他数值算法题目.每道题目重选次数不得超过5次. 2、对课程设计成果的要求〔包括图表、实物等硬件要求〕: 1)提交课程设计报告 按照算法要求,用C++语言设计和开发应用程序,提交由算法说明;程序设计说明;系统技术文档(包括系统各模块主要流程图,软件测试方案与测试记录、软件调试和修改记录、测试结论、运行情况记录),系统使用说明书,源程序代码为附录构成的课程设计报告。 2)课程设计报告版式要求

打印版面要求:A4纸,页边距:上2cm,下2cm,左2.5cm、右2cm;字体:正文宋体、小四号;行距:固定值20;页眉1.5cm ,页脚1.75cm;页码位于页脚居中打印;奇数页页眉“数值计算课程设计”,偶数页页眉“算法名称”,页眉宋体小5号;段落及层次要求:每节标题以四号黑体左起打印(段前段后各0.5行),节下为小节,以小四号黑体左起打印(段前段后各0.5行)。换行后以小四号宋体打印正文。节、小节分别以1、1.1、1.1.1依次标出,空一字符后接各部分的标题。 当论文结构复杂,小节以下的标题,左起顶格书写,编号依次用(1)、(2)……或1)、2)……顺序表示。字体为小四号宋体。 对条文内容采用分行并叙时,其编号用(a)、(b)……或a)、b)……顺序表示,如果编号及其后内容新起一个段落,则编号前空两个中文字符。3)设计报告装订顺序与规范 封面 数值计算课程设计任务书 目录 数值计算设计课程设计报告正文 设计体会及今后的改进意见 参考文献(资料) 左边缘装订 3 指导教师:日期: 教研室主任:日期:

四阶龙格库塔算法

//状态方程 /X=AX+BU化为微分方程求解 #include #include #include #include //定义运算步数; //定义步长; #define N 1000000 #define h 0.000001 double x[9]={1,2,3,4,5,6,7,8,9}; double u[4]={0}; //定义微分方程: double fx(double x[],double dx,int i) { //矩阵A和B double A[9][9]={{0,0,0,0,0,0,1,0.0023,0.0556},{0,0,0,0,0,0,0,0.9991,-0.0421},{0,0,0,0,0 ,0,0,0.0422,1.0007},{0.0001,-32.1478,0,-0.0197,0.004,0.0142,0.9141,1.7506,0.217} ,{32.1193,-0.0754,0,-0.0044,-0.0323,0.0046,-1.7475,0.9664,0.3464},{-1.3556,-1.78 91,0,0.0141,0.0031,-0.2634,0.1234,0.1345,-2.2448},{0,0,0,-0.0099,-0.031,0.0017,-3.2757,0.721,0.2452},{0,0,0,0.0044,-0.002,-0.0007,-0.1167,-0.6853,-0.0207},{0,0, 0,0.0009,0.0101,-0.0008,0.3469,-0.0784,-0.2875}}; double B[9][4]={{0,0,0,0},{0,0,0,0},{0,0,0,0},{0.0541,-0.0044,0.0218,-0.0007},{-0.0028, -0.0362,0.007,-0.0423},{0.0019,-0.0011,-0.3784,0},{0.001,-0.044,0.0154,-0.0339}, {-0.0136,0.001,-0.0013,-0.0001},{0,-0.004,-0.0162,0.0245}}; double a[9] = {0.0}; double b[9] = {0.0}; for(int j=0;j<9;j++) {a[i] += A[i][j]*(x[j]+dx);} for(int k=0;k<4;k++) {b[i] += B[k][0]*u[k];} return a[i]+b[i] ; } //主函数

龙格-库塔法(Runge-Kutta)matlab代码及含义

龙格-库塔法(Runge-Kutta) 数值分析中,龙格-库塔法(Runge-Kutta)是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。这些技术由数学家卡尔·龙格和马丁·威尔海姆·库塔于1900年左右发明。 经典四阶龙格库塔法 RK4””或者就是龙格库塔法的家族中的一个成员如此常用,以至于经常被称为“RK4 “龙格库塔法”。 令初值问题表述如下。 则,对于该问题的RK4由如下方程给出: 其中 这样,下一个值(yn+1)由现在的值(yn)加上时间间隔(h)和一个估算的斜率的乘积决定。该斜率是以下斜率的加权平均: k1是时间段开始时的斜率; k2是时间段中点的斜率,通过欧拉法采用斜率k1来决定y在点tn+h/2的值;k3也是中点的斜率,但是这次采用斜率k2决定y值; k4是时间段终点的斜率,其y值用k3决定。 当四个斜率取平均时,中点的斜率有更大的权值: RK4法是四阶方法,也就是说每步的误差是h5阶,而总积累误差为h4阶。 注意上述公式对于标量或者向量函数(y可以是向量)都适用。 显式龙格库塔法 显示龙格-库塔法是上述RK4法的一个推广。它由下式给出 其中

(注意:上述方程在不同著述中由不同但却等价的定义)。 要给定一个特定的方法,必须提供整数s(阶段数),以及系数aij(对于1≤j

欧拉法与龙格库塔法比较分析

解微分方程的欧拉法,龙格-库塔法简单实例比较 欧拉方法(Euler method)用以对给定初值的常微分方程(即初值问题)求解分为前EULER 法、后退EULER 法、改进的EULER 法。 缺点: 欧拉法简单地取切线的端点作为下一步的起点进行计算,当步数增多时,误差会因积累而越来越大。因此欧拉格式一般不用于实际计算。 改进欧拉格式(向前欧拉公式): 为提高精度,需要在欧拉格式的基础上进行改进。采用区间两端的斜率的平均值作为直线方程的斜率。改进欧拉法的精度为二阶。 算法: 微分方程的本质特征是方程中含有导数项,数值解法的第一步就是设法消除其导数值。对于常微分方程: (,)dy f x y dx = [,]x a b ∈ 0()y a y = 可以将区间[,]a b 分成n 段,那么方程在第i x 点有'()(,())i i i y x f x y x =,再用向前差商近似代替导数则为: ((1)())(,())i i i i y x y x f x y x h +-= 在这里,h 是步长,即相邻两个结点间的距离。因此可以根据i x 点和i y 的数值计算出1i y +来: 1(,)i i i i y y h f x y +=+?0,1,2,i L = 这就是向前欧拉公式。 改进的欧拉公式:

将向前欧拉公式中的导数(,)i i f x y 改为微元两端导数的平均,即上式便是梯形的欧拉公式。 可见,上式是隐式格式,需要迭代求解。为了便于求解,使用改进的欧拉公式: 数值分析中,龙格-库塔法(Runge-Kutta )是用于模拟常微分方程的解的重要的一类隐式或显式迭代法。实际上,龙格-库塔法是欧拉方法的一种推广,向前欧拉公式将导数项简单取为(,)n n f x y ,而改进的欧拉公式将导数项取为两端导数的平均。 龙格-库塔方法的基本思想: 在区间1[,]n n x x +内多取几个点,将他们的斜率加权平均,作为导数的近似。 龙格库塔法的家族中的一个成员如此常用,以至于经常被称为“RK4”或者就是“龙格库塔法”。 令初值问题表述如下。 '(,)y f t y =00()y t y = 则,对于该问题的RK4由如下方程给出: 11234(22)6 n n h y y k k k k +=++++ 其中 1(,)n n k f t y = 21(,)22 n n h h k f t y k =++ 32(,)22 n n h h k f t y k =++ 43(,)n n k f t h y hk =++

相关文档
最新文档