// simeq.cpp solve complex simultaneous equations AX=Y #include "simeq.hpp" // defined typedef complex cmplx; #include #include #include #include // still needed using namespace std; // PURPOSE : SOLVE THE LINEAR SYSTEM OF EQUATIONS WITH COMPLEX // COEFFICIENTS [A] * |X| = |Y| // // INPUT : THE NUMBER OF EQUATIONS n // THE COMPLEX MATRIX A should be A[i][j] but A[i*n+j] // THE COMPLEX VECTOR Y // OUTPUT : THE COMPLEX VECTOR X // // METHOD : GAUSS-JORDAN ELIMINATION USING MAXIMUM ELEMENT // FOR PIVOT. // // USAGE : simeq(n, A, X, Y); cmplx A[n*n] // simeq2(n, A, Y, X); cmplx **A A[n][n] // simeq2b(n, B, X); cmplx **B B[n][n+1] // simeqb(n, B, X); cmplx B[n*n+1] // // // WRITTEN BY : JON SQUIRE , 28 MAY 1983 // ORIGONAL DEC 1959 for IBM 650, TRANSLATED TO OTHER LANGUAGES // e.g. FORTRAN converted to Ada converted to C to Java to C++ // modified to have simeqb fastest void simeq(int n, cmplx A[], cmplx Y[], cmplx X[]) { cmplx *B; // [n][n+1] WORKING MATRIX int i, j, m; B = (cmplx *)calloc(n*(n+1), sizeof(cmplx)); m = n+1; // BUILD WORKING DATA STRUCTURE for(i=0; i ABS_PIVOT){ I_PIVOT = i; PIVOT = B[ROW[i]*m+k]; ABS_PIVOT = abs ( PIVOT ); } } // HAVE PIVOT, INTERCHANGE ROW POINTERS HOLD = ROW[k]; ROW[k] = ROW[I_PIVOT]; ROW[I_PIVOT] = HOLD; // CHECK FOR NEAR SINGULAR if( ABS_PIVOT < 1.0E-64 ){ for(j=k+1; j