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

数学计算

开发平台:

Visual C++

  1. #include "stdio.h"
  2. #include "stdlib.h"
  3. #include <math.h>
  4. int Func(y,d)
  5. double y[],d[];
  6. {
  7. d[0]=y[1]; /*y0'=y1*/
  8. d[1]=-y[0]; /*y1'=y0*/
  9. d[2]=-y[2]; /*y2'=y2*/
  10. return(1);
  11. }
  12. void Euler1(t,y,n,h,k,z)
  13. int n; /*整型变量,微分方程组中方程的个数,也是未知函数的个数*/
  14. int k; /*整型变量。积分步数(包括起始点这一步)*/
  15. double t; /*双精度实型变量,对微分方程进行积分的起始点t0*/
  16. double h; /*双精度实型变量。积分步长*/
  17. double y[]; /*双精度实型一维数组,长度为n。存放n个未知函数yi在起始点t0处的函数值*/
  18. double z[]; /*双精度实型二维数组,体积为nxk。返回k个积分点(包括起始点)上的未知函数值*/
  19. extern int Func();
  20. int i,j;
  21. double *d;
  22. d=malloc(n*sizeof(double));
  23. if(d == NULL)
  24. {
  25. printf("内存分配失败n");
  26. exit(1);
  27. }
  28. /*将方程组的初值赋给数组z[i*k]*/
  29. for (i=0; i<=n-1; i++)
  30. z[i*k]=y[i];
  31. for (j=1; j<=k-1; j++)
  32. {
  33. Func(y,d); /*求出f(x)*/
  34. for(i=0; i<=n-1; i++)
  35. y[i]=z[i*k+j-1]+h*d[i];
  36. Func(y,d);
  37. for (i=0; i<=n-1; i++)
  38. d[i]=z[i*k+j-1]+h*d[i];
  39. for (i=0; i<=n-1; i++)
  40. {
  41. y[i]=(y[i]+d[i])/2.0;
  42. z[i*k+j]=y[i];
  43. }
  44. }
  45.     free(d); 
  46. return;
  47.   }
  48. void Euler2(t,h,y,n,eps)
  49. int n;
  50. double t,h,eps,y[];
  51. {
  52. int i,j,m;
  53. double hh,p,q,*a,*b,*c,*d;
  54.     a=malloc(n*sizeof(double));
  55.     b=malloc(n*sizeof(double));
  56.     c=malloc(n*sizeof(double));
  57.     d=malloc(n*sizeof(double));
  58.     hh=h;
  59. m=1; 
  60. p=1.0+eps;
  61. for (i=0; i<=n-1; i++) a[i]=y[i];
  62.     while (p>=eps)
  63.     {
  64. for (i=0; i<=n-1; i++)
  65.         {
  66. b[i]=y[i];
  67. y[i]=a[i];
  68. }
  69.         for (j=0; j<=m-1; j++)
  70.         {
  71. for (i=0; i<=n-1; i++) 
  72. c[i]=y[i];
  73.             Func(y,d);
  74.             for (i=0; i<=n-1; i++)
  75.                 y[i]=c[i]+hh*d[i];
  76.             Func(y,d);
  77.             for (i=0; i<=n-1; i++)
  78.                 d[i]=c[i]+hh*d[i];
  79.             for (i=0; i<=n-1; i++)
  80.                 y[i]=(y[i]+d[i])/2.0;
  81.         }
  82.         p=0.0;
  83.         for (i=0; i<=n-1; i++)
  84.         {
  85. q=fabs(y[i]-b[i]);
  86.             if (q>p) p=q;
  87.         }
  88.         hh=hh/2.0; m=m+m;
  89. }
  90.     free(a); 
  91. free(b); 
  92. free(c);
  93. free(d);
  94. return;
  95. }
  96. main()
  97. {
  98. int i,j;
  99. double y[3],z[3][11],t,h,x,eps;
  100. y[0]=-1.0; /*初值y0(0)=-1.0*/
  101. y[1]=0.0; /*初值y1(0)=-1.0*/
  102. y[2]=1.0; /*初值y2(0)=-1.0*/
  103. t=0.0; /*起始点t=0*/
  104. h=0.01; /*步长为0.01*/
  105. eps = 0.00001;
  106. Euler1(t,y,3,h,11,z);
  107. printf("定步长欧拉法结果:n");
  108. for (i=0; i<=10; i++)
  109. {
  110. x=i*h;
  111. printf("t=%5.2ft   ",x);
  112. for(j=0; j<=2; j++)
  113. printf("y(%d)=%e  ",j,z[j][i]);
  114. printf("n");
  115. }
  116. y[0]=-1.0; /*重新赋初值*/
  117. y[1]=0.0;
  118. y[2]=1.0;
  119. printf("变步长欧拉法结果:n");
  120. printf("t=%5.2ft   ",t);
  121. for (i=0; i<=2; i++)
  122. printf("y(%d)=%e  ",i,y[i]);
  123. printf("n");
  124. for (j=1; j<=10; j++)
  125. {
  126. Euler2(t,h,y,3,eps);
  127. t=t+h;
  128. printf("t=%5.2ft   ",t);
  129. for (i=0; i<=2; i++)
  130. printf("y(%d)=%e  ",i,y[i]);
  131. printf("n");
  132. }
  133. }