-
Notifications
You must be signed in to change notification settings - Fork 0
/
Cholesky1.h
105 lines (101 loc) · 2.44 KB
/
Cholesky1.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void Cholesky1(double **A, double *b,int n)
{
int i,j,k,m;
double pivot,perm;
double somme;
double*TabReel(int N);
void AfficheMatriceReelle(double**M,int L,int C);
void Gauss(double**A,double*b,int n);
double erreur=10.0;
double max;
double**MatriceReelle(int L,int C);
double**L;
double*x,*y;
x=TabReel(n);
y=TabReel(n);
L=MatriceReelle(n,n);
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(A[i][j]!=A[j][i])
{
printf("La matrice n'est pas symetrique definie positive\n");
exit(-1);
}
}
}
for(i=2;i<=n;i++)
{
if(A[1][1]<0.0)
{
printf("A n'est pas symetrique definie positive\n");
exit(-1);
}
L[1][1]=sqrt(A[1][1]);
L[i][1]=A[1][i]/L[1][1] ;
}
for(i=2;i<=n;i++)
{
somme=0.0;
for(k=1;k<=i-1;k++)
somme=somme+pow(L[i][k],2);
if((A[i][i]-somme)<0.0)
{
printf("matrice n est pas symetrique definie positive\n");
exit(-1);
}
L[i][i]=sqrt(A[i][i]-somme);
for(j=i+1;j<=n;j++)
{
somme=0.0;
for(k=1;k<=i-1;k++)
somme+=L[i][k]*L[j][k];
L[j][i]=(A[i][j]-somme)/L[i][i] ;
}
}
for(i=1;i<=n;i++)
{
for(j=1+i;j<=n;j++)
L[i][j]=0.0;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
A[i][j]=L[j][i];
}
printf("\n affichage de L:\n\n");
AfficheMatriceReelle(L,n,n);
printf("\naffichage de la transposee de L:\n");
AfficheMatriceReelle(A,n,n);
printf("\n");
for(i=1;i<=n;i++)
{
if(fabs(L[i][i])<1.0e-12)
{
printf("Matricle L pas inversible!!\n");
exit(-1);
}
}
y[1]=b[1]/L[1][1];
for(i=2;i<=n;i++)
{
somme=0.0;
for(j=1;j<=i-1;j++)
somme+=L[i][j]*y[j];
y[i]=(b[i]-somme)/L[i][i] ;
}
x[n]=y[n]/A[n][n];
for(i=n-1;i>=1;i--)
{
somme=0.0;
for(j=i+1;j<=n;j++)
somme+=A[i][j]*x[j];
x[i]=(y[i]-somme)/A[i][i];
}
printf("\n Cholesky : la solution du systeme est:\n\n");
AfficherTabReel(x,n,1);
}