1 /* 菊地文雄, 山本昌宏「微分方程式と計算機演習」, 山海堂 (1991)
2 P. 13 のプログラムをC言語に書き直した。
3 ** GAUSS ELIMINATION METHOD **
4 n : NUMBER OF UNKNOWS
5 a : COEFFICIENT MATRIX
6 f : KNOWN VECTOR & SOLUTION VECTORS
7 */
8
9 #include <stdio.h>
10 #include <stdlib.h> // exit()
11 #define NDIM (100)
12
13 void gauss(int ndim, double a[ndim][ndim], double f[], int N);
14
15 int main(void)
16 {
17 int n, i, j;
18 double a[NDIM][NDIM], f[NDIM];
19 printf("INPUT : N=\n"); // 最後の \n は不要かも
20 scanf("%d", &n);
21 if (n<=1)
22 exit(0);
23 for (i = 0; i < n; i++)
24 for (j = 0; j < n; j++) {
25 printf("INPUT : A(%3d,%3d)=\n", i+1, j+1); // 最後の \n は不要かも
26 scanf("%lf", &a[i][j]);
27 }
28 for (i = 0; i < n; i++) {
29 printf(" INPUT : F(%3d)=\n", i+1); // 最後の \n は不要かも
30 scanf("%lf", &f[i]);
31 }
32 gauss(NDIM,a,f,n);
33 for (i = 0; i < 5; i++)
34 printf(" I X(I) ");
35 printf("\n");
36 for (i = 0; i < n; i++) {
37 printf("%3d%12.4e ",i+1, f[i]); //I3 は %3d, PE12.4 は %12.4e (1Pは無視)
38 if ((i+1) % 5 == 0 || i+1 == n)
39 printf("\n");
40 }
41 }
42
43 void gauss(int ndim, double a[ndim][ndim], double f[], int n)
44 {
45 int i, j, k;
46 double aa;
47 // FORWARD ELIMITNATION
48 for (i=0; i<n-1; i++)
49 for (j=i+1; j<n; j++) {
50 aa = a[j][i] / a[i][i];
51 for (k=i+1; k<n; k++)
52 a[j][k] -= aa * a[i][k];
53 f[j] -= aa * f[i];
54 }
55 // BACKWARD SUBSTITUTION
56 f[n-1] /= a[n-1][n-1];
57 for (i=n-2;i>=0;i--) {
58 for (j=i+1; j<n; j++)
59 f[i] -= a[i][j] * f[j];
60 f[i] /= a[i][i];
61 }
62 }
桂田 祐史
2018-06-08