Solution de Systeme Lineaire
Solution de Systeme Lineaire
Solution de Systeme Lineaire
Version : 2018-2019
*/
#include <stdio.h>
#include <stdlib.h>
/**
Fonction de r�servation d'une matrice triangulaire inf�rieure
Retourne l'adresse de la matrice si r�seervation r�ussie
ou NULL en cas de probl�me de r�servation
*/
float ** reserver_inf(int n){
float ** M;
M = malloc(n*sizeof(float *));
if (M == NULL) return NULL;
for (int i = 0; i<n; i++){
M[i] = malloc((i+1)*sizeof(float));
if (M[i] == NULL) return NULL;
}
return M;
}
/**
Fonction pour lib�rer l'espace m�moire
d'une matrice r�elle de n lignes
*/
void liberer_inf (float ** M, int n){
for (int i = 0; i<n; i++)
free(M[i]);
free(M);
}
/**
Fonction qui permet de lire au clavier les �l�ments d'une
matrcice triangulaire inf�rieure
*/
void lire_inf(float **M, int n){
printf("\nSaisir une matrice triang inf de taille %d : \n", n);
for(int i=0; i<n; i++)
for(int j=0; j<=i; j++)
scanf("%f", &M[i][j]);
}
/**
Fonction qui permet d'afficher sur l'ecran une matrice
triangulaire inf�rieure
*/
void afficher_inf(float **M, int n){
printf("Matrice : \n");
for(int i=0; i<n; i++){
for(int j=0; j<=i; j++)
printf("%.2f\t", M[i][j]);
printf("\n");
}
printf("\n");
}
/**
Fonction pour lire un vecteur (un tableau) de taille n
*/
void lire_vect(float *t, int n){
printf("\nSaisir un vecteur de taille %d\n", n);
for(int i=0; i<n; i++)
scanf("%f", &t[i]);
}
/**
Fonction pour afficher un vecteur (tableau) de taille n
*/
void afficher_vect (float *t, int n){
printf("Vecteur = \n");
for(int i=0; i<n; i++)
printf("%.2f\n", t[i]);
printf("\n");
}
/**
Fonction de r�solution d'un syst�me lin�aire triang inf
Param : matrice A, vecteur b, taille n
Retour : vecteur x, ou NULL
*/
float * solve_inf(float **A, float *b, int n){
float *x;
//Test si la matrice n'est pas inversible
for (int i=0; i<n; i++)
if (A[i][i] == 0) return NULL; // Le syst�me n'admet pas de solution
x = calloc(n, sizeof(float)); //R�servation et initialisation par 0
if (x == NULL) return NULL;
for(int i = 0; i<n; i++){
for(int j=0; j<i; j++){
x[i] += A[i][j] * x[j];
}
x[i] = (b[i] - x[i]) / A[i][i];
}
return x;
}
A = reserver_inf(n);
b = malloc(n*sizeof(float));
if (b == NULL || A == NULL){
printf("Erreur de r�servation de la m�moire \n");
exit(1);
}
lire_inf(A, n);
lire_vect(b, n);
printf("\n\nVous avez saisi : \n");
afficher_inf(A, n);
afficher_vect(b, n);
if (x != NULL){
printf("Solution du systeme lineaire :\n");
afficher_vect(x, n);
}
else printf("Le systeme n'admet pas de solution\n");
free(x);
free(b);
liberer_inf(A, n);
return 0;
}
/** Exercice
* 1 - Ecrire les fonctions qui permettent de r�soudre un syst�me
* lin�aire triangulaire sup�rieur.
*
* 2 - Chercher une m�thode de d�composition d'une matrice carr�e A en
* produit de deux matrices triang inf L et triang sup U : A = LU
* (voir https://fr.wikipedia.org/wiki/D�composition_LU)
*
* 3 - Ecrire les fonctions pour r�soudre un syst�me lin�aire general.
*
*
*
* HAPPY CODING
*
*/