四阶龙格库塔法C语言(西安交大)

四阶龙格库塔法C语言(西安交大)
四阶龙格库塔法C语言(西安交大)

#include

#include

double fxy(double xi,double yi) /*定义函数fxy*/

{

double y;

y=yi-2*xi/yi;

return(y);

}

void main()

{

double x0,y0,h,xi,yi,yi_1,xk2,yk2,xk3,yk3,xk4,yk4,k1,k2,k3,k4;

int i;

x0=0; /*赋初始值*/

y0=1;

h=0.1;

xi=x0;

yi=y0;

for(i=1;i<=10;i++) /*循环开始*/

{

k1=h*fxy(xi,yi); /*求解k1值*/

xk2=xi+0.5*h; /*求解k2的值*/

yk2=yi+0.5*k1;

k2=h*fxy(xk2,yk2);

xk3=xi+0.5*h; /*求解k3的值*/

yk3=yi+0.5*k2;

k3=h*fxy(xk3,yk3);

xk4=xi+h; /*求解k4的值*/

yk4=yi+k3;

k4=h*fxy(xk4,yk4);

yi_1=yi+(k1+2*k2+2*k3+k4)/6; /*求解yi+1的值*/

yi=yi_1;

if(i==1)

{

printf("输出函数yi的近似值:\n"); /*输出所有的yi值*/

printf("y0 = %.10f ",y0);

}

printf("y%d = %.10f ",i,yi);

if((i+1)%3==0) /*每行显示三个数值*/

printf("\n");

}

printf("\n");

}

matlab 四阶龙格-库塔法求微分方程

Matlab 实现四阶龙格-库塔发求解微分方程 从理论上讲,只要函数在某区间上充分光滑,那么它可以展开为泰勒级数,因此在该区间上的函数值可用各阶导数值近似地表示出来,反之其各阶导数值也可用某些函数值的线性组合近似地表示出来。龙格-库塔法就是将待求函数)(t y 展开为泰勒级数,并用方程函数),(y f t 近似其各阶导数,从而迭代得到)(t y 的数值解。具体来说,四阶龙格-库塔迭代公式为 )22(6 143211k k k k h n n ++++=+y y ),(1n n t k y f = )2/,2/(12hk h t k n n ++=y f )2/,2/(23hk h t k n n ++=y f ),(33hk h t k n n ++=y f 实验内容: 已知二阶系统21x x = ,u x x x 5.02.04.0212+--= ,0)0()0(21==x x ,u 为单位阶跃信号。用四阶龙格-库塔法求数值解。分析步长对结果的影响。 实验总结: 实验报告要求简要的说明实验原理;简明扼要地总结实验内容;编制m 文件,并给出运行结果。报告格式请按实验报告模板编写。 进入matlab , Step1:choose way1 or way2 way1): 可以选择直接加载M 文件(函数M 文件)。 way2): 点击new ——function ,先将shier (函数1文本文件)复制运行; 点击new ——function ,再将RK (函数2文本文件)运行; 点击new ——function ,再将finiRK (函数3文本文件)运行;

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.掌握利用四阶龙格-库塔(Runge-Kutta)法进行控制系统数字仿真的方 法。 2.学习分析高阶系统动态性能的方法。 3.学习系统参数改变对系统性能的影响。 二、实验内容 已知系统结构如下图 若输入为单位阶跃函数,计算当超调量分别为5%,25%,和50%时K的取值(用主导极点方法估算),并根据确定的K值在计算机上进行数字仿真。 三、实验过程 1.计算K值 二阶系统单位阶跃响应的超调量 %100% =? 1.当σ%=5%时

解得 ζ=0.690 设主导极点 =ζa + a=0.69a+j0.72a 代入D (s )= 32 1025s s s K +++=0中, 32(0.690.72)10(0.690.72)25(0.690.72)0 a j a a j a a j a K ++++++=解得K=31.3,a=-2.10 即1,2 1.45 1.52s j =-± 2. 当σ%=25%时 解得 ζ=0.403 设主导极点 =ζa + a=0.403a+j0.915a 代入D (s )= 321025s s s K +++=0中, 32(0.4030.915)10(0.4030.915)25(0.4030.915)0 a j a a j a a j a K ++++++=解得K=59.5,a=-2.75 即1,2 1.11 2.53s j =-± 3. 当σ%=50%时 解得 ζ=0.215 设主导极点 =ζa + a=0.215a+j0.977a 代入D (s )= 321025s s s K +++=0中, 32(0.2150.977)10(0.2150.977)25(0.2150.977)0 a j a a j a a j a K ++++++=解得K=103,a=-3.48

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

例题一 四阶龙格-库塔法的具体形式为: 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

四阶龙格库塔法原理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

标准四阶龙格——库塔法

实验名:常微分方程数值解法 实习目的: (1) 通过实习进一步掌握标准四阶龙格——库塔法的基本思想; (2) 通过对标准四阶龙格——库塔法的调试练习,进一步体会其特点; (3) 通过实习进一步掌握标准四阶龙格——库塔法的计算步骤,并能灵活应用; (4) 通过上机调试运行,逐步培养解决实际问题的编程能力。 实习要求: (1) 熟悉Turbo C 的编译环境; (2) 实习前复习标准四阶龙格——库塔法的基本思想和过程; (3) 实习前复习标准四阶龙格——库塔法的计算步骤。 实习设备: (1) 硬件设备:单机或网络环境下的微型计算机一台; (2) 软件设备:DOS3.3以上操作系统,Turbo C2.0编译器。 实习内容: 标准四阶龙格——库塔法: (1)使用标准四阶龙格——库塔法求解初值问题 的数值求解。 (2)要求: 请写出程序的运行结果: 程序代码: #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++) 1(0)y 1x 0 2xy y =≤≤='

{ 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); printf("y(%f)=%6.6f",y0,e); } 运行结果: (3)思考题: 标准四阶龙格——库塔法的基本思想是什么? 龙格和库塔提出了一种间接地运用Taylor公式的方法,即利用y(x)在若干个待定点上的函数值和导数值做出线性组合式,选取适当系数使这个组合式进Taylor展开后与y(xi+1)的Taylor 展开式有较多的项达到一致,从而得出较高阶的数值公式,这就是龙格—库塔法的基本思想。

龙格库塔方法及其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研究的方法 对实例的研究对比,实现精度的要求,龙格库塔是并不是一个固定的公式,所以只是对典 型进行分析

常微分方程组的四阶RungeKutta龙格库塔法matlab实现

常微分方程组的四阶Runge-Kutta方法1.问题: 1.1若用普通方法-----仅适用于两个方程组成的方程组 编程实现: 创建M 文件: function R = rk4(f,g,a,b,xa,ya,N) %UNTITLED2 Summary of this function goes here % Detailed explanation goes here %x'=f(t,x,y) y'=g(t,x,y) %N为迭代次数 %h为步长 %ya,xa为初值 f=@(t,x,y)(2*x-0.02*x*y);

g=@(t,x,y)(0.0002*x*y-0.8*y); h=(b-a)/N; T=zeros(1,N+1); X=zeros(1,N+1); Y=zeros(1,N+1); T=a:h:b; X(1)=xa; Y(1)=ya; for j=1:N f1=feval(f,T(j),X(j),Y(j)); g1=feval(g,T(j),X(j),Y(j)); f2=feval(f,T(j)+h/2,X(j)+h/2*f1,Y(j)+g1/2); g2=feval(g,T(j)+h/2,X(j)+h/2*f1,Y(j)+h/2*g1); f3=feval(f,T(j)+h/2,X(j)+h/2*f2,Y(j)+h*g2/2); g3=feval(g,T(j)+h/2,X(j)+h/2*f2,Y(j)+h/2*g2); f4=feval(f,T(j)+h,X(j)+h*f3,Y(j)+h*g3); g4=feval(g,T(j)+h,X(j)+h*f3,Y(j)+h*g3); X(j+1)=X(j)+h*(f1+2*f2+2*f3+f4)/6; Y(j+1)=Y(j)+h*(g1+2*g2+2*g3+g4)/6; R=[T' X' Y']; end 情况一:对于x0=3000,y0=120 控制台中输入: >> rk4('f','g',0,10,3000,120,10) 运行结果: ans = 1.0e+003 * 0 3.0000 0.1200 0.0010 2.6637 0.0926 0.0020 3.7120 0.0774 0.0030 5.5033 0.0886 0.0040 4.9866 0.1193 0.0050 3.1930 0.1195 0.0060 2.7665 0.0951 0.0070 3.6543 0.0799 0.0080 5.2582 0.0884 0.0090 4.9942 0.1157 0.0100 3.3541 0.1185 数据:

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

四阶龙格——库塔法

2013-2014(1)专业课程实践论文题目:四阶龙格—库塔法

一、算法理论 由定义可知,一种数值方法的精度与局部截断误差()p o h 有关,用一阶泰勒展开式近似函数得到欧拉方法,其局部截断误差为一阶泰勒余项2()o h ,故是一阶方法,完全类似地若用p 阶泰勒展开式 2 '''() 11()()()......()() 2!!p p p n n n n n h h y y x hy x y x y x O h p ++=+++++ 进行离散化,所得计算公式必为p 阶方法,式中 '''''()(,),()(,)(,)(,).... x y x f x y y x f x y f x y f x y ==++ 由此,我们能够想到,通过提高泰勒展开式的阶数,可以得到高精度的数值方法,从理论上讲,只要微分方程的解()y x 充分光滑,泰勒展开方法可以构造任意的有限阶的计算公式,但事实上,具体构造这种公式往往相当困难,因为符合函数(,())f x y x 的高阶导数常常是很烦琐的,因此,泰勒展开方法一般不直接使用,但是我们可以间接使用泰勒展开方法,求得高精度的计算方法。 首先,我们对欧拉公式和改进欧拉公式的形式作进一步的分析。 如果将欧拉公式和改进的欧拉公式改写成如下的形式: 欧拉公式 {111(,)n n n n y y hK K f x y +==+ 改进的欧拉公式 11211()22 n n y y h K K +=++, 1(,)n n K f x y =, 21(,)n n K f x h y hK =++。 这两组公式都是用函数(,)f x y 在某些点上的值的线性组合来计算1()n y x +的近似值1n y +,欧拉公式每前进一步,就计算一次(,)f x y 的值。另一方面它是1()n y x +在n x 处的一阶泰勒展开式,因而是一阶方法。改进的欧拉公式每前进一步,

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

四阶龙格库塔法解微分方程 一、四阶龙格库塔法解一阶微分方程 ①一阶微分方程: cos y t & ,初始值y(0)=0,求解区间[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;

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

四阶龙格库塔法解一阶二元微分方程 //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;

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

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

可以得出四阶龙格-库塔公式,也就是在工程中应用广泛的经典龙格-库塔算法,即: 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); }

四阶龙格库塔算法

//状态方程 /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] ; } //主函数

三阶、四阶龙格库塔函数matlab代码

三阶龙格—库塔法的计算公式为: )4(6 ) 2,()2,2() ,(3211213121K K K h y y hK hK y h x g K K h y h x g K y x g K i i i i i i i i +++=+-+=++==+ 三阶龙格—库塔公式的Matlab 程序代码: function y = DELGKT3_kuta(f, h,a,b,y0,varvec) format long; N = (b-a)/h; y = zeros(N+1,1); y(1) = y0; x = a:h:b; var = findsym(f); for i=2:N+1 K1 = Funval(f,varvec,[x(i-1) y(i-1)]); K2 = Funval(f,varvec,[x(i-1)+h/2 y(i-1)+K1*h/2]); K3 = Funval(f,varvec,[x(i-1)+h y(i-1)-h*K1+K2*2*h]); y(i) = y(i-1)+h*(K1+4*K2+K3)/6; end format short; DELGKT3_kuta 函数运行时需要调用下列函数: function fv=Funval(f, varvec, varval) var= findsym(f); if length(var)<4 if var(1)==varvec(1) fv=subs(f,varvec(1),varval(1)); else fv=subs(f,varvec(2),varval(2)); end else fv=subs(f,varvec,varval); end 三阶龙格—库塔求解一阶常微分方程应用实例。用三阶龙格—库塔法求下面常微分方程的数值解。 ?????=+-=1 )0(232y y x dx dy 10≤≤x

龙格库塔法的编程

龙格库塔法的编程 #include #include /*n表示几等分,n+1表示他输出的个数*/ int RungeKutta(double y0,double a,double b,int n,double *x,double *y,int style,double (*function)(double,double)) { double h=(b-a)/n,k1,k2,k3,k4; int i; // x=(double*)malloc((n+1)*sizeof(double)); // y=(double*)malloc((n+1)*sizeof(double)); x[0]=a; y[0]=y0; switch(style) { case 2: for(i=0;i

相关主题
相关文档
最新文档