質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.41%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

597閲覧

配列の結果がうまくファイルに出力されない

kisara11235

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/11/03 05:25

編集2022/11/03 06:25

前提

ある値ごとに固有値計算を行い、その値を二乗したものを取り出したい。
目的は状態密度関数の形を求めるために、x軸固有値の二乗*y軸k_xのようにファイルに書き込みたい。

実現したいこと

実際に計算した値を一列に並べたい

発生している問題・エラーメッセージ

/*for (int i = 0;i < L/10;i++) { fprintf(fp_1, "%2f %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n", k_x, E[i * 10 + 0], E[i * 10 + 1], E[i * 10 + 2], E[i * 10 + 3], E[i * 10 + 4], E[i * 10 + 5], E[i * 10 + 6], E[i * 10 + 7], E[i * 10 + 8], E[i * 10 + 9], E[i * 10 + 10]); }*/

のように並べると値が横12列に渡って出てくる。この値は正しい。

for (int i =0;i < L;i++) {
fprintf(fp_1, "%2f %lf \n", k_x, E[i]);
}
のように並べると以下のようにすべての数字が0として出てくる。

-4.618141 0.000000 -4.618141 0.000000 -4.618141 0.000000 -4.618141 0.000000 -4.523893 0.000000 -4.523893 0.000000 -4.523893 0.000000 -4.523893 0.000000 -4.523893 0.000000

該当のソースコード

C

