質問編集履歴

4

プログラミングの全体がこちらです。連立方程式の係数行列を簡約化する関数がlnqgjです。少し変な変数の置き方をしていますが、よろしくお願いします

2018/06/22 12:21

投稿

edatin
edatin

スコア9

test CHANGED
File without changes
test CHANGED
@@ -4,23 +4,169 @@
4
4
 
5
5
  ```C言語
6
6
 
7
+ #include <stdio.h>
8
+
9
+ #include <math.h>
10
+
11
+ #define N 4
12
+
13
+ #define M 1
14
+
15
+ #define nl 10
16
+
17
+
18
+
19
+ void lnqgj(double a[][N+M], int n, int m, double epsl, int *isw)
20
+
21
+ {
22
+
23
+ int j;
24
+
25
+ int i;
26
+
27
+ int k;
28
+
29
+ int ip;
30
+
31
+
32
+
33
+ double p;
34
+
35
+ double w;
36
+
37
+ double a_kk;
38
+
39
+ double a_ik;
40
+
41
+
42
+
43
+ for(k = 0 ; k < n ; k++){
44
+
45
+ p = 0.0;
46
+
47
+
48
+
49
+ for(i = k;i < n; i++){
50
+
51
+ if(p < fabs(a[i][k])){
52
+
53
+ p = fabs(a[i][k]);
54
+
55
+ ip = i;
56
+
57
+ }
58
+
59
+ }
60
+
61
+
62
+
63
+ if(p <= epsl){
64
+
65
+ *isw = 1;
66
+
67
+ printf("\n\t isw = %d\n", *isw);
68
+
69
+ return ;
70
+
71
+ }
72
+
73
+
74
+
75
+ for(j = k;j < (n + m) ; j++){
76
+
77
+ w = a[k][j];
78
+
79
+ a[k][j] = a[ip][j];
80
+
81
+ a[ip][j] = w;
82
+
83
+ }
84
+
85
+
86
+
87
+ a_kk = a[k][k];
88
+
89
+ for(j = k;j < (n + m); j++){
90
+
91
+ a[k][j] /= a_kk;
92
+
93
+ }
94
+
95
+
96
+
97
+ for (i = 0; i < n ; i++){
98
+
99
+ if(i != k){
100
+
101
+ a_ik = a[i][k];
102
+
103
+ for(j = k; j<(n + m);j++)
104
+
105
+ a[i][j] -= (a_ik * a[k][j]);
106
+
107
+ }
108
+
109
+ }
110
+
111
+ }
112
+
113
+
114
+
115
+ *isw = 0;
116
+
117
+ return ;
118
+
119
+ }
120
+
121
+
122
+
123
+ main(){
124
+
7
125
  int a;
8
126
 
9
127
  int b;
10
128
 
11
- int s = 4;
129
+ int s = N;
12
-
130
+
13
- int t = 1;
131
+ int t = M;
132
+
133
+ int *isw;
134
+
135
+ double min = 1.0e-5;
14
136
 
15
137
  double z[s][s+t];
16
138
 
139
+ FILE *fpin;
140
+
141
+ FILE *fpout;
142
+
143
+
144
+
145
+ if((fpin = fopen("kadai17.dat", "r"))==0){
146
+
147
+ fprintf(stderr, "\n\tSorry! I can't open kadai17.dat\n");
148
+
149
+ return 0;
150
+
151
+ }
152
+
153
+ if((fpout = fopen("kadai17ans.dat", "w"))==0){
154
+
155
+ fprintf(stderr, "\n\tSorry! I can't open kadai17ans.dat\n");
156
+
157
+ return 0;
158
+
159
+ }
160
+
161
+
162
+
17
163
  for( a = 0; a < 4 ;a++){
18
164
 
19
165
  printf("\n%d\n",a);
20
166
 
21
167
  for( b = 0; b < 5 ;b++){
22
168
 
23
- fscanf(fpin,"%lf",&z[a][b]);
169
+ fscanf(fpin,"%lf",&(z[a][b]));
24
170
 
25
171
  printf("%lf\t",z[a][b]);
26
172
 
@@ -28,6 +174,36 @@
28
174
 
29
175
  }
30
176
 
177
+
178
+
179
+ lnqgj(z,s,t,min,isw);
180
+
181
+
182
+
183
+ fprintf(fpout,"isw = %d\n",*isw);
184
+
185
+ for( a = 0; a < 4;a++){
186
+
187
+ printf("\n\t%lf\n",z[a][4]);
188
+
189
+ fprintf(fpout, "\tX%d =%lf\n",a+1 , z[a][4]);
190
+
191
+ }
192
+
193
+
194
+
195
+ fclose (fpin);
196
+
197
+ fclose (fpout);
198
+
199
+ return 0;
200
+
201
+ }
202
+
203
+
204
+
205
+
206
+
31
207
  ```
32
208
 
33
209
 

3

読み込んでいるファイルの内容を追加しました

2018/06/22 12:21

投稿

edatin
edatin

スコア9

test CHANGED
File without changes
test CHANGED
@@ -34,6 +34,16 @@
34
34
 
35
35
  ### 試したこと
36
36
 
37
+ 読み込んでいるファイルの中身はこちらです
38
+
39
+ 3 2 7 1 8
40
+
41
+ 1 5 1 -1 5
42
+
43
+ 4 1 3 -2 7
44
+
45
+ 1 6 4 3 13
46
+
37
47
 
38
48
 
39
49
  printfで読み込まれたデータを表示するのですが、a<4とすると4行目の値が表示されず上のprintfで表示している行数のみが表示されます

2

変数aとbの定義を追加しました

2018/06/22 08:31

投稿

edatin
edatin

スコア9

test CHANGED
File without changes
test CHANGED
@@ -3,6 +3,10 @@
3
3
 
4
4
 
5
5
  ```C言語
6
+
7
+ int a;
8
+
9
+ int b;
6
10
 
7
11
  int s = 4;
8
12
 

1

配列zはこの様に定義しています。質問の書き方が間違っていて申し訳ないです

2018/06/22 08:28

投稿

edatin
edatin

スコア9

test CHANGED
File without changes
test CHANGED
@@ -2,9 +2,13 @@
2
2
 
3
3
 
4
4
 
5
+ ```C言語
5
6
 
7
+ int s = 4;
6
8
 
7
- C言語
9
+ int t = 1;
10
+
11
+ double z[s][s+t];
8
12
 
9
13
  for( a = 0; a < 4 ;a++){
10
14
 
@@ -20,7 +24,7 @@
20
24
 
21
25
  }
22
26
 
23
-
27
+ ```
24
28
 
25
29
 
26
30