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

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

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

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

Q&A

解決済

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

kisara11235
kisara11235

総合スコア18

C

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

1回答

0グッド

0クリップ

250閲覧

投稿2022/10/22 08:48

前提

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

実現したいこと

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

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

行列の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/ツールのバージョンなど)

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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/10/22 10:42

こちらの質問が複数のユーザーから「過去に投稿した質問と同じ内容の質問」という指摘を受けました。

kisara11235

2022/10/22 09:17

解決したと思いましたけど、全然違う話でした。 質問自体も自分で回答してすぐ消しました。
jimbe

2022/10/22 11:11 編集

解決済みとしたからと言っても消えません。 ベストアンサーを消せば受付中になりますし、質問の編集から回答・コメントも解決済みでも出来ます。 勘違いでしたら前の質問を戻して編集するなどで対応し、同じ内容を増やさないでください。 ついでに、タイトルには内容を端的に表す文を書いてください。(「行列の中の要素を実部、虚部に分けて別々の行列の中に入れたい」等) また、複素数の実部・虚部を分けることと、作っておられる計算の値とは直接関係は無く、 double complex 型の実部・虚部を取り出せる方法というだけですので、別にテストプログラムを作って試して見ては如何でしょうか。 →https://qiita.com/7of9/items/ce73142ea855155a304b
退会済みユーザー

退会済みユーザー

2022/10/22 12:00

複素行列の計算がしたいだけなら、MATLABかGNU Octaveを用いたらどうでしょう それとも複素行列の計算ロジックを自分で考えないといけないものなのでしょうか

回答1

0

自己解決

無事解決いたしました。

投稿2022/11/03 05:27

kisara11235

総合スコア18

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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