1#include <stdio.h> 2#include <math.h> 3#include <complex.h> 4#include <stdlib.h> 5 6#define M 5 //単位法の数 7#define N 10 //次数設定 8#define L 20 9#define EPS 0.000001 //収束範囲 10 11int n = 100; //100000 //電子数=2N 12int c = 1; 13double complex t_1, t_2, t_3, t_4, t_5, t_6, t_7, t_8, T_1, T_2, T_3, T_4; //方向 14double b_pi; 15double a[L][L]; 16double D[N][N]; 17double complex C[N][N]; 18double A[L], B_1[N][N], B_2[N][N]; 19double E[L]; 20 21 22 23int main(int argc, char** argv) { 24 25 b_pi = M_PI; 26 double complex a_cube = 1;//= 0.246 * pow(10, -9); //格子定数[nm] 27 double complex k_x = -1.5*b_pi / a_cube; //-2*b_pi/a_cube/pow(3,0.5); 28 double complex k_y = 0; 29 30 FILE* fp; 31 FILE* fp_1; 32 33 if ((fp = fopen("zigzag N=30.txt", "w")) == NULL) 34 { 35 printf("Cannot open the file\n"); 36 exit(1); 37 } 38 if ((fp_1 = fopen("DOS.txt", "w")) == NULL) 39 { 40 printf("Cannot open the file\n"); 41 exit(1); 42 } 43 44 int v; 45 for (v = 0;v <= n; v++) { 46 k_x = k_x + b_pi * 3/ a_cube / n; 47 t_4 = cexp(-1 * I * (-1 * a_cube / pow(3, 0.5) * k_y)); 48 t_5 = cexp(-1 * I * (-a_cube / 2 * k_x - a_cube / 2 / pow(3, 0.5) * k_y)); //cos(a_cube / 2 / pow(3, 0.5) * k_x + a_cube / 2 * k_y) + I * sin((a_cube / 2 / pow(3, 0.5) * k_x + a_cube / 2 * k_y)); //cexp(I * (a_cube / 2 / pow(3, 0.5) * k_x + a_cube / 2 * k_y)); //expの中の符号を計算したあらかじめ 49 t_6 = cexp(-1 * I * (a_cube / 2 * k_x - a_cube / 2 / pow(3, 0.5) * k_y)); //cos(a_cube / 2 / pow(3, 0.5) * k_x - a_cube / 2 * k_y) + I * sin(a_cube / 2 / pow(3, 0.5) * k_x - a_cube / 2 * k_y); //cexp(I * (a_cube / 2 / pow(3, 0.5) * k_x - a_cube / 2 * k_y)); // 50 t_1 = cexp(I * a_cube / pow(3, 0.5) * k_y); 51 t_2 = cexp(I * (-a_cube / 2 * k_x - a_cube / 2 / pow(3, 0.5) * k_y)); 52 t_3 = cexp(I * (a_cube / 2 * k_x - a_cube / 2 / pow(3, 0.5) * k_y)); 53 t_7 = -1 * t_4; 54 t_8 = -1 * t_1; 55 T_1 = t_5 + t_6; 56 T_2 = t_2 + t_3; 57 T_3 = -1 * T_1; 58 T_4 = -1 * T_2; 59 60 /*double complex C[N][N] = { 61 {0,0,0,0,0,T_1,0,0,0,0}, 62 {0,0,0,0,0,t_4,T_1,0,0,0}, 63 {0,0,0,0,0,0,t_4,T_1,0,0}, 64 {0,0,0,0,0,0,0,t_4,T_1,0}, 65 {0,0,0,0,0,0,0,0,t_4,T_1}, 66 {T_2,t_1,0,0,0,0,0,0,0,0}, 67 {0,T_2,t_1,0,0,0,0,0,0,0}, 68 {0,0,T_2,t_1,0,0,0,0,0,0}, 69 {0,0,0,T_2,t_1,0,0,0,0,0}, 70 {0,0,0,0,T_2,0,0,0,0,0} };*/ //係数行列 71 72 for (int k = 0;k < N;k++) { 73 for (int h = 0;h < N;h++) { 74 for (int i = 0;i < M - 2;i++) { 75 if (h < M) { 76 if (k < M) { 77 C[h][k] = 0; 78 } 79 else { 80 C[0][M] = T_1; 81 C[M - 1][N - 1] = T_1; 82 C[M - 1][N - 2] = t_4; 83 C[i + 1][M + i] = t_4; 84 C[i + 1][M + i + 1] = T_1; 85 } 86 } 87 else { 88 if (k < M) { 89 C[M][0] = T_2; 90 C[M][1] = t_1; 91 C[N - 1][M - 1] = T_2; 92 C[M + i + 1][i + 1] = T_2; 93 C[M + i + 1][i + 2] = t_1; 94 95 } 96 else { 97 C[h][k] = 0; 98 } 99 } 100 } 101 } 102 } 103 104 /*for (int k = 0;k < N;k++) { 105 for (int h = 0;h < N;h++) { 106 printf("%7.4lf\n", C[k][h]); 107 } 108 }*/ 109 110 int k, h; 111 for (k = 0;k < N;k++) { 112 for (h = 0;h < N;h++) { 113 D[h][k] = creal(C[h][k]); 114 B_1[h][k] = -1 * cimag(C[h][k]); 115 B_2[h][k] = cimag(C[h][k]); 116 } 117 } 118 119 120 for (k = 0;k < L;k++) { 121 for (h = 0;h < L;h++) { 122 if (h < N) { 123 if (k < N) { 124 a[h][k] = D[h % N][k % N]; 125 } 126 else { 127 a[h][k] = B_1[h % N][k % N]; 128 } 129 } 130 else { 131 if (k < N) { 132 a[h][k] = B_2[h % N][k % N]; 133 } 134 else { 135 a[h][k] = D[h % N][k % N]; 136 } 137 } 138 } 139 } 140 141 142 143 /*for (y = 0;y < N;y++) 144 for (x = 0;x < N;x++) 145 u[y][x] = 0.0; 146 147 for (i = 0;i < N;i++) 148 u[i][i] = 1.0;*/ 149 150 while (1) { 151 //double u[L][L]; //単位行列 152 double alpha, beta, gamma; 153 double s, c, w; 154 double wa, wb, wc; 155 double max; 156 int i, j, p, q, x, y; 157 158 //最大要素の行と列を検索 159 max = 0.0; 160 for (i = 0;i < L - 1;i++) { 161 for (j = i + 1;j < L;j++) 162 if (fabs(a[i][j]) > max) { 163 p = i; 164 q = j; 165 max = fabs(a[i][j]); 166 } 167 } 168 //収束したら解答打ち出し 169 if (max < EPS) break; 170 171 //sin, cos 計算 172 wa = a[p][p]; 173 wb = a[p][q]; 174 wc = a[q][q]; 175 alpha = -wb; 176 beta = 0.5 * (wa - wc); 177 gamma = fabs(beta) / sqrt(alpha * alpha + beta * beta); 178 s = sqrt(0.5 * (1.0 - gamma)); 179 if (alpha * beta < 0) s = -s; 180 c = sqrt(1.0 - s * s); 181 //直行変換 182 for (j = 0;j < L;j++) { 183 w = a[p][j] * c - a[q][j] * s; 184 a[q][j] = a[p][j] * s + a[q][j] * c; 185 a[p][j] = w; 186 } 187 188 for (j = 0;j < L;j++) { 189 a[j][p] = a[p][j]; 190 a[j][q] = a[q][j]; 191 } 192 193 194 195 w = 2.0 * wb * s * c; 196 a[p][p] = wa * c * c + wc * s * s - w; 197 a[q][q] = wa * s * s + wc * c * c + w; 198 a[p][q] = 0; 199 a[q][p] = 0; 200 201 for (int i = 0;i < L;i++) 202 { 203 A[i] = a[i][i]; 204 if(A[i]>=0){ 205 E[i]=pow(A[i],0.5); 206 } 207 else{ 208 E[i]=0; 209 } 210 } 211 212 } 213 214 /*int i; 215 printf("固有値\n"); 216 for (i = 0;i < l;i++) { 217 printf("%7.4lf\n", a[i][i]); //対角成分  218 219 double tmp; 220 for (int i=0; i<L; i++) { 221 for (int j=i+1; j<L ;j++) { 222 if (A[i] > A[j]) { 223 tmp = A[i]; 224 A[i] = A[j]; 225 A[j] = tmp; 226 } 227 } 228 } 229 230 231 /*for (int i = 0;i < L/10;i++) { 232 fprintf(fp, "%2f %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n", k_x, A[i * 10 + 0], A[i * 10 + 1], A[i * 10 + 2], A[i * 10 + 3], A[i * 10 + 4], A[i * 10 + 5], A[i * 10 + 6], A[i * 10 + 7], A[i * 10 + 8], A[i * 10 + 9], A[i * 10 + 10]); 233 }*/ 234 /*for (int i = 0;i < L/10;i++) { 235 fprintf(fp_1, "%2f %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf\n", k_x, E[i * 10 + 0], E[i * 10 + 1], E[i * 10 + 2], E[i * 10 + 3], E[i * 10 + 4], E[i * 10 + 5], E[i * 10 + 6], E[i * 10 + 7], E[i * 10 + 8], E[i * 10 + 9], E[i * 10 + 10]); 236 }*/ 237 238 for (int i =0;i < L;i++) { 239 fprintf(fp_1, "%2f %lf \n", k_x, E[i]); 240 } 241 242 /*fprintf(fp_1, "%2f %lf \n", k_x, E[ 0]);*/ 243 244 //L+2個書く必要だあります! 245 246 } 247 /*int i; 248 printf("固有値\n"); 249 for (i = 0;i < n;i++) { 250 printf("%7.4lf", a[i][i]); //対角成分 こいつが固有値 251 }*/ 252 253 254 fclose(fp); 255 fclose(fp_1); 256 return 0; 257} 258

試したこと

個別に10回並べて書いたり、要素一つに限って出したりもしてみたがいずれも0が出た。
おそらく配列の大きさの違いが原因かなと思ったが、対処法がわからないです。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/11/03 06:22

上と下は何が違うんでしょうか
kisara11235

2022/11/03 06:24

申し訳ございません、書き間違いです。
guest

回答1

0

ベストアンサー

k_x というのは、double型ではなく、double comlex型です
なので、これを%2fで表示させようとするのは間違いです

投稿2022/11/03 06:34

y_waiwai

総合スコア87885

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisara11235

2022/11/03 06:38

ありがとうございます! 正直なぜk_xをdouble complex にしていたか、自分の落ち度過ぎて何も言えません。
y_waiwai

2022/11/03 06:47

それと、グローバル変数を意味のない1文字にする(あるいは意味のない文字列にする)、と言うのはあまりに邪悪すぎるのでやめるようにしましょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.41%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問