/* mpf_simeq.c solve simultaneous equations AX=Y */ #include #include #include "mpf_simeq.h" /* includes gmp and digits */ void mpf_simeq(int n, mpf_t A[], mpf_t Y[], mpf_t X[]) { /* PURPOSE : SOLVE THE LINEAR SYSTEM OF EQUATIONS WITH REAL */ /* COEFFICIENTS [A] * |X| = |Y| */ /* */ /* INPUT : THE NUMBER OF EQUATIONS n */ /* THE REAL MATRIX A should be A[i][j] but A[i*n+j] */ /* THE REAL VECTOR Y */ /* OUTPUT : THE REAL VECTOR X */ /* */ /* METHOD : GAUSS-JORDAN ELIMINATION USING MAXIMUM ELEMENT */ /* FOR PIVOT. */ /* */ /* USAGE : mpf_simeq(n,A,Y,X); */ /* */ /* */ /* 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 etc. */ mpf_t *B; /* [n][n+1] WORKING MATRIX */ int i, j, m; mpf_set_default_prec(digits*3.32); B = (mpf_t *)calloc((n+1)*(n+1), sizeof(mpf_t)); m = n+1; /* BUILD WORKING DATA STRUCTURE */ for(i=0; i0) { I_PIVOT = i; mpf_set(PIVOT, B[ROW[i]*m+k]); mpf_abs(ABS_PIVOT, PIVOT); } } /* HAVE PIVOT, INTERCHANGE ROW POINTERS */ HOLD = ROW[k]; ROW[k] = ROW[I_PIVOT]; ROW[I_PIVOT] = HOLD; /* CHECK FOR NEAR SINGULAR */ if(mpf_cmp(small, ABS_PIVOT)>0) { for(j=k+1; j