前提
数値の計算がしたい。
実現したいこと
E_1を計算して、すべてのiごとに足し算をして、E_2に格納したい。
発生している問題・エラーメッセージ
値が発散する。発散自体はいいのだが、このあとグラフを書きたいので数値として出てきてほしい。
-0.790979 -0.788650 inf 0.119445 0.000000 0.000000 inf inf 0.790979 0.791865 9.710943 0.11896
0.000 の値が発散するのは織り込み済み。しかし値として出てきてほしい。別に適当に大きい数字を入れても良かったが発散する箇所が三個ほどあることが考えられていたのでそれは避けた。
-0.790 の方は発散する理由がわからない。
+0.790 の方は発散していないのでなにか根本的なミスがあると思う。
該当のソースコード
#include <stdio.h> #include <math.h> #include <stdlib.h> #define N 10https://drive.google.com/file/d/1jJaHsKIgK42Gl0R_LyIVYnXGRDYSD4l8/view?usp=share_link void main() { int n=100; int M=n*N; double delta_k=3.14* 3/ n; double e=-3.5; double siny[M]; double A[N][n]; double E_1[N][n],E_2[N]; double f[N][n]; FILE *fp; FILE* fp_1; fp = fopen("b.txt", "r"); /* 読み込みモードでファイルをオープン */ if(fp == NULL) { printf("ファイルを開くことが出来ませんでした.\n"); return; } if ((fp_1 = fopen("bb.txt", "w")) == NULL) { printf("Cannot open the file\n"); exit(1); } for(int i=0; i<M; i++){ fscanf(fp, "%lf", &(siny[i]) ); /* 1行読む */ } double tmp; for (int i=0; i<M; i++) { for (int j=i+1; j<M ;j++) { if (siny[i] > siny[j]) { tmp = siny[i]; siny[i] = siny[j]; siny[j] = tmp; } } } for (int i=0;i<n;i++){ for(int j=0;j<N;j++){ A[j][i]=siny[j*100+i]; } } for(int i=0;i<n;i++){ for(int j=0;j<N;j++){ E_1[j][i]=((A[j][i]+A[j][i+1])/2+(A[j][i]+A[j][i-1])/2)/2; } } //printf("%7.4lf\n",v[1][0]); for(int j=0;j<N;j++){ for(int i=0;i<n;i++){ E_2[j]+=pow(fabs(E_1[j][i])/delta_k,-1); f[j][i]=pow(fabs(E_1[j][i])/delta_k,-1); } } for(int i=0; i<n; i++) { for(int j=0;j<N;j++){ //fprintf(fp_1, "%2f %lf %lf %lf\n", A[j][i],E_1[j][i],E_2[j],f[j][i]); } } //for(int i=0; i<n; i++) { for(int j=0;j<N;j++){ printf( "%2f \n",E_2[j]); } //} fclose(fp); fclose(fp_1); }
試したこと
実際のファイルです。
https://drive.google.com/file/d/1jJaHsKIgK42Gl0R_LyIVYnXGRDYSD4l8/view?usp=share_link
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー