当前位置:文档之家› 用龙格库塔法解微分方程组

用龙格库塔法解微分方程组

用龙格库塔法解微分方程组
用龙格库塔法解微分方程组

#include

using namespace std;

int main()

{

double y1[100];double y2[100];double y3[100];int t=0;double h=0.1;double k[3][4];

int n;

y1[0]=0;y2[0]=0;y3[0]=0;

cout<

for(n=1;n<=100;n++)

{

k[0][0]=y2[n-1];

k[1][0]=y3[n-1];

k[2][0]=-800*y1[n-1]-80*y2[n-1]-24*y3[n-1]+1;

k[0][1]=y2[n-1]+h/2*k[1][0];

k[1][1]=y3[n-1]+h/2*k[2][0];

k[2][1]=-800*(y1[n-1]+h/2*k[0][0])-80*(y2[n-1]+h/2*k[1][0])-24*(y3[n-1]+h/2*k[2][0])+1;

k[0][2]=y2[n-1]+h/2*k[1][1];

k[1][2]=y3[n-1]+h/2*k[2][1];

k[2][2]=-800*(y1[n-1]+h/2*k[0][1])-80*(y2[n-1]+h/2*k[1][1])-24*(y3[n-1]+h/2*k[2][1])+1;

k[0][3]=y2[n-1]+h*k[1][2];

k[1][3]=y3[n-1]+h*k[2][2];

k[2][3]=-800*(y1[n-1]+h*k[0][2])-80*(y2[n-1]+h*k[1][2])-24*(y3[n-1]+h*k[2][2])+1;

y1[n]=y1[n-1]+h/6*(k[0][0]+2*k[0][1]+2*k[0][2]+k[0][3]);

y2[n]=y2[n-1]+h/6*(k[1][0]+2*k[1][1]+2*k[1][2]+k[1][3]);

y3[n]=y3[n-1]+h/6*(k[2][0]+2*k[2][1]+2*k[2][2]+k[2][3]);

cout<

}

cout<<"解答完毕。"<

return 0;

}

龙格库塔解微分方程

《数值分析》课程实验报告 一、实验目的 1.掌握用MA TLAB求微分方程初值问题数值解的方法; 2.通过实例学习微分方程模型解决简化的实际问题; 3.了解龙格库塔方法的基本思想。 二、实验内容 用龙格库塔方法求下列微分方程初值问题的数值解 y’=x+y y(0)=1 0

end fprintf(‘结果矩阵,第一列为x(n),第二列~第五列为k1~k4,第六列为y(n+1)的结果') z %在命令框输入下列语句 %yy=inline('x+y'); %>> rk(yy,0,1,0.2,0,1) %将得到结果 四、实验小结 通过实验结果分析可知,龙格库塔方法求解常微分方程能获得比较好的数值解,龙格库塔方法的数值解的精度较高,方法比较简便易懂。

MATLAB改进欧拉法与四阶龙格-库塔求解一阶常微分方程

姓名:樊元君学号:02 日期: 一、实验目的 掌握MATLAB语言、C/C++语言编写计算程序的方法、掌握改进欧拉法与四阶龙格-库塔求解一阶常微分方程的初值问题。掌握使用MATLAB程序求解常微分方程问题的方法。 : 二、实验内容 1、分别写出改进欧拉法与四阶龙格-库塔求解的算法,编写程序上机调试出结果,要求所编程序适用于任何一阶常微分方程的数值解问题,即能解决这一类问题,而不是某一个问题。 实验中以下列数据验证程序的正确性。 求,步长h=。 * 2、实验注意事项 的精确解为,通过调整步长,观察结果的精度的变化 ^ )

三、程序流程图: ●改进欧拉格式流程图: ~ |

●四阶龙格库塔流程图: ] 四、源程序: ●改进后欧拉格式程序源代码: function [] = GJOL(h,x0,y0,X,Y) format long h=input('h='); … x0=input('x0='); y0=input('y0='); disp('输入的范围是:'); X=input('X=');Y=input('Y='); n=round((Y-X)/h); \

i=1;x1=0;yp=0;yc=0; for i=1:1:n x1=x0+h; yp=y0+h*(-x0*(y0)^2);%yp=y0+h*(y0-2*x0/y0);% · yc=y0+h*(-x1*(yp)^2);%yc=y0+h*(yp-2*x1/yp);% y1=(yp+yc)/2; x0=x1;y0=y1; y=2/(1+x0^2);%y=sqrt(1+2*x0);% fprintf('结果=%.3f,%.8f,%.8f\n',x1,y1,y); : end end ●四阶龙格库塔程序源代码: function [] = LGKT(h,x0,y0,X,Y) 。 format long h=input('h='); x0=input('x0='); y0=input('y0='); disp('输入的范围是:'); " X=input('X=');Y=input('Y='); n=round((Y-X)/h); i=1;x1=0;k1=0;k2=0;k3=0;k4=0; for i=1:1:n ~ x1=x0+h; k1=-x0*y0^2;%k1=y0-2*x0/y0;% k2=(-(x0+h/2)*(y0+h/2*k1)^2);%k2=(y0+h/2*k1)-2*(x0+h/2)/(y0+h/2*k1);% k3=(-(x0+h/2)*(y0+h/2*k2)^2);%k3=(y0+h/2*k2)-2*(x0+h/2)/(y0+h/2*k2);% k4=(-(x1)*(y0+h*k3)^2);%k4=(y0+h*k3)-2*(x1)/(y0+h*k3);% … y1=y0+h/6*(k1+2*k2+2*k3+k4);%y1=y0+h/6*(k1+2*k2+2*k3+k4);% x0=x1;y0=y1; y=2/(1+x0^2);%y=sqrt(1+2*x0);% fprintf('结果=%.3f,%.7f,%.7f\n',x1,y1,y); end · end

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

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

1.经典四阶龙格库塔法解一阶微分方程组 1.1运用四阶龙格库塔法解一阶微分方程组算法分析 ),,(1k k k y x t f f =, )2,2,2(112g h y f h x h t f f k k k +++= )2 ,2,2(223g h y f h x h t f f k k k +++= ),,(334hg y hf x h t f f k k k +++= ),,(1k k k y x t g g = )2,2,2(112g h y f h x h t g g k k k +++= )2,2,2(223g h y f h x h t g g k k k +++= ),,(334hg y hf x h t g g k k k +++= ) 22(6 )22(6 43211 43211g g g g h y y f f f f h x x k k k k ++++=++++=++ 1k k t t h +=+ 经过循环计算由 推得 …… 每个龙格-库塔方法都是由一个合适的泰勒方法推导而来,使得其最终全局误差为() N O h ,一种折中方法是每次进行若干次函数求值,从而省去高阶导数计算。4阶龙格-库塔方法(RK4)是最常用的,它适用于一般的应用,因为它非常精 准,稳定,且易于编程。 000,,t x y ()()111222,,,,t x y t x y (1-1) (1-2) (1-3) (1-4) (1-5) (1-6) (1-7) (1-8) (1-9) (1-10)

1.2经典四阶龙格库塔法解一阶微分方程流程图 图1-1 经典四阶龙格库塔法解一阶微分方程流程图 1.3经典四阶龙格库塔法解一阶微分方程程序代码: #include #include using namespace std; void RK4( double (*f)(double t,double x, double y),double (*g)(double t,double x, double y) ,double initial[3], double resu[3],double h) { double f1,f2,f3,f4,g1,g2,g3,g4,t0,x0,y0,x1,y1; t0=initial[0];x0=initial[1];y0=initial[2]; f1=f(t0,x0,y0); g1=g(t0,x0,y0); f2=f(t0+h/2, x0+h*f1/2,y0+h*g1/2); g2=g(t0+h/2, x0+h*f1/2,y0+h*g1/2); f3=f(t0+h/2, x0+h*f2/2,y0+h*g2/2); g3=g(t0+h/2,

MATLAB龙格-库塔方法解微分方程

龙格-库塔方法是一种经典方法,具有很高的精度,它间接的利用了泰勒级数展开,避免了高阶偏导数的计算。此处以最为经典的四级四阶龙格-库塔方法为例,计算格式如下 ()()()11234121324 3226,,22,+22,n n n n n n n n n n h y y K K K K K f x y h h K f x y K h h K f x y K K f x h y hK +?=++++???=????=++? ???????=+? ?????=++? 1龙格-库塔法解一阶ODE 对于形如()()0, dy f x y a x b dx y a y ?=<≤???=? 的一阶ODE 初值问题,可以直接套用公式,如今可以借助计算机方便的进行计算,下面给出一个实例 ()2 0101dy x y x dx y y ?=-<≤???=? 取步长h=0.1 ,此处由数学知识可得该方程的精确解为y =。在这里利用MATLAB 编程,计算数值解并与精确解相比,代码如下: (1)写出微分方程,便于调用和修改 function val = odefun( x,y ) val = y-2*x/y; end (2)编写runge-kutta 方法的函数代码

function y = runge_kutta( h,x0,y0 ) k1 = odefun(x0,y0); k2 = odefun(x0+h/2,y0+h/2*k1); k3 = odefun(x0+h/2,y0+h/2*k2); k4 = odefun(x0+h,y0+h*k3); y = y0+h*(k1+2*k2+2*k3+k4)/6; end (3)编写主函数解微分方程,并观察数值解与精确解的差异clear all h = 0.1; x0 = 0; y0 = 1; x = 0.1:h:1; y(1) = runge_kutta(h,x0,y0); for k=1:length(x) x(k) = x0+k*h; y(k+1) = runge_kutta(h,x(k),y(k)); end z = sqrt(1+2*x); plot(x,y,’*’);

龙格库塔算法解微分方程组-c语言

This program is to solve the initial value problem of following system of differential equations: dx/dt=x+2*y,x(0)=0, dy/dt=2*x+y,y(0)=2, x and y are to be calculated ****************************************************************************/ #include<> #include<> #define steplength //步长?è可¨|根¨′据Y需¨¨要°a调ì??整; #define FuncNumber 2 //FuncNumber为a微?é分¤方¤程¨?的ì数oy目; void main() { float x[200],Yn[20][200],reachpoint;int i; x[0]=0;Yn[0][0]=0;Yn[1][0]=2; //初值|ì条?件t; reachpoint=; //所¨′求¨?点ì可¨|根¨′据Y需¨¨要°a调ì??整; void rightfunctions(float x ,float *Auxiliary,float *Func); void Runge_Kutta(float *x,float reachpoint, float(*Yn)[200]); Runge_Kutta(x ,reachpoint, Yn); printf("x "); for(i=0;i<=(reachpoint-x[0])/steplength;i++) printf("%f ",x[i]); printf("\nY1 "); for(i=0;i<=(reachpoint-x[0])/steplength;i++) printf("%f ",Yn[0][i]); printf("\nY2 "); for(i=0;i<=(reachpoint-x[0])/steplength;i++) printf("%f ",Yn[1][i]); getchar(); } void rightfunctions(float x ,float *Auxiliary,float *Func)//当ì?à右?¨°方¤程¨?改变à时o?à,ê需¨¨要°a改变à; { Func[0]=Auxiliary[0]+2*Auxiliary[1]; Func[1]=2*Auxiliary[0]+Auxiliary[1]; } void Runge_Kutta(float *x,float reachpoint, float(*Yn)[200]) { int i,j; float Func[FuncNumber],K[FuncNumber][4],Auxiliary[FuncNumber]; for(i=0;i<=(reachpoint-x[0])/steplength;i++) { for(j=0;j

龙格库塔算法解微分方程组 c语言

/*************************************************************************** This program is to solve the initial value problem of following system of differential equati ons: dx/dt=x+2*y,x(0)=0, dy/dt=2*x+y,y(0)=2, x(0.2) and y(0.2) are to be calculated ****************************************************************************/ #include #include #define steplength 0.1 //步?长?è可¨|根¨′据Y需¨¨要°a调ì??整?; #define FuncNumber 2 //FuncNumber为a微?é分¤?方¤?程¨?的ì?数oy目?; void main() { float x[200],Yn[20][200],reachpoint;i nt i; x[0]=0;Yn[0][0]=0;Yn[1][0]=2; //初?值|ì条??件t; reachpoint=0.2; //所¨′求¨?点ì?可¨|根¨′据Y需¨¨要°a调ì??整?; void rightfunctions(float x ,float *Auxiliary,float *Func); void R unge_Kutta(float *x,float reachpoint, float(*Yn)[200]); Runge_Kutta(x ,reachpoi nt, Yn); printf("x "); for(i=0;i<=(reachpoint-x[0])/steplength;i++) printf("%f ",x[i]); printf("\nY1 "); for(i=0;i<=(reachpoint-x[0])/steplength;i++) printf("%f ",Yn[0][i]); printf("\nY2 "); for(i=0;i<=(reachpoint-x[0])/steplength;i++) printf("%f ",Yn[1][i]); getchar(); } void rightfunctions(float x ,float *Auxiliary,float *Func)//当ì?à右?¨°方¤?程¨?改?变à?时o?à,ê?需¨¨要°a改?变à?; { Func[0]=Auxiliary[0]+2*Auxiliary[1]; Func[1]=2*Auxiliary[0]+Auxiliary[1]; } void R unge_Kutta(float *x,float reachpoint, float(*Yn)[200]) { int i,j; float Func[FuncNumber],K[FuncNumber][4],Auxiliary[FuncNumber]; for(i=0;i<=(reachpoint-x[0])/steplength;i++) { for(j=0;j

四阶龙格库塔法解微分方程

四阶龙格库塔法解微分方程 一、四阶龙格库塔法解一阶微分方程 ①一阶微分方程:cos ,初始值y(0)=0,求 y t 解区间[0 10]。 MATLAB程序: %%%%%%%%%%% 四阶龙哥库塔法解一阶微分方程%%%%%%%%%%% y'=cost %%%%%%%%%%% y(0)=0, 0≤t≤10,h=0.01 %%%%%%%%%%% y=sint h=0.01; hf=10; t=0:h:hf; y=zeros(1,length(t)); y(1)=0; F=@(t,y)(cos(t)); for i=1:(length(t)-1) k1=F(t(i),y(i)); k2=F(t(i)+h/2,y(i)+k1*h/2); k3=F(t(i)+h/2,y(i)+k2*h/2); k4=F(t(i)+h,y(i)+k3*h); y(i+1)=y(i)+1/6*(k1+2*k2+2*k3+k4)*h; end subplot(211) plot(t,y,'-') xlabel('t'); ylabel('y'); title('Approximation'); span=[0,10]; p=y(1); [t1,y1]=ode45(F,span,p); subplot(212)

plot(t1,y1) xlabel('t'); ylabel('y'); title('Exact'); 图1 ②一阶微分方程:()22*/x t x x t =- ,初始值x(1)=2,求解区间[1 3]。 MATLAB 程序: %%%%%%%%%%% 四阶龙哥库塔法解微分方程 %%%%%%%%%%% x'(t)=(t*x-x^2)/t^2 %%%%%%%%%%% x(1)=2, 1≤t ≤3, h=1/128 %%%%%%%%%%% 精确解:x(t)=t/(0.5+lnt) h=1/128; %%%%% 步长 tf=3; t=1:h:tf; x=zeros(1,length(t)); x(1)=2; %%%%% 初始值

龙格库塔法求微分方程2

《MATLAB 程序设计实践》课程考核 一、编程实现“四阶龙格-库塔(R-K )方法求常微分方程”,并举一 例应用之。 【实例】采用龙格-库塔法求微分方程: ?? ?==+-=0 , 0)(1 '00 x x y y y 1、算法说明: 在龙格-库塔法中,四阶龙格-库塔法的局部截断误差约为o(h5),被广泛应用于解微分方程的初值问题。其算法公式为: )22(6 3211k k k h y y n n +++=+ 其中: ?????????++=++=++ ==) ,() 21 ,21()21 ,21() ,(34 23121hk y h x f k hk y h x f k hk y h x f k y x f k n n n n n n n n 2、流程图: 2.1、四阶龙格-库塔(R-K )方法流程图:

2.2、实例求解流程图:

3、源程序代码 3.1、四阶龙格-库塔(R-K)方法源程序: function [x,y] = MyRunge_Kutta(fun,x0,xt,y0,PointNum,varargin) %Runge-Kutta 方法解微分方程形为 y'(t)=f(x,y(x)) %此程序可解高阶的微分方程。只要将其形式写为上述微分方程的向量形式 %函数 f(x,y): fun %自变量的初值和终值:x0, xt %y0表示函数在x0处的值,输入初值为列向量形式 %自变量在[x0,xt]上取的点数:PointNum %varargin为可输入项,可传适当参数给函数f(x,y) %x:所取的点的x值 %y:对应点上的函数值 if nargin<4 | PointNum<=0 PointNum=100; end if nargin<3 y0=0; end y(1,:)=y0(:)'; %初值存为行向量形式h=(xt-x0)/(PointNum-1); %计算步长 x=x0+[0:(PointNum-1)]'*h; %得x向量值 for k=1:(PointNum)%迭代计算 f1=h*feval(fun,x(k),y(k,:),varargin{:}); f1=f1(:)'; %得公式k1 f2=h*feval(fun,x(k)+h/2,y(k,:)+f1/2,varargin{:}); f2=f2(:)'; %得公式k2 f3=h*feval(fun,x(k)+h/2,y(k,:)+f2/2,varargin{:}); f3=f3(:)'; %得公式k3 f4=h*feval(fun,x(k)+h,y(k,:)+f3,varargin{:}); f4=f4(:)'; %得公式k4 y(k+1,:)=y(k,:)+(f1+2*(f2+f3)+f4)/6; %得y(n+1) end 3.2、实例求解源程序: %运行四阶R-K法

蒙特卡洛求定积及龙哥库塔解微分方程

蒙特卡洛法求定积分: 整体思路,蒙特卡洛求定积分的主要思想就是通过在取值范围内大量随机数的随机选取对函数进行求值,进而除以所取次数并乘以其区间,即为所积值。 Step 1: 在执行程序前,打开matlab,执行以下操作打开File—>New—>Function,并点击Function,弹出Editor窗口,将其中内容修改为 function [ y ] = f( x ) y=cos(x)+2.0; end (如图所示)。 Step 2: 在Editor窗口中点击File—>Save As,保存至所建立的文件夹内,保存名称必须为f.m。 Step 3: 回到Matlab程序中,将Current Folder改为与刚刚Function函数定义的保存路径一致的路径。Step 4: 在Command Window里输入以下源程序。 源程序: >> n=10^6; %用来表示精度,表示需要执行次数。 >> y=0; %初始化y=0,因为f(x)=cos(x)+2.0,下面出现y=y+f(x),故尔y用来统计计算出的所有f(x)值的和。 >> count=1; %从1开始计数,显然要执行n次。 >> while count<=n %当执行次数少于n次时,继续执行 x=unifrnd(0,4); %在matlab中,unifrnd是在某个区间内均匀选取实数(可为小数或整 数),表示x取0到4的任意数。 y=y+f(x); %求出到目前为止执行出的所有f(x)值的和,并用y表示 count=count+1; %count+1表示已执行次数再加一,将来通过与n的比对,判断是否执行下一次 end %如果执行次数已达n次,那么结束循环 z=y/n*4 %用y除以执行次数n,那么取得平均值,并用它乘以区间长度4,即可得到z 的近似值 z=7.2430 由于matlab中不能使用θ字符,故用z代替,即可得到θ=7.2395。 在执行过程中,发现每一次执行结果都会不一样,这是因为是随机选取,所以不同次数的计算结果会有偏差,但由于执行次数很多,从概率的角度来讲都是与真实值相近似的值。

龙格-库塔法求微分方程2

《MATLAB 程序设计实践》课程考核 一、编程实现“四阶龙格-库塔(R-K )方法求常微分方程”,并举一 例应用之。 【实例】采用龙格-库塔法求微分方程: ? ? ?==+-=0 , 0)(1 '00x x y y y 1、算法说明: 在龙格-库塔法中,四阶龙格-库塔法的局部截断误差约为o(h5),被广泛应用于解微分 方程的初值问题。其算法公式为: )22(6 3211k k k h y y n n +++ =+ 其中: ?????????++=+ + =++==) ,() 21 ,21()21 ,21(),(34 23121hk y h x f k hk y h x f k hk y h x f k y x f k n n n n n n n n 2、流程图: 2.1、四阶龙格-库塔(R-K )方法流程图:

2.2、实例求解流程图:

3、源程序代码 3.1、四阶龙格-库塔(R-K)方法源程序: function [x,y] = MyRunge_Kutta(fun,x0,xt,y0,PointNum,varargin) %Runge-Kutta 方法解微分方程形为 y'(t)=f(x,y(x)) %此程序可解高阶的微分方程。只要将其形式写为上述微分方程的向量形式 %函数 f(x,y): fun %自变量的初值和终值:x0, xt %y0表示函数在x0处的值,输入初值为列向量形式 %自变量在[x0,xt]上取的点数:PointNum %varargin为可输入项,可传适当参数给函数f(x,y) %x:所取的点的x值 %y:对应点上的函数值 if nargin<4 | PointNum<=0 PointNum=100; end if nargin<3 y0=0; end y(1,:)=y0(:)'; %初值存为行向量形式h=(xt-x0)/(PointNum-1); %计算步长 x=x0+[0:(PointNum-1)]'*h; %得x向量值 for k=1:(PointNum) %迭代计算 f1=h*feval(fun,x(k),y(k,:),varargin{:}); f1=f1(:)'; %得公式k1 f2=h*feval(fun,x(k)+h/2,y(k,:)+f1/2,varargin{:}); f2=f2(:)'; %得公式k2 f3=h*feval(fun,x(k)+h/2,y(k,:)+f2/2,varargin{:}); f3=f3(:)'; %得公式k3 f4=h*feval(fun,x(k)+h,y(k,:)+f3,varargin{:}); f4=f4(:)'; %得公式k4 y(k+1,:)=y(k,:)+(f1+2*(f2+f3)+f4)/6; %得y(n+1) end 3.2、实例求解源程序: %运行四阶R-K法

四阶龙格-库塔法解微分方程(C++)

一.作业: 用四阶龙格—库塔法求下列方程: ()()()1010100y x y x y '=-≤≤???=??步长0.1h =。并与解析解2 51x y e -=-比较。 二.程序 #include #include #include using namespace std; double f(double x,double y){ return 10*x*(1-y); } int main(){ int n,i; double h,k1,k2,k3,k4; cout<<"Please input the number of intervals:"; cin>>n; double *x=new double [n+1]; double *y=new double [n+1]; double *y1=new double [n+1]; h=1.0/n; y[0]=0; for(i=0;i<=n;i++){ x[i]=i*h; k1=f(x[i],y[i]); k2=f(x[i]+h/2,y[i]+k1*h/2); k3=f(x[i]+h/2,y[i]+k2*h/2); k4=f(x[i]+h,y[i]+k3*h); y[i+1]=y[i]+(k1+2*k2+2*k3+k4)*h/6; y1[i]=1-exp(-5*pow(x[i],2)); cout<

左侧为数值解,右侧为解析解.

求解常微分方程组初值问题的龙格库塔法分析及其C代码

求解常微分方程组初值问题的 龙格库塔法分析及其C 代码 1、概 述 由高等数学的知识可知,一些特殊类型的常微分方程(组)能够求出给定初始值的解析解,而在科学与工程问题中遇到的常微分方程(组)往往是极其复杂的,要想求得其给定初始值的解析解就变得极其困难,甚至是得不到解析解。尽管如此,在研究实际问题时,往往只需要获得若干点上的近似值就行了,这就说明研究常微分方程(组)的数值解法是很有必要的。求解常微分方程(组)的数值解法有多种,比如欧拉法、龙格库塔法、线性多步法等等,其中龙格库塔法是这几种方法中比较常用的,因为其计算精度较高且具有自启动的特点。 对于用龙格库塔法求解单个常微分方程和求解常微分方程组的思路基本相似(注意一点一个微分方程组是常微分方程组即表明微分方程中的各阶导数都是对同一个变量求导,例如可以把各个量对时间求导得到一个常微分方程组,如果一个微分方程组中的有对不同变量的导数那么这个方程组就成了偏微分方程组),都是根据泰勒展开得到其迭代计算形式,其基本思想都是按照一定原则求取当前点附近一些点的斜率,通过这些斜率的线性组合作为当前点处的斜率,进行递推求解。 2、数学模型 2.1 常微分方程初值问题的数学模型 000 (,) ()()dy f x y x x dx y x y ?=>???=? (1) 式中(,) f x y 为,x y 的已知函数,0y 为给定的初始值。 常微分方程的数值解法的任务就是要求出函数值y 在微分自变量x 取如下序列: 012n x x x x <<< 时的值() (1,2,3,)i y x i n = 的近似值(1,2,3,)i y i n = ,一般情况下都采取等距结点的方式,即:0 (1,2,)i x x ih i n =+= ,其中h 为相邻两结点的距离,称为步长。 2.2 常微分方程组初值问题的数学模型

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

解微分方程的欧拉法,龙格-库塔法简单实例比较 欧拉方法(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 =++

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 指导教师:日期: 教研室主任:日期:

四阶龙格库塔法解一阶二元微分方程

四阶龙格库塔法解一阶二元微分方程 //dxi/dt=c*(xi-xi^3/3+yi)+K*(X-xi)+c*zi //dyi/dt=(xi-b*yi+a)/c //i=1,2,3 //X=sum(xi)/N #include #include #include #include #define N 1000 //定义运算步数; #define h 0.01 //定义步长; float a,b,c;//定义全局变量常数a,b,c //定义微分方程: double fx(double x[],double dx,double y[],double dy,double z[],int i,double k,double xavg){ int j; double xi,yi; xi=x[i]+dx; yi=y[i]+dy; return c*(xi-pow(xi,3)/3+yi)+k*(xavg-xi)+c*z[i]; } double fy(double x[],double dx,double y[],double dy,int i){ double xi,yi; xi=x[i]+dx; yi=y[i]+dy; return (xi-b*yi+a)/c; } void main(){ double Kx[3][4],Ky[3][4],x[3]={1,2,3},y[3]={2,3,4},xavg,k=0;//定义x,y的初值;double z[3]={0}; int i,j,m,n,S; FILE *fp1,*fp; fp=fopen("sjy.txt","w"); fp1=fopen("sjykxy.txt","w"); fprintf(fp1,"k\tx1\tx2\tx3\ty1\ty2\ty3\n"); if(fp==NULL||fp1==NULL){ printf("Failed to open file.\n"); getch(); return;

龙格库塔法求微分方程matlab

龙格—库塔方法求解微分方程初值问题 (数学1201+41262022+陈晓云) 初值问题: y x x -+=2dx dy ,10≤≤x 1)0(y = 四阶龙格-库塔公式: ()y x K n n ,f 1= ????? ? ??+=+K h y x K n h n 122f ,2 ??? ??++=K y x f K h n h n 232,2 ()K h y h x f K n n 34,++= ()K K K K y y h n 4 3211n 226++++=+ 程序: 1)建立四阶龙格-库塔函数 function [ x,y ] = nark4( dyfun,xspan,y0,h ) % dyfun 为一阶微分方程的函数;y0为初始条件;xspan 表示x 的区间;h 为区间的步长; x=xspan(1):h:xspan(2); y(1)=y0; for n=1:length(x)-1 k1=feval(dyfun,x(n),y(n)); k2=feval(dyfun,x(n)+h/2,y(n)+h/2*k1); k3=feval(dyfun,x(n)+h/2,y(n)+h/2*k2); k4=feval(dyfun,x(n+1),y(n)+h*k3); y(n+1)=y(n)+h*(k1+k2*2+2*k3+k4)/6; end x=x;y=y;

2)执行程序(m文件) dyfun=inline('x^2+x-y'); [x,y1]=nark4(dyfun,[0,1],1,0.1); x=0:0.1:1; Format long y2=x.^2-x+1 R4=y2-y1 [x',y1',y2',R4'] y2=dsolve('Dy=x^2+x-y','y(0)=1','x') plot(x,y1,'b*-') hold on y3=inline('x^2-x+1') fplot(y3,[0,1],'ro-') legend('R-K4','解析解') 3)执行结果 ans = X RK4近似值解析值 0 1.000000000000000 1.000000000000000 0.100000000000000 0.910000208333333 0.910000000000000 0.200000000000000 0.840000396841146 0.840000000000000 0.300000000000000 0.790000567410084 0.790000000000000 0.400000000000000 0.760000721747255 0.760000000000000 0.500000000000000 0.750000861397315 0.750000000000000 0.600000000000000 0.760000987757926 0.760000000000000 0.700000000000000 0.790001102093746 0.790000000000000 0.800000000000000 0.840001205549083 0.840000000000000 0.900000000000000 0.910001299159352 0.910000000000000 1.000000000000000 1.000001383861433 1.000000000000000

相关主题
文本预览
相关文档 最新文档