/********************************************************************************************** * SOLVING A COMPLEX LINEAR MATRIX SYSTEM AX=B BY GAUSS-JORDAN METHOD * * ------------------------------------------------------------------------------------------- * * C++ Version By J-P Moreau, Paris * * SAMPLE RUN: * * INPUTS from example file csysmat.dat, * * OUTPUTS to file csysmat.lst. * * ------------------------------------------------------------------------------------------- * * SAMPLE RUN: * * Input file * * 4 * * 47.0 -15.0 62.0 5.0 0.0 -72.0 61.0 20.0 * * 6.0 14.0 -17.0 3.0 -102.0 91.0 7.0 -12.0 * * 13.0 -55.0 32.0 8.0 41.0 7.0 25.0 1.0 * *111.0 25.0 40.0 0.0 12.0 -82.0 58.0 -30.0 * * 1 * * 629.0 988.0 * *-180.0 825.0 * * 877.0 441.0 * * 734.0 -88.0 * * * * Output file * *------------------------------------------------------ * * SOLVING THE COMPLEX MATRIX LINEAR SYSTEM AX = B * *------------------------------------------------------ * * (BY GAUSS-JORDAN METHOD WITH FULL PIVOTING) * * * * N=4 * * * * COMPLEX MATRIX A: * * * * (47.000000,-15.000000) (62.000000, 5.000000) ( 0.000000,-72.000000) (61.000000,20.000000) * * ( 6.000000,14.000000) (-17.000000, 3.000000) (-102.000000,91.000000) ( 7.000000,-12.000000) * * (13.000000,-55.000000) (32.000000, 8.000000) (41.000000, 7.000000) (25.000000, 1.000000) * * (111.000000,25.000000) (40.000000, 0.000000) (12.000000,-82.000000) (58.000000,-30.000000) * * * * M=1 * * * * COMPLEX MATRIX B: * * * * (629.000000,988.000000) * * (-180.000000,825.000000) * * (877.000000,441.000000) * * (734.000000,-88.000000) * * * * INVERSE OF COMPLEX MATRIX A: * * * * ( 0.003941,-0.007988) (-0.008374,-0.004058) (-0.009490, 0.017938) ( 0.000210,-0.001660) * * ( 0.036781, 0.021820) ( 0.014793,-0.027076) (-0.033797,-0.035129) (-0.005015,-0.016173) * * (-0.004225,-0.005071) (-0.007674,-0.001821) ( 0.003482, 0.004805) ( 0.000692, 0.003649) * * (-0.019727,-0.016588) (-0.001490, 0.018806) ( 0.033739, 0.015368) ( 0.005363, 0.017239) * * * * SOLUTION MATRIX X: * * * * (-1.000000, 3.000000) * * ( 2.000000,10.000000) * * ( 7.000000,-5.000000) * * (17.000000, 6.000000) * * * * DETERMINANT= (17416564.000000,-10598320.000000) * * * * * * VERIFICATION OF A1 * A = I: * * * * ( 1.000000, 0.000000) (-0.000000, 0.000000) ( 0.000000, 0.000000) ( 0.000000, 0.000000) * * (-0.000000, 0.000000) ( 1.000000, 0.000000) ( 0.000000,-0.000000) ( 0.000000,-0.000000) * * ( 0.000000, 0.000000) ( 0.000000,-0.000000) ( 1.000000,-0.000000) ( 0.000000,-0.000000) * * (-0.000000, 0.000000) ( 0.000000, 0.000000) ( 0.000000,-0.000000) ( 1.000000, 0.000000) * * * * VERIFICATION OF AX = B: * * * * (629.000000,988.000000) * * (-180.000000,825.000000) * * (877.000000,441.000000) * * (734.000000,-88.000000) * * * * --------------------------------------------------------------------------------------------* * * **********************************************************************************************/ #include #include #include #define EPSMACH 2.2e-16 #define NMAX 10 #define MMAX 2 //complex number typedef struct { double R,I; //algebraic form } COMPLEX; FILE *fp1, *fp2; typedef COMPLEX MATC[NMAX][NMAX]; typedef COMPLEX MATC1[NMAX][MMAX]; MATC A, A1, D; MATC1 B, C; COMPLEX DETER, temp; int I,J,M,N; static char Separator[] = "--------------------------------------------------------------------"; double CABS(COMPLEX Z) { return sqrt(Z.R*Z.R + Z.I*Z.I); } void CADD(COMPLEX Z1, COMPLEX Z2, COMPLEX *Z) { Z->R = Z1.R + Z2.R; Z->I = Z1.I + Z2.I; } void CDIF(COMPLEX Z1, COMPLEX Z2, COMPLEX *Z) { Z->R = Z1.R - Z2.R; Z->I = Z1.I - Z2.I; } void CMUL(COMPLEX Z1, COMPLEX Z2, COMPLEX *Z) { Z->R = Z1.R*Z2.R - Z1.I*Z2.I; Z->I = Z1.R*Z2.I + Z1.I*Z2.R; } void CDIV(COMPLEX Z1, COMPLEX Z2, COMPLEX *Z) { double d; COMPLEX C; d = Z2.R*Z2.R+Z2.I*Z2.I; if (d<1e-12) printf(" Complex Divide by zero!\n"); else { C.R=Z2.R; C.I=-Z2.I; CMUL(Z1,C,Z); Z->R=Z->R/d; Z->I=Z->I/d; } } void CSwap(COMPLEX *Z1, COMPLEX *Z2) { COMPLEX C; C.R=Z1->R; C.I=Z1->I; Z1->R=Z2->R; Z1->I=Z2->I; Z2->R=C.R; Z2->I=C.I; } void MATPRINT(char *titre,MATC A,int N) { int I, J; fprintf(fp2,"\n\n %s \n\n",titre); for (I=0; IR = 1.0; DET->I=0.0; for (I=0; I PAV) { PV.R=AA[I][J].R; PV.I=AA[I][J].I; PAV= CABS(PV); IK=I; JK=J; } } // Search terminated, the pivot is in location I=IK, J=JK. // Memorizing pivot location: PC[K]=JK; PL[K]=IK; // DETERMINANT DET is actualised // If DET=0, ERROR MESSAGE and STOP // Machine dependant EPSMACH equals here 2.2e-16 if (IK!=K) {DET->R=-DET->R; DET->I=-DET->I;} if (JK!=K) {DET->R=-DET->R; DET->I=-DET->I;} CMUL(*DET,PV,&temp); DET->R=temp.R; DET->I=temp.I; tmp= CABS(*DET); if (tmp < EPSMACH) { fprintf(fp2,"\n The complex determinant is too small!\n"); return; } // POSITIONNING PIVOT IN K,K: if(IK!=K) // EXCHANGE LINES IK and K of matrices AA and BB for (I=0; I=0; I--) { IK=(int) PC[I]; if (IK==I) goto fin1; // EXCHANGE LINES I and PC(I) of matrix AA: for (J=0; J=0; J--) { JK=(int) PL[J]; if (JK==J) goto fin2; // EXCHANGE COLUMNS J ET PL(J) of matrix AA: for (I=0; I0 fscanf(fp1,"%d",&M); fprintf(fp2,"\n\n M=%d\n",M); if (M!=0) { MATREAD1(B,N,M); MATPRINT1(" MATRIX B :",B,N,M); } // END DATA SECTION fclose(fp1); // STORING A IN A1 (Original A is lost when calling MATINV) for (I=0; I