teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

元のコードの設計意図に沿っていないコードだったため修正

2022/07/20 08:18

投稿

ALOHAMS
ALOHAMS

スコア197

answer CHANGED
@@ -2,11 +2,9 @@
2
2
  エラー内容に関しましてはy_waiwaiさんがおっしゃっているようにhとNはポインタ型でないので、*演算子は使えないよというエラーです。
3
3
 
4
4
  ポインタを習ってない可能性を考慮してポインタを使わない方法を提示しておきます。
5
+ ・関数の宣言を少し変えています。
6
+ ・rk4関数の処理を少し変えています。
5
- main関数内のファイ制御部分rk4関数にぶち込んだだけコードすね
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
- void rk4(double h, int n, double N);
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,36 +31,32 @@
33
31
  scanf("%lf", &N); /* 初期値設定 */
34
32
 
35
33
  h = (b-a)/n;
34
+ /* ファイル保存 */
35
+ FILE *fout;
36
+ fout = fopen("result rungekutta.csv", "w");
37
+ fprintf(fout, "#index,N\n");
38
+ for(i=0; i <=n; i++){
39
+ N = rk4(h, n, N); /* ルンゲクッタ法 */
40
+ fprintf(fout, "%d,%f,%f\n", i, h*(i-1), N);
41
+ }
42
+ fflush(fout);
43
+ fclose(fout);
36
44
 
37
- rk4(h, n, N); /* ルンゲクッタ法 */
38
-
39
45
  return 0;
40
46
  }
41
47
 
42
- void rk4(double h, int n, double N){
48
+ double rk4(double h, int n, double N){
43
49
  double k1, k2, k3, k4;
44
50
  int i;
45
51
 
46
- /* ファイル保存 */
47
- FILE *fout;
48
- fout = fopen("result rungekutta.csv", "w");
49
- fout = fopen("input.txt", "w");
50
-
51
52
  /* ルンゲクッタ法 */
52
- for(i=0; i<=n; i++){
53
- double z = 0.08664; /* ヨウ素の壊変定数 */
53
+ double z = 0.08664; /* ヨウ素の壊変定数 */
54
- k1=h*-z*N;
54
+ k1 = h * -z * N;
55
- k2=h*-z*(N+k1/2.0);
55
+ k2 = h * -z * (N + k1 / 2.0);
56
- k3=h*-z*(N+k2/2.0);
56
+ k3 = h * -z * (N + k2 / 2.0);
57
- k4=h*-z*(N+k3);
57
+ k4 = h * -z * (N + k3);
58
- N += (k1+k2*2+k3*2+k4)*(h/6.0);
59
- printf("%lf\n", N);
58
+ printf("%lf\n", N);
60
-
61
- fprintf(fout, "%d,%f,%f\n", i, h * (i + 1), N);
59
+ return ((k1 + k2 * 2 + k3 * 2 + k4) * (h / 6.0));
62
- }
60
+
63
- fflush(fout);
64
- fclose(fout);
65
-
66
61
  }
67
-
68
62
  ```

1

元のコードからの変更内容

2022/07/20 08:01

投稿

ALOHAMS
ALOHAMS

スコア197

answer CHANGED
@@ -2,6 +2,7 @@
2
2
  エラー内容に関しましてはy_waiwaiさんがおっしゃっているようにhとNはポインタ型でないので、*演算子は使えないよというエラーです。
3
3
 
4
4
  ポインタを習ってない可能性を考慮してポインタを使わない方法を提示しておきます。
5
+ main関数内のファイル制御部分をrk4関数にぶち込んだだけのコードですね。
5
6
  ただ、以下のコードは計算する関数にファイルに出力する処理もいれているので良いコードではないです。
6
7
 
7
8