一回も披露したことのない豆知識

以下のようなプログラムを実行したところうまくいきませんでした。
for (int p = 2; p<=20;p++){
int n = pow(2, p);
h = T / n;
e_max = 0;
double x[n];
double v[n];
x[0] = x0;
x[0] = 0;
for (int j = 0; j < n;j++){
x[j + 1] = 0;
v[j + 1] = 0;
}
で配列の初期化を行っている部分が間違っているのかと思うのですがどうでしょうか?
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define M_PI 3.14159265358979323846264338327950288

int main(){
double w, k, m, x0;
k = 3;
m = 4;
w = sqrt(k / m);
x0 = 1;
double x_a, T, h, t, e, e_x, k1, k2, k_1, k_2, e_max, log2e_max;
T = 2 * M_PI / w;
FILE *file;
//FILE *file1;
file = fopen("kadai3.1.3.2txt", "w");
//file1 = fopen("kadai3.1.3.2xxa.txt", "w");
for (int p = 2; p<=20;p++){
int n = pow(2, p);
h = T / n;
e_max = 0;
double x[n];
double v[n];
x[0] = x0;
x[0] = 0;
for (int j = 0; j < n;j++){
x[j + 1] = 0;
v[j + 1] = 0;
}
for (int i = 0; i < n; i++){
t = (i + 1) * h;
k1 = v[i];
k2 = v[i] - k / m * (x[i] + k1 * h) * h;
x[i + 1] = x[i] + (k1 + k2) / 2 * h;
k_1 = -k / m * x[i];
k_2 = -k / m * (x[i] + v[i] * h + 1 / 2 * k_1 * h * h);
v[i + 1] = v[i] + (k_1 + k_2) / 2 * h;
x_a = cos(w * t);
e = x[i + 1] - x_a;
e_x = fabs(e);
if (e_x > e_max){
e_max = e_x;
}
// fprintf(file1, "%lf %lf\n", x, x_a);
}
log2e_max = log2(e_max);
fprintf(file, "%d %lf\n", p, log2e_max);
}
fclose(file);
system("pause");

return 0;
}

質問者からの補足コメント

A 回答 (3件)

詳しくは見ていませんが、


double x[n];
double v[n];
のnの値は、pが20のとき、1048576になります。
そうなると、ローカル変数として、double x[1048576]を確保することができません。コンパイルはOKですが、実行時エラーとなります。
double x[n];は、グローバル領域に確保します。
main()の外に定義します。
以下のように定義してください。
あらかじめ、最大の配列を確保しておきます。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define M_PI 3.14159265358979323846264338327950288
double x[1048576];
double v[1048576];
int main(){
    • good
    • 0
この回答へのお礼

ローカル変数についての理解が足りませんでした。
解決しました。ありがとうございます。

お礼日時:2022/01/19 15:38

そもそも、このプログラムは何を行っているのでしょうか。


又、どのような結果が、kadai3.1.3.2txtに書き込まれることを期待しているのでしょうか。
    • good
    • 0
この回答へのお礼

ばねにつながれた物体の動きについてホイン法で解いた数値解と、x=coswtとした解析解の誤差を求め、時間刻み2^pとしたときpごとの誤差の最大値が書き込まれることを期待しています。

お礼日時:2022/01/19 16:02

環境くらい書きましょう。


で、『なに』が『どう』『うまくいかない』んですか?

>double x[n];
>double v[n];
>for (int j = 0; j < n;j++){
>x[j + 1] = 0;
>v[j + 1] = 0;
>}
で、x[]とv[]の添え字として使える値はどこまでだと思いますか?
その上で、j + 1がその範囲に収まると思いますか?
    • good
    • 0
この回答へのお礼

ローカル変数として使えるメモリの範囲を意識していませんでした。
勉強になります。

お礼日時:2022/01/19 15:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!