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

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

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

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

Q&A

解決済

1回答

560閲覧

複素数の計算についての質問

kisara11235

総合スコア18

C

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

0グッド

0クリップ

投稿2022/10/22 08:41

前提

複素数の計算についての質問

実現したいこと

下のコードにあるよう、行列の中の要素を実部、虚部に分けて別々の行列の中に入れたい。

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

行列のA、Bの奇数行目の値がすべて0になる
ほかの複素数で確かめても0になることはなく、もともとの複素数も0でない

該当のソースコード

C

1//ヤコビ法による固有値と固有ベクトル計算// 2 3#include <stdio.h> 4#include <math.h> 5#include <complex.h> 6#include <stdlib.h> 7 8#define N 4 //次数設定 9#define L 8 10#define EPS 0.0001 //収束範囲 11 12int n = 100000; 13int M = 2; //電子数=2M 14int c = 1; 15double complex t_1, t_2, t_3, t_4, t_5, t_6,T_1,T_2; //方向 16double b_pi; 17double a[L][L]; 18double D[L]; 19 20 21 22int main(int argc, char** argv){ 23 24 b_pi = M_PI; 25 double complex a_cube = 0.246 * pow(10, -9); //格子定数[nm] 26 double complex k_x = -b_pi / a_cube; //↓のk_xの値を変えるのも忘れずに! 27 double complex k_y = b_pi / M * c; 28 29 FILE* fp; 30 31 if ((fp = fopen("zig N=2 q=1.txt", "w")) == NULL) 32 { 33 printf("Cannot open the file\n"); 34 exit(1); 35 } 36 37 int v; 38 for (v = 0;v < n; v++) { 39 k_x = k_x + b_pi * 2 / a_cube / n; 40 t_4 = cos(-1 * a_cube / pow(3, 0.5) * k_y) + I * sin(-1 * a_cube / pow(3, 0.5) * k_y); //cexp(I * (-1* a_cube / pow(3, 0.5) * k_y)); 41 t_5 = cexp(I * (a_cube / 2 / pow(3, 0.5) * k_x + a_cube / 2 * 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の中の符号を計算したあらかじめ 42 t_6 = cexp(I * (a_cube / 2 / pow(3, 0.5) * k_x - a_cube / 2 * 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)); // 43 t_1 = cos(a_cube / pow(3, 0.5) * k_y) + I * sin(a_cube / pow(3, 0.5) * k_y); //cexp(I * a_cube / pow(3, 0.5) * k_y); 44 t_2 = 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)); 45 t_3 = 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)); 46 T_1= t_5 + t_6; 47 T_2= t_2 + t_3; 48 49 double complex C[N][N] = { 50 {0,0,T_1,0}, 51 {0,0,t_4,T_1}, 52 {T_2,t_1, 0, 0}, 53 {0,T_2, 0, 0} }; //係数行列 54 55 double A[N][N], B_1[N][N], B_2[N][N]; 56 int k, h; 57 for (k = 0;k < N;k++) { 58 for (h = 0;h < N;h++) { 59 A[k][h] = creal(C[k][h]); 60 B_1[k][h] = -1 * cimag(C[k][h]); 61 B_2[k][h] = cimag(C[k][h]); 62 } 63 } 64 /*for (k = 0;k < N;k++) { 65 for (h = 0;h < N;h++) { 66 printf("%7.4lf\n", A[k][h]); 67 } 68 }*/ 69 printf("%2f %lf %lf %lf %lf\n", k_x, B_1[1][0], B_1[1][1], B_1[1][2], B_1[1][3]); 70 printf("%2f %lf %lf %lf %lf\n", k_x, A[1][0], A[1][1], A[1][2], A[1][3]); 71 72 /*= { {A[0][0],A[0][1],A[0][2] ,B_1[0][0],B_1[0][1],B_1[0][2]}, 73 {A[1][0],A[1][1],A[1][2] ,B_1[1][0],B_1[1][1],B_1[1][2]}, 74 {A[2][0],A[2][1],A[2][2] ,B_1[2][0],B_1[2][1],B_1[2][2]}, 75 {B_2[0][0],B_2[0][1],B_2[0][2] ,A[0][0],A[0][1],A[0][2]}, 76 {B_2[1][0],B_2[1][1],B_2[1][2] ,A[1][0],A[1][1],A[1][2]}, 77 {B_2[2][0],B_2[2][1],B_2[2][2] ,A[2][0],A[2][1],A[2][2]}};*/ 78 for (k = 0;k < L;k++) { 79 for (h = 0;h < L;h++) { 80 if (h < N) { 81 if (k < N) 82 a[h][k] = A[h % N][k % N]; 83 else 84 a[h][k] = B_1[h % N][k % N]; 85 } 86 else { 87 if (k < N) 88 a[h][k] = B_2[h % N][k % N]; 89 else 90 a[h][k] = A[h % N][k % N]; 91 } 92 } 93 } 94 95 printf("%f%+fi\n", creal(T_2), cimag(T_2)); 96 //printf("%2f %lf %lf %lf %lf %lf %lf %lf %lf\n", k_x, a[1][0], a[1][1], a[1][2], a[1][3], a[1][4], a[1][5], a[1][6], a[1][7]); 97 /*/for (k = 0;k < L;k++) { 98 for (h = 0;h < L;h++) 99 printf("%7.4lf\n", a[k][h]); 100 }*/ 101 102 //double u[L][L]; //単位行列 103 double alpha, beta, gamma; 104 double s, c, w; 105 double wa, wb, wc; 106 double max; 107 int i, j, p, q, x, y; 108 109 /*for (y = 0;y < N;y++) 110 for (x = 0;x < N;x++) 111 u[y][x] = 0.0; 112 113 for (i = 0;i < N;i++) 114 u[i][i] = 1.0;*/ 115 116 while (1) { 117 //最大要素の行と列を検索 118 max = 0.0; 119 for (i = 0;i < L - 1;i++) { 120 for (j = i + 1;j < L;j++) 121 if (fabs(a[i][j]) > max) { 122 p = i; 123 q = j; 124 max = fabs(a[i][j]); 125 } 126 } 127 //収束したら解答打ち出し 128 if (max < EPS) break; 129 130 //sin, cos 計算 131 wa = a[p][p]; 132 wb = a[p][q]; 133 wc = a[q][q]; 134 alpha = -wb; 135 beta = 0.5 * (wa - wc); 136 gamma = fabs(beta) / sqrt(alpha * alpha + beta * beta); 137 s = sqrt(0.5 * (1.0 - gamma)); 138 if (alpha * beta < 0) s = -s; 139 c = sqrt(1.0 - s * s); 140 //直行変換 141 for (j = 0;j < L;j++) { 142 w = a[p][j] * c - a[q][j] * s; 143 a[q][j] = a[p][j] * s + a[q][j] * c; 144 a[p][j] = w; 145 } 146 147 for (j = 0;j < L;j++) { 148 a[j][p] = a[p][j]; 149 a[j][q] = a[q][j]; 150 } 151 w = 2.0 * wb * s * c; 152 a[p][p] = wa * c * c + wc * s * s - w; 153 a[q][q] = wa * s * s + wc * c * c + w; 154 a[p][q] = 0; 155 a[q][p] = 0; 156 157 D[0] = a[0][0]; 158 D[1] = a[1][1]; 159 D[2] = a[2][2]; 160 D[3] = a[3][3]; 161 D[4] = a[4][4]; 162 D[5] = a[5][5]; 163 D[6] = a[6][6]; 164 D[7] = a[7][7]; 165 166 //漸化式計算 167 /*for (i = 0;i < N;i++) { 168 w = u[i][p] * c - u[i][q] * s; 169 u[i][q] = u[i][p] * s + u[i][q] * c; 170 u[i][p] = w; 171 }*/ 172 173 /*for (k = 0;k < L;k++) { 174 for (h = 0;h < L; h++) { 175 printf("%7.4lf\n", a[k]); 176 }*/ 177 } 178 179 fprintf(fp, "%2f %lf %lf %lf %lf %lf %lf %lf %lf\n", k_x, D[0], D[1], D[2], D[3], D[4], D[5], D[6], D[7]); 180 } 181 182 /*int i; 183 printf("固有値\n"); 184 for (i = 0;i < L;i++) { 185 printf("%7.4lf\n", a[i][i]); //対角成分 こいつが固有値 186 }*/ 187 188 fclose(fp); 189 return 0; 190}

試したこと

行列の値をいちいち確かめたり、複素数自体の値も調べた
前回のミスもこの点が問題であると思う。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

自己解決

勘違いしていることにすぐ気づいた

投稿2022/10/22 08:43

kisara11235

総合スコア18

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問