1 // 菊地文雄, 山本昌宏「微分方程式と計算機演習」, 山海堂 (1991), p. 170 2 /* ** EULER, HEUN, AND RUNGE-KUTTA ** 3 ** METHODS FOR SYSTEM OF ORDINARY ** 4 ** DIFFERENTIAL EQUATIONS-2 ** 5 NFUNC : FUNCTION NUMBER 6 METHOD : METHOD NUMBER 7 N : NUMBER OF UNKNOWN FUNCTIONS 8 A : OEFFICIENT MATRIX 9 T : TIME VARIABLE 10 X : APPROXIMATE VALUE OF SOLUTION 11 (T0,X0) : NITIAL VALUE OF (T,X) 12 H : TIME INCREMENT 13 TMAX : UPPER LIMIT OF TIME 14 */ 15 16 #include <stdio.h> 17 #define NDIM (10) 18 19 void mpr(int ndim, double a[][ndim],double x[], int n, double y[]); 20 21 int main(void) 22 { 23 int method, n, i, j, nstep; 24 double t0, h, Tmax, t; 25 double a[NDIM][NDIM],x[NDIM],u[NDIM]; 26 double fk1[NDIM],fk2[NDIM],fk3[NDIM],fk4[NDIM]; 27 printf("EULER : METHOD=1\n"); 28 printf("HEUN : =2\n"); 29 printf("RUNGE-KUTTA : =3\n"); 30 printf("INPUT : METHOD=\n"); 31 scanf("%d", &method); 32 printf("INPUT : N=\n"); 33 scanf("%d", &n); 34 for (i=0; i<n; i++) { 35 for (j=0; j<n; j++) { 36 printf("INPUT : A(%3d,%3d)=\n", i+1, j+1); 37 scanf("%lf", &a[i][j]); 38 } 39 } 40 printf("INPUT : T0=\n"); 41 scanf("%lf", &t0); 42 for (i=0; i<n; i++) { 43 printf("INPUT : X0(%3d)=\n",i+1); 44 scanf("%lf", &x[i]); 45 } 46 printf("INPUT : H=\n"); 47 scanf("%lf", &h); 48 printf("INPUT : TMAX=\n"); 49 scanf("%lf", &Tmax); 50 // CALCULATION 51 t=t0; 52 nstep=0; 53 do { 54 if (method == 1) { 55 mpr(NDIM,a,x,n,fk1); 56 for (i=0; i<n; i++) 57 x[i]=x[i]+h*fk1[i]; 58 } 59 else if (method == 2) { 60 mpr(NDIM,a,x,n,fk1); 61 for (i=0; i<n; i++) 62 u[i]=x[i]+h*fk1[i]; 63 mpr(NDIM,a,u,n,fk2); 64 for (i=0; i<n; i++) 65 x[i]=x[i]+h*(fk1[i]+fk2[i])/2.0; 66 } 67 else { 68 mpr(NDIM,a,x,n,fk1); 69 for (i=0; i<n; i++) 70 u[i]=x[i]+h*fk1[i]/2.0; 71 mpr(NDIM,a,u,n,fk2); 72 for (i=0; i<n; i++) 73 u[i]=x[i]+h*fk2[i]/2.0; 74 mpr(NDIM,a,u,n,fk3); 75 for (i=0; i<n; i++) 76 u[i]=x[i]+h*fk3[i]; 77 mpr(NDIM,a,u,n,fk4); 78 for (i=0; i<n; i++) 79 x[i]=x[i]+h*(fk1[i]+2.0*fk2[i]+2.0*fk3[i]+fk4[i])/6.0; 80 } 81 nstep++; 82 t=t0+h*nstep; 83 // OUTPUT 84 printf("T=%12.4e\n", t); 85 for (i = 0; i < 5; i++) 86 printf(" I x[i] "); 87 printf("\n"); 88 for (i=0; i<n; i++) { 89 printf("%3d%12.4e ", i+1, x[i]); 90 if ((i+1) % 5 == 0 || (i+1) == n) 91 printf("\n"); 92 } 93 } 94 while ((h > 0.0 && t+h < Tmax+0.1*h) || (h < 0.0 && t+h > Tmax+0.1*h)); 95 } 96 97 void mpr(int ndim, double a[][ndim],double x[], int n, double y[]) 98 { 99 int i, j; 100 // MATRIX MULTIPLICATION 101 for (i=0; i<n; i++) { 102 y[i]=0.0; 103 for (j=0; j<n; j++) 104 y[i] += a[i][j] * x[j]; 105 } 106 }
桂田 祐史