回答編集履歴
2
元のコードの設計意図に沿っていないコードだったため修正
test
CHANGED
@@ -2,11 +2,9 @@
|
|
2
2
|
エラー内容に関しましてはy_waiwaiさんがおっしゃっているようにhとNはポインタ型でないので、*演算子は使えないよというエラーです。
|
3
3
|
|
4
4
|
ポインタを習ってない可能性を考慮してポインタを使わない方法を提示しておきます。
|
5
|
+
・関数の宣言を少し変えています。
|
6
|
+
・rk4関数の処理を少し変えています。
|
5
|
-
|
7
|
+
ルンゲクッタ法というのをよく知らないので計算が合っているかはわかりません。
|
6
|
-
ただ、以下のコードは計算する関数にファイルに出力する処理もいれているので良いコードではないです。
|
7
|
-
|
8
|
-
|
9
|
-
|
10
8
|
```C
|
11
9
|
#include <stdio.h>
|
12
10
|
#include <stdlib.h>
|
@@ -14,7 +12,7 @@
|
|
14
12
|
|
15
13
|
double func(double N);
|
16
14
|
|
17
|
-
|
15
|
+
double rk4(double h, int n, double N);
|
18
16
|
|
19
17
|
int main(int args, char *argv[]){
|
20
18
|
double h, a, b, N;
|
@@ -33,37 +31,33 @@
|
|
33
31
|
scanf("%lf", &N); /* 初期値設定 */
|
34
32
|
|
35
33
|
h = (b-a)/n;
|
36
|
-
|
37
|
-
rk4(h, n, N); /* ルンゲクッタ法 */
|
38
|
-
|
39
|
-
return 0;
|
40
|
-
}
|
41
|
-
|
42
|
-
void rk4(double h, int n, double N){
|
43
|
-
double k1, k2, k3, k4;
|
44
|
-
int i;
|
45
|
-
|
46
|
-
/* ファイル保存 */
|
34
|
+
/* ファイル保存 */
|
47
35
|
FILE *fout;
|
48
36
|
fout = fopen("result rungekutta.csv", "w");
|
49
|
-
fout
|
37
|
+
fprintf(fout, "#index,N\n");
|
50
|
-
|
51
|
-
/* ルンゲクッタ法 */
|
52
|
-
for(i=0; i<=n; i++){
|
38
|
+
for(i=0; i <=n; i++){
|
53
|
-
|
39
|
+
N = rk4(h, n, N); /* ルンゲクッタ法 */
|
54
|
-
k1=h*-z*N;
|
55
|
-
k2=h*-z*(N+k1/2.0);
|
56
|
-
k3=h*-z*(N+k2/2.0);
|
57
|
-
k4=h*-z*(N+k3);
|
58
|
-
N += (k1+k2*2+k3*2+k4)*(h/6.0);
|
59
|
-
printf("%lf\n", N);
|
60
|
-
|
61
|
-
fprintf(fout, "%d,%f,%f\n", i, h
|
40
|
+
fprintf(fout, "%d,%f,%f\n", i, h*(i-1), N);
|
62
41
|
}
|
63
42
|
fflush(fout);
|
64
43
|
fclose(fout);
|
65
44
|
|
45
|
+
return 0;
|
66
46
|
}
|
67
47
|
|
48
|
+
double rk4(double h, int n, double N){
|
49
|
+
double k1, k2, k3, k4;
|
50
|
+
int i;
|
51
|
+
|
52
|
+
/* ルンゲクッタ法 */
|
53
|
+
double z = 0.08664; /* ヨウ素の壊変定数 */
|
54
|
+
k1 = h * -z * N;
|
55
|
+
k2 = h * -z * (N + k1 / 2.0);
|
56
|
+
k3 = h * -z * (N + k2 / 2.0);
|
57
|
+
k4 = h * -z * (N + k3);
|
58
|
+
printf("%lf\n", N);
|
59
|
+
return ((k1 + k2 * 2 + k3 * 2 + k4) * (h / 6.0));
|
60
|
+
|
61
|
+
}
|
68
62
|
```
|
69
63
|
|
1
元のコードからの変更内容
test
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
エラー内容に関しましてはy_waiwaiさんがおっしゃっているようにhとNはポインタ型でないので、*演算子は使えないよというエラーです。
|
3
3
|
|
4
4
|
ポインタを習ってない可能性を考慮してポインタを使わない方法を提示しておきます。
|
5
|
+
main関数内のファイル制御部分をrk4関数にぶち込んだだけのコードですね。
|
5
6
|
ただ、以下のコードは計算する関数にファイルに出力する処理もいれているので良いコードではないです。
|
6
7
|
|
7
8
|
|