ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/addin/outil/src/ot_systeme.cpp
Revision: 1156
Committed: Thu Jun 13 22:02:48 2024 UTC (14 months, 2 weeks ago) by francois
File size: 7448 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

# User Rev Content
1 francois 1156 //####//------------------------------------------------------------
2     //####//------------------------------------------------------------
3     //####// MAGiC
4     //####// Jean Christophe Cuilliere et Vincent FRANCOIS
5     //####// Departement de Genie Mecanique - UQTR
6     //####//------------------------------------------------------------
7     //####// MAGIC est un projet de recherche de l equipe ERICCA
8     //####// du departement de genie mecanique de l Universite du Quebec a Trois Rivieres
9     //####// http://www.uqtr.ca/ericca
10     //####// http://www.uqtr.ca/
11     //####//------------------------------------------------------------
12     //####//------------------------------------------------------------
13     //####//
14     //####// ot_systeme.cpp
15     //####//
16     //####//------------------------------------------------------------
17     //####//------------------------------------------------------------
18     //####// COPYRIGHT 2000-2024
19     //####// jeu 13 jun 2024 11:53:59 EDT
20     //####//------------------------------------------------------------
21     //####//------------------------------------------------------------
22 francois 283
23    
24    
25     #pragma hdrstop
26     #include <stdlib.h>
27     #include <math.h>
28     #include "ot_systeme.h"
29     #include "ot_mathematique.h"
30    
31    
32     OT_SYSTEME::OT_SYSTEME()
33     {
34     }
35    
36    
37    
38     OT_SYSTEME::~OT_SYSTEME()
39     {
40     }
41    
42    
43     int OT_SYSTEME::resoud_gauss(double *a,double* b,double *x,int n)
44     {
45     double *aaug=new double[(n+1)*n];
46     #define a(i,j) (*(a+(i)*(n)+j))
47     #define aaug(i,j) (*(aaug+(i)*(n+1)+j))
48     for (int i=0;i<n;i++)
49     for (int j=0;j<n;j++)
50     aaug(i,j)=a(i,j);
51     for (int k=0;k<n;k++)
52     aaug(k,n)=b[k];
53     for (int j=0;j<n-1;j++)
54     {
55     // recherche le pivot
56     double pvt=fabs(aaug(j,j));
57     int ligne_pivot_debut=j;
58     int ligne_pivot=j;
59    
60     for (int i=j+1;i<n;i++)
61     if (fabs(aaug(i,j))>pvt)
62     {
63     pvt=fabs(aaug(i,j));
64     ligne_pivot=i;
65     }
66     if (ligne_pivot!=ligne_pivot_debut) // trouver meilleur
67     {
68     for (int col=j;col<n+1;col++)
69     {
70     double temp=aaug(ligne_pivot_debut,col);
71     aaug(ligne_pivot_debut,col)=aaug(ligne_pivot,col);
72     aaug(ligne_pivot,col)=temp;
73     }
74     }
75     // j ai mon pivot max
76     if (fabs(aaug(j,j))< 0.00000000000001) {
77     delete [] aaug;
78     return 0;
79     };
80     // j ai mon pivot max non nul
81     for (int ii=j+1;ii<n;ii++) aaug(ii,j)=aaug(ii,j)/aaug(j,j);
82    
83     for (int iii=j+1;iii<n;iii++)
84     for (int k=j+1;k<n+1;k++)
85     aaug(iii,k)=aaug(iii,k)-aaug(iii,j)*aaug(j,k);
86     }
87    
88     if (fabs(aaug(n-1,n-1))<0.00000000000001) {
89     delete [] aaug;
90     return 0;
91     };
92     x[n-1]=aaug(n-1,n)/aaug(n-1,n-1);
93     for (int j=n-2;j>-1;j--)
94     {
95     x[j]=aaug(j,n);
96     for (int k=n-1;k>j;k--)
97     x[j]=x[j]-aaug(j,k)*x[k];
98     x[j]=x[j]/aaug(j,j);
99     }
100    
101    
102     delete [] aaug;
103     return 1;
104     #undef a // enlever le (i,j) pour enlever le warning
105     #undef aaug
106     }
107    
108     int OT_SYSTEME::resoud_QR(double *m, double *b, double *x, int dim1,int dim2)
109     {
110     double *mat=new double[dim1*(dim2+1)];
111     double *r=new double[dim2];
112     #define mat(i,j) (*(mat+(i)*(dim2+1)+(j)))
113     #define m(i,j) (*(m+(i)*dim2+(j)))
114     for (int i=0;i<dim1;i++)
115     {
116     for (int j=0;j<dim2;j++)
117     mat(i,j)=m(i,j);
118     mat(i,dim2)=b[i];
119     }
120     for (int k=0;k<dim2;k++)
121     {
122     double somme=0.;
123     for (int i=k;i<dim1;i++)
124     somme=somme+mat(i,k)*mat(i,k);
125     double alpha=sqrt(somme);
126     double pivot=mat(k,k);
127     if (pivot>0) alpha=-alpha;
128     r[k]=alpha;
129     if (OPERATEUR::egal(alpha,0.,0.000001))
130     {
131     delete [] mat;
132     delete [] r;
133     return 0;
134     }
135     double beta=somme-pivot*alpha;
136     pivot=pivot-alpha;
137     mat(k,k)=pivot;
138     for (int j=k+1;j<dim2+1;j++)
139     {
140     double somme=0.;
141     for (int i=k;i<dim1;i++)
142     somme=somme+mat(i,k)*mat(i,j);
143     double gamma=somme/beta;
144     for (int i=k;i<dim1;i++)
145     mat(i,j)=mat(i,j)-gamma*mat(i,k);
146     }
147     }
148     x[dim2-1]=mat(dim2-1,dim2)/r[dim2-1];
149     for (int j=dim2-2;j>-1;j--)
150     {
151     x[j]=mat(j,dim2);
152     for (int k=dim2-1;k>j;k--)
153     x[j]=x[j]-mat(j,k)*x[k];
154     x[j]=x[j]/r[j];
155     }
156    
157    
158    
159     #undef mat
160     delete [] mat;
161     delete [] r;
162     return 1;
163     }
164    
165    
166    
167    
168    
169    
170     int OT_SYSTEME::decompose_LU(double *a,double* res,int dim)
171     {
172     #define a(i,j) (*(a+(i)*(dim)+(j)))
173     #define res(i,j) (*(res+(i)*(dim)+(j)))
174    
175     if (OPERATEUR::egal(a(0,0),0.,0.00001)==1) return 0;
176     for (int i=0;i<dim;i++)
177     res(i,0)=a(i,0);
178     for (int j=1;j<dim;j++)
179     res(0,j)=a(0,j)/res(0,0);
180    
181    
182     for (int j=1;j<dim;j++)
183     {
184     for (int i=j;i<dim;i++)
185     {
186     double sum=0.;
187     for (int k=0;k<j;k++)
188     sum=sum+res(i,k)*res(k,j);
189     res(i,j)=a(i,j)-sum;
190     }
191     for (int i=j+1;i<dim;i++)
192     {
193     double sum=0.;
194     if (OPERATEUR::egal(res(j,j),0.,0.00001)==1) return 0;
195     for (int k=0;k<j;k++)
196     sum=sum+res(j,k)*res(k,i);
197     res(j,i)=(a(j,i)-sum)/res(j,j);
198     }
199    
200     }
201     return 1;
202    
203     #undef a
204     #undef res
205     }
206    
207    
208     int OT_SYSTEME::resoud_LU(double *matlu,double *b,double *x,int dim)
209     {
210     #define matlu(i,j) (*(matlu+(i)*(dim)+(j)))
211    
212     double* bb=new double[dim];
213     bb[0]=b[0]/matlu(0,0);
214     for (int i=1;i<dim;i++)
215     {
216     double sum=0.0;
217     for (int k=0;k<i;k++)
218     sum=sum+matlu(i,k)*bb[k];
219     bb[i]=(b[i]-sum)/matlu(i,i);
220     }
221    
222     x[dim-1]=bb[dim-1];
223     for (int j=dim-2;j>=0;j--)
224     {
225     double sum=0.0;
226     for (int k=j+1;k<dim;k++)
227     sum=sum+matlu(j,k)*x[k];
228     x[j]=bb[j]-sum;
229    
230     }
231    
232     #undef lu
233    
234     delete [] bb;
235     return 1;
236     }
237    
238    
239    
240    
241    
242    
243     void OT_SYSTEME::get_inv(double *mat1,double *mat2,int n,int *ierr)
244     {
245     #define mat(i,j) (*(mataug+(j)*n+i))
246     #define mat1(i,j) (*(mat1+(j)*n+i))
247     #define mat2(i,j) (*(mat2+(j)*n+i))
248    
249     double *mataug=(double*)calloc(2*n*n,sizeof(double));
250    
251     for (int i=0;i<n;i++)
252     {
253     for (int j=0;j<n;j++)
254     mat(i,j)=mat1(i,j);
255     mat(i,i+n)=1.;
256     }
257    
258    
259     *ierr=0;
260    
261     for (int j=0;j<n;j++)
262     {
263     double pivot=fabs(mat(j,j));
264     int ligne_pivot=j;
265     for (int i=j+1;i<n;i++)
266     {
267     if (fabs(mat(i,j))>pivot)
268     {
269     pivot=fabs(mat(i,j));
270     ligne_pivot=i;
271     }
272     }
273     if (pivot<0.000000001) {
274     *ierr=1;
275     free(mataug);
276     return;
277     }
278     if (ligne_pivot!=j)
279     {
280     for (int i=j;i<2*n;i++)
281     {
282     double temp=mat(j,i);
283     mat(j,i)=mat(ligne_pivot,i);
284     mat(ligne_pivot,i)=temp;
285     }
286     }
287     for (int i=j+1;i<n;i++)
288     mat(i,j)=-mat(i,j)/mat(j,j);
289     for (int i=j+1;i<n;i++)
290     for (int k=j+1;k<2*n;k++)
291     mat(i,k)=mat(i,k)+mat(i,j)*mat(j,k);
292     }
293    
294     for (int i=0;i<n;i++)
295     {
296     mat2(n-1,i)=mat(n-1,n+i)/mat(n-1,n-1);
297     for (int j=n-2;j>-1;j--)
298     {
299     mat2(j,i)=mat(j,n+i);
300     for (int k=n-1;k>j;k--)
301     mat2(j,i)=mat2(j,i)-mat2(k,i)*mat(j,k);
302     mat2(j,i)=mat2(j,i)/mat(j,j);
303     }
304     }
305    
306     free(mataug);
307     #undef mat
308     #undef mat1
309     #undef mat2
310     }
311