Vous êtes sur la page 1sur 3

/**

Exercice Exemple : gestion dynamique de la m�moire

R�solution d'un systeme lin�aire triangulaire inf�rieur : Ax = b


avec A une matrice triangulaire inf�rieure de taille n
b un vecteur de taille n
x est le vecteur inconnu de taille n aussi

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;
}

int main(int argc, char const *argv[]){


float **A, *b, *x;
int n;
printf("Donner la taille du systeme lineaire : ");
scanf("%d", &n);

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);

printf("\n\nR�solution ....................... \n\n");


x = solve_inf(A, 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
*
*/

Vous aimerez peut-être aussi