目录
1、概述
(1)常微分初值问题
(2)泰勒公式
(3)四阶Runge-Kutta算法
2、案例分析及代码
(1)案例
(2)代码
#include <stdio.h>
#include <math.h>
double F(double x,double y[4],double f[4])
{
f[1]=0*x+0*y[1]+0*y[2]+0*y[3]+1;
f[2]=0*x+0*y[1]+0*y[2]+1*y[3]+0;
f[3]=0*x+0*y[1]-1000*y[2]-100*y[3]+1000;
return(1);
}
void main()
{
double F(double x,double y[4],double f[4]);
double h=0.0005,x=0,Y[4],k[5][4],s[4],f[4],det,m[4]={0.025,0.045,0.085,0.1};
int i,j,t;
for(t=0;t<=3;t++) /*龙格—库塔算法*/
{
for(j=0;j<=3;j++)
Y[j]=0; //每求一组值后将初值条件还原为 0
for(i=1;i<=int(m[t]/h);i++)
{
for(j=1;j<=3;j++)
s[j]=Y[j];
det=F(x,s,f);
for(j=1;j<=3;j++)
k[1][j]=h*f[j]; /*四阶古典公式中的 k 值和求和的计算*/
for(j=1;j<=3;j++)
s[j]=Y[j]+0.5*k[1][j];
det=F(x+0.5*h,s,f);
for(j=1;j<=3;j++)
k[2][j]=h*f[j];
for(j=1;j<=3;j++)
s[j]=Y[j]+0.5*k[2][j];
det=F(x+0.5*h,s,f);
for(j=1;j<=3;j++)
k[3][j]=h*f[j];
for(j=1;j<=3;j++)
s[j]=Y[j]+k[3][j];
det=F(x+h,s,f);
for(j=1;j<=3;j++)
k[4][j]=h*f[j];
for(j=1;j<=3;j++)
Y[j]=Y[j]+(k[1][j]+2*k[2][j]+2*k[3][j]+k[4][j])/6;
x+=h;
}
for(j=1;j<=3;j++)
printf("y[%d](%f)=%f ",j,m[t],Y[j]);
printf("\n");
}
}
3、结果及讨论
Runge_Kutta 方法的优点:
1)精度高,不必用别的方法求开始几点的函数值。
2)可根据 f’(t,y)变化的情况与需要的精度自动修改步长。
3)程序简单,存储量少。
4)方法稳定