- #include <iostream>
- #include <math.h>
- #include <iomanip>
- #include<ctime>
- using namespace std;
- void Cholesky(double ** A, int taille,double * B,double * sk);
- void Affichage_matrice(double ** A, int taille);
- int main()
- { clock_t Time;
- int nbr_coef=3;
- double vk[3]={0,0,0}; // Vk 3 coef dans le cercle, 4 pour l'amortisseur
- double sk[3]={0,0,0};
- double* W=new double[10];
- double W1[3];
- int nbr_points=6; // 6 dans le cas du cercle, 10 sinon!
- ////********************************* Declaration dynamique des matrices *********************************////
- double ** A;
- A = new double* [nbr_coef];
- for ( int i=0 ; i < nbr_coef ; i++)
- A[i] = new double [nbr_coef];
- for(int i=0;i<nbr_coef;i++ )
- {
- W1[i]=0;
- for(int j=0;j<nbr_coef;j++)
- A[i][j]=0;
- }
- double B[6][3]={NULL};
- double BT[3][6]={NULL};
- //Cholesky(A,nbr_coef,W1,sk);
- double X[6]={1,2,3,5,7,9};
- double Y[6]={7,6,7,8,7,5};
- for(int j=0;j<nbr_points;j++)
- {
- vk[1]+=(1.0/nbr_points)*X[j];
- vk[2]+=(1.0/nbr_points)*Y[j];
- vk[3]+=X[j]*X[j]+Y[j]*Y[j];
- }
- vk[3]=sqrt(vk[3])*(1.0/nbr_points);
- //double temps[10]={0.1,0.3,0.7,1.2,1.6,2.2,2.7,3.1,3.5,3.9};
- //double yi[10]={0.558,0.569,0.176,-0.207,-0.133,0.132,0.055,-0.09,-0.069,0.027};
- double norme=2;
- int z=0;
- while(z<30)
- {z++;
- norme=0;
- for(int i=0;i<nbr_coef;i++ )
- {
- W1[i]=0;
- for(int j=0;j<nbr_coef;j++)
- A[i][j]=0;
- }
- ////********************************* Calcul de la jacobienne pour l'amortisseur *********************************////
- /*
- for(int i=0;i<nbr_coef;i++)
- {
- B[i][0]=exp(-vk[1]*temps[i])*sin(vk[2]*temps[i]+vk[3]);
- B[i][1]=-vk[0]*temps[i]*exp(-vk[1]*temps[i])*sin(vk[2]*temps[i]+vk[3]);
- B[i][2]=temps[i]*vk[0]*exp(-vk[1]*temps[i])*cos(vk[2]*temps[i]+vk[3]);
- B[i][3]=vk[0]*exp(-(vk[1]*temps[i]))*cos(vk[2]*temps[i]+vk[3]);
- }
- ////********************************* Calcul de la Jacobienne pour le cercle *********************************////
- for(int i=0;i<nbr_points;i++)
- {
- B[i][0]=(vk[1]-X[i])/(sqrt((vk[1]-X[i])*(vk[1]-X[i])+(vk[2]-Y[i])*(vk[2]-Y[i])));
- B[i][1]=(vk[2]-X[i])/(sqrt((vk[1]-X[i])*(vk[1]-X[i])+(vk[2]-Y[i])*(vk[2]-Y[i])));
- B[i][2]=-1;
- }
- for(int i=0;i<nbr_points;i++)
- {
- cout<<endl;
- for(int j=0;j<nbr_coef;j++)
- cout<<B[i][j]<<" ";
- }
- ////********************************* Calcul de BT *********************************////
- for(int i=0;i<nbr_points;i++)
- {
- for(int j=0;j<nbr_coef;j++)
- {
- BT[j][i]=B[i][j];
- }
- }
- ////********************************* Declaration de W amortisseur *********************************////
- /* for(int i=0;i<nbr_coef;i++)
- {
- W[i]=yi[i]-vk[0]*exp(-vk[1]*temps[i])*sin(vk[2]*temps[i]+vk[3]);
- }
- ////********************************* Declaration de W cercle *********************************////
- for(int i=0;i<nbr_points;i++)
- {
- W[i]=(sqrt((vk[1]-X[i])*(vk[1]-X[i])+(vk[2]-Y[i])*(vk[2]-Y[i])))-vk[3];
- cout<<" bite:"<<W[i]<<" ";
- }
- ////********************************* Calcul de BT W*********************************////
- for(int i=0;i<nbr_coef;i++)
- {
- for(int j=0;j<nbr_points;j++)
- {
- W1[i]+=BT[i][j]*W[j];
- }
- }
- for(int i=0;i<nbr_coef;i++)
- {
- for(int j=0;j<nbr_coef;j++)
- {
- for(int k=0;k<nbr_points;k++)
- {
- A[i][j]+=BT[i][k]*B[k][j];
- }
- }
- }
- Cholesky(A,nbr_coef,W1,sk);
- for(int i=0;i<nbr_coef;i++)
- {
- vk[i]+=sk[i];
- cout<<sk[i];
- }
- ////********************************* Calcul de la norme pour l'amortisseur*********************************////
- for(int i=0;i<nbr_coef;i++)
- {
- norme+=W1[i]*W1[i];
- }
- norme=sqrt(norme);
- }
- Time=clock();
- cout<<"norme: "<<norme<<" nombre d'iterations : "<<z<<" en "<<(double) Time*1000.0/CLOCKS_PER_SEC <<" ms";
- for(int i=0;i<nbr_coef;i++)
- {
- cout<<endl<<vk[i];
- }
- ////********************************* Libération de la mémoire *********************************////
- for ( int i=0 ; i < nbr_coef ; i++)
- delete A [i];
- delete A;
- return 0;
- }
- ////********************************* Fonction d'affichage *********************************////
- void Affichage_matrice(double **A, int taille)
- {
- int i,j;
- for(i=0;i<taille;i++)
- {
- for(j=0;j<taille;j++)
- {
- cout<<A[i][j]<<" ";
- }
- cout<<endl;
- }
- cout<<endl;
- }
- void Cholesky(double ** A,int taille, double *B,double * sk)
- {
- int n,i,j,k;
- n=0;
- ////********************************* Declaration de A X et B *********************************////
- double L[taille][taille],LT[taille][taille],y[taille],X[taille];;
- for(i=0;i<taille;i++)
- {
- for(j=0;j<taille;j++)
- {
- L[i][j]=0;
- LT[i][j]=0;
- }
- }
- ////********************************* Decomposition de A en LLT *********************************////
- for(i=0;i<taille;i++)
- {
- for(j=0;j<=i;j++)
- {
- if(i==j)
- {
- L[i][j]=A[i][j];
- if(j>=1)
- {
- for(k=0;k<=(j-1);k++)
- {
- L[i][j]=L[i][j]-(L[i][k]*L[i][k]);
- }
- }
- L[i][j]=sqrt(L[i][j]);
- }
- else
- {
- L[i][j]=A[j][i];
- if(j>=1)
- {
- for(k=0;k<=(j-1);k++)
- {
- L[i][j]=L[i][j]-(L[j][k]*L[i][k]);
- }
- }
- L[i][j]/=L[j][j];
- }
- }
- }
- for(i=0;i<taille;i++)
- {
- for(j=0;j<taille;j++)
- {
- LT[i][j]=L[j][i];
- }
- }
- ////********************************* Résolution du système Ly=b *********************************////
- y[0]=B[0]/L[0][0];
- for(i=1;i<taille;i++)
- {
- y[i]=B[i];
- for(j=0;j<i;j++)
- {
- y[i]-=(y[j]*L[i][j]);
- }
- y[i]/=L[i][i];
- }
- ////********************************* Résolution du système y=LTX *********************************////
- X[taille-1]=y[taille-1]/LT[taille-1][taille-1];
- for(i=taille-2;i>=0;i--)
- {
- X[i]=y[i];
- for(j=taille-1;j>i;j--)
- {
- X[i]+=-X[j]*LT[i][j];
- }
- X[i]/=LT[i][i];
- }
- ////********************************* Gestion affichage *********************************////
- /* for(i=0;i<taille;i++)
- {
- cout<<endl;
- for(j=0;j<taille;j++)
- {
- cout<<L[i][j]<<" ";
- }
- }
- cout<<endl;
- cout<<"X";
- cout<<endl;
- for(i=0;i<taille;i++)
- {
- cout<<B[i]<<"\t"<<X[i]<<"\t"<<y[i] <<endl;
- }*/
- for(i=0;i<4;i++)
- {
- sk[i]=X[i];
- }
- }