|
一つバグを見つけましたが、これでも結果はおかしいです。
それと私のプログラムにもバグがありましたので正しいプログラムをup
しておきます。今度はVC++でも動く形で。
48行目
a[i][j].imaginary=( (a[i][j].real*(-pivot.imaginary)) + (a[i][j].imaginary*pivot.real) )/( (pivot.real*pivot.real) + (pivot.imaginary*pivot.imaginary) );
->
a[i][j].imaginary=(a[i][j].real*pivot.imaginary - a[i][j].imaginary*pivot.real)/(pivot.real*pivot.real + pivot.imaginary*pivot.imaginary);
VC++でも動くと思われるプログラム
#include <iostream>
#include <complex>
typedef std::complex<double> Csd;
void inv_complex(Csd a[2][2], int n);
void mul_complex(Csd a[2][2], Csd b[2][2], Csd c[2][2], int n);
int main()
{
Csd A[2][2], invA[2][2], res[2][2];
int i, j;
// A = |1+i 1-2i|
// |2-i 1-2i|
A[0][0] = Csd(1, 1);
A[0][1] = Csd(1, -2);
A[1][0] = Csd(2, -1);
A[1][1] = Csd(1, -2);
for (i = 0; i < 2; i++)
for (j = 0; j < 2; j++)
invA[i][j] = A[i][j];
inv_complex(invA, 2);
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
std::cout << invA[i][j] << " ";
std::cout << std::endl;
}
mul_complex(A, invA, res, 2);
for (i = 0; i < 2; i++) {
for (j = 0; j < 2; j++)
std::cout << res[i][j] << " ";
std::cout << std::endl;
}
}
void inv_complex(Csd a[2][2], int n)
{
Csd p, q;
int i, j, k;
for (k = 0; k < n; k++) {
p = a[k][k];
a[k][k] = Csd(1, 0);
for (j = 0; j < n; j++) a[k][j] /= p;
for (i = 0; i < n; i++)
if (i != k) {
q = a[i][k];
a[i][k] = Csd(0, 0);
for (j = 0; j < n; j++) a[i][j] -= q * a[k][j];
}
}
}
void mul_complex(Csd a[2][2], Csd b[2][2], Csd c[2][2], int n)
{
Csd s;
int i, j, k;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) {
s = Csd(0, 0);
for (k = 0; k < n; k++) s += a[i][k] * b[k][j];
c[i][j] = s;
}
}
|