00001
00002
00003
00004
00005 #include "resollu.h"
00006 #include <math.h>
00007
00008 #define TINY 1.0e-20
00009
00010
00011
00012
00013
00014
00015
00016 bool ludcmp(double a[][MAT_SIZE], int l, int indx[])
00017 {
00018
00019 int i,imax=0,j,k;
00020 double big,dum,sum,temp;
00021 double *vv;
00022 bool Inversible = true;
00023
00024 vv = new double[l];
00025
00026
00027 for (i=0;i<l;i++) {
00028 big=0.0;
00029 for (j=0;j<l;j++)
00030 if ((temp=fabs(a[i][j]))>big)
00031 big=temp;
00032 if (big==0)
00033 Inversible= false;
00034 else
00035 vv[i]=1.0/big;
00036 }
00037
00038 if (Inversible)
00039 {
00040 for (j=0;j<l;j++) {
00041 for (i=0;i<j;i++) {
00042 sum=a[i][j];
00043 for (k=0;k<i;k++)
00044 sum-=a[i][k]*a[k][j];
00045 a[i][j]=sum;
00046 }
00047 big=0.0;
00048 for (i=j;i<l;i++) {
00049 sum=a[i][j];
00050 for (k=0;k<j;k++)
00051 sum-=a[i][k]*a[k][j];
00052 a[i][j]=sum;
00053 if ((dum=vv[i]*fabs(sum))>=big) {
00054 big=dum;
00055 imax=i;
00056 }
00057 }
00058 if (j!=imax) {
00059 for (k=0;k<l;k++) {
00060 dum=a[imax][k];
00061 a[imax][k]=a[j][k];
00062 a[j][k]=dum;
00063 }
00064
00065 vv[imax]=vv[j];
00066 }
00067 indx[j]=imax;
00068 if (a[j][j]==0.0)
00069 a[j][j]= TINY;
00070 if (j!=l-1) {
00071 dum=1.0/(a[j][j]);
00072 for (i=j+1;i<l;i++)
00073 a[i][j]*=dum;
00074 }
00075 }
00076 }
00077 delete [] vv;
00078 return (Inversible);
00079
00080 }
00081
00082 void lubksb(double a[][MAT_SIZE],int l,int indx[],double b[])
00083 {
00084
00085 int i,ii=-1,ip,j;
00086 double sum;
00087
00088 for (i=0;i<l;i++) {
00089 ip=indx[i];
00090 sum=b[ip];
00091 b[ip]=b[i];
00092 if (ii>=0)
00093 for (j=ii;j<=i-1;j++)
00094 sum-=a[i][j]*b[j];
00095 else if (sum)
00096 ii=i;
00097 b[i]=sum;
00098 }
00099 for (i=l-1;i>=0;i--) {
00100 sum=b[i];
00101 for (j=i+1;j<l;j++)
00102 sum-=a[i][j]*b[j];
00103 b[i]=sum/a[i][i];
00104 }
00105 }
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 bool ResoudreSysteme(double K[][MAT_SIZE], double U[], double B[], int Dimension)
00126 {
00127
00128 int MatTampon[MAT_SIZE];
00129 int Indice;
00130 bool SolutionExiste;
00131
00132
00133
00134 SolutionExiste = ludcmp(K, Dimension, MatTampon);
00135
00136 if (SolutionExiste)
00137 {
00138 for (Indice=0;Indice<Dimension;Indice++)
00139 B[Indice]= U[Indice];
00140
00141 lubksb(K, Dimension, MatTampon,B);
00142 }
00143 return (SolutionExiste);
00144 }