龙格-库塔(Runge-Kutta)方法数学原理及实现
来源:互联网 发布:金蝶进销存源码 编辑:程序博客网 时间:2024/05/21 22:37
龙格-库塔(Runge-Kutta)方法
龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。由于此算法精度高,采取措施对误差进行抑制,所以其实现原理也较复杂。该算法是构建在数学支持的基础之上的。
对于一阶精度的欧拉公式有:
其中
当用点
其中
依次类推,如果在区间
上述两组公式在形式删过的共同点:都是用
于是可考虑用函数
一般的龙格-库塔法的形式为
称为P阶龙格-库塔方法。
其中
当然,经典的龙格-库塔方法是四阶的。也就是在
下面介绍最常用的一种四阶龙格-库塔方法。
设
这里
其中
把
带入之后得到
龙格-库塔方法的推导基于Taylor展开方法,因而它要求所求的解具有较好的光滑性。如果解的光滑性差,那么,使用四阶龙格-库塔方法求得的数值解,其精度可能反而不如改进的欧拉方法。在实际计算时,应正对问题的具体特点选择适合的算法。对于光滑性不太好的解,最好采用低阶算法而将步长
龙格-库塔法的C语言实现
#include "stdio.h"#include "stdlib.h"void RKT(t,y,n,h,k,z)int n; /*微分方程组中方程的个数,也是未知函数的个数*/int k; /*积分的步数(包括起始点这一步)*/double t; /*积分的起始点t0*/double h; /*积分的步长*/double y[]; /*存放n个未知函数在起始点t处的函数值,返回时,其初值在二维数组z的第零列中*/double z[]; /*二维数组,体积为n x k.返回k个积分点上的n个未知函数值*/{ extern void Func(); /*声明要求解的微分方程组*/ int i,j,l; double a[4],*b,*d; b=malloc(n*sizeof(double)); /*分配存储空间*/ if(b == NULL) { printf("内存分配失败\n"); exit(1); } d=malloc(n*sizeof(double)); /*分配存储空间*/ if(d == NULL) { printf("内存分配失败\n"); exit(1); } /*后面应用RK4公式中用到的系数*/ a[0]=h/2.0; a[1]=h/2.0; a[2]=h; a[3]=h; for(i=0; i<=n-1; i++) z[i*k]=y[i]; /*将初值赋给数组z的相应位置*/ for(l=1; l<=k-1; l++) { Func(y,d); for (i=0; i<=n-1; i++) b[i]=y[i]; for (j=0; j<=2; j++) { for (i=0; i<=n-1; i++) { y[i]=z[i*k+l-1]+a[j]*d[i]; b[i]=b[i]+a[j+1]*d[i]/3.0; } Func(y,d); } for(i=0; i<=n-1; i++) y[i]=b[i]+h*d[i]/6.0; for(i=0; i<=n-1; i++) z[i*k+l]=y[i]; t=t+h; } free(b); /*释放存储空间*/ free(d); /*释放存储空间*/ return;}main(){ int i,j; double t,h,y[3],z[3][11]; y[0]=-1.0; y[1]=0.0; y[2]=1.0; t=0.0; h=0.01; RKT(t,y,3,h,11,z); printf("\n"); for (i=0; i<=10; i++) /*打印输出结果*/ { t=i*h; printf("t=%5.2f\t ",t); for (j=0; j<=2; j++) printf("y(%d)=%e ",j,z[j][i]); printf("\n"); }}void Func(y,d)double y[],d[];{ d[0]=y[1]; /*y0'=y1*/ d[1]=-y[0]; /*y1'=y0*/ d[2]=-y[2]; /*y2'=y2*/ return;}
ps:如果有时间的话,可能会回过头来加一分解方程的推到吧…
1 0
- 龙格-库塔(Runge-Kutta)方法数学原理及实现
- Matlab中龙格-库塔(Runge-Kutta)方法原理及实现
- Matlab中龙格-库塔(Runge-Kutta)方法原理及实现
- 龙格-库塔(Runge-Kutta)方法
- Runge-kutta法原理图示
- 通用龙格库塔Runge-Kutta方法求解…
- 四阶Runge-Kutta法解常微分方程
- 【计算方法笔记】python四阶Runge-Kutta法
- PCA数学原理及算法实现
- PCA数学原理及编程实现
- 数学,原理,方法,技巧
- RSA算法及数学原理
- LDA数学原理及优缺点
- asp防盗链原理及实现方法
- android Webservice实现方法及原理
- Android夜间模式原理及实现方法
- HashMap中实现原理及hashcode方法
- 神经网络sim实现原理,及原理坑的方法。
- 自定义结构---通用菜单
- 数字视频编解码基础知识大全
- 前缀判断
- leetcode 4 -- Median of Two Sorted Arrays
- centos7.1(1503)解决无法读取ntfs格式问题
- 龙格-库塔(Runge-Kutta)方法数学原理及实现
- [leetcode][list] Intersection of Two Linked Lists
- 4G百科:LTE-FDD和LTE-TDD的区别(科普性)
- Swift学习之每日一tip (6) 单例
- UVA 662 Fast Food(DP)
- U盘和电脑USB都是好的,可是插上u盘没任何反应!
- 黑马程序员 正则表达式
- ios视图层次结构
- hust校赛d题 PHP is the best language int the world(二分图着色+递推)