GRKT10.C
上传用户:bjtelijie
上传日期:2010-01-01
资源大小:87k
文件大小:2k
源码类别:

数学计算

开发平台:

Visual C++

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. void RKT(t,y,n,h,k,z)
  4. int n; /*微分方程组中方程的个数,也是未知函数的个数*/
  5. int k; /*积分的步数(包括起始点这一步)*/
  6. double t; /*积分的起始点t0*/
  7. double h; /*积分的步长*/
  8. double y[]; /*存放n个未知函数在起始点t处的函数值,返回时,其初值在二维数组z的第零列中*/
  9. double z[]; /*二维数组,体积为n x k.返回k个积分点上的n个未知函数值*/
  10. {
  11. extern void Func(); /*声明要求解的微分方程组*/
  12.     int i,j,l;
  13.     double a[4],*b,*d;
  14.     b=malloc(n*sizeof(double)); /*分配存储空间*/
  15. if(b == NULL)
  16. {
  17. printf("内存分配失败n");
  18. exit(1);
  19. }
  20.     d=malloc(n*sizeof(double)); /*分配存储空间*/
  21. if(d == NULL)
  22. {
  23. printf("内存分配失败n");
  24. exit(1);
  25. }
  26. /*后面应用RK4公式中用到的系数*/
  27.     a[0]=h/2.0;
  28. a[1]=h/2.0;
  29.     a[2]=h; 
  30. a[3]=h;
  31.     for(i=0; i<=n-1; i++) 
  32. z[i*k]=y[i]; /*将初值赋给数组z的相应位置*/
  33.     for(l=1; l<=k-1; l++)
  34.     {
  35. Func(y,d);
  36.         for (i=0; i<=n-1; i++)
  37. b[i]=y[i];
  38.         for (j=0; j<=2; j++)
  39.         {
  40. for (i=0; i<=n-1; i++)
  41.             {
  42. y[i]=z[i*k+l-1]+a[j]*d[i];
  43.                 b[i]=b[i]+a[j+1]*d[i]/3.0;
  44.             }
  45.             Func(y,d);
  46.         }
  47.         for(i=0; i<=n-1; i++)
  48.           y[i]=b[i]+h*d[i]/6.0;
  49.         for(i=0; i<=n-1; i++)
  50.           z[i*k+l]=y[i];
  51.         t=t+h;
  52. }
  53.     free(b); /*释放存储空间*/
  54. free(d); /*释放存储空间*/
  55.     return;
  56. }
  57. main()
  58. {
  59. int i,j;
  60.     double t,h,y[3],z[3][11];
  61.     y[0]=-1.0; 
  62. y[1]=0.0; 
  63. y[2]=1.0;
  64.     t=0.0; 
  65. h=0.01;
  66.     RKT(t,y,3,h,11,z);
  67.     printf("n");
  68.     for (i=0; i<=10; i++) /*打印输出结果*/
  69.     {
  70. t=i*h;
  71.         printf("t=%5.2ft   ",t);
  72.         for (j=0; j<=2; j++)
  73.           printf("y(%d)=%e  ",j,z[j][i]);
  74.         printf("n");
  75. }
  76. }
  77. void Func(y,d)
  78. double y[],d[];
  79. {
  80. d[0]=y[1]; /*y0'=y1*/
  81. d[1]=-y[0]; /*y1'=y0*/
  82. d[2]=-y[2]; /*y2'=y2*/
  83. return;
  84. }