Pivot de gauss

Soyez le premier à donner votre avis sur cette source.

Snippet vu 30 153 fois - Téléchargée 16 fois

Contenu du snippet

Ce script permet d'effectuer un pivot de Gauss en ligne (ou en colonne avec la transposée).

Il intègre également deux autres fonctions : l'une pour déterminer le rang de la matrice, l'autre pour obtenir sa transposée.

Source / Exemple :


#!/usr/bin/python
#-*-coding: utf-8 -*-

#       Auteur : Linkid

def pivot(tab):
	line, col = len(tab), len(tab[0]) ## on considere que tab a deux dimensions et est non vide
	i, j = 0, 0
	
	while j < col and i < line:
		## tri inverse de tab
		tab.sort(reverse=1)
		#print tab, 'tri',
		## recherche d'un pivot
		k = i+1
		max = i ## Pivot
		while k < line:
			if ( abs( tab[k][j] ) > abs( tab[max][j] ) ):
				max = k
			k = k+1
		#print max
		
		
		## l'algo en lui-meme
		if tab[max][j] != 0:
			## reduction du coef pivot a 1
			k = j
			piv = tab[max][j]
			while k < col:
				tab[max][k] = tab[max][k] * 1. / piv
				k = k+1
			#print tab
			
			## operations du pivot de Gauss
			k = 0
			while k < line:
				if k != max:
					t = 0
					ca = tab[k][j] ## coef de la colonne pivot j de la ligne k modifiee
					while t < col:
						tab[k][t] = tab[k][t] - ca * tab[max][t]
						#print tab[k][t], ca, tab[max][t]
						t = t+1
				k = k+1
			i = i+1
		j = j+1
		#print tab, 'fin'
	tab.sort(reverse=1) ## peu important et ajoute un peu de complexite
	return tab

def transpose(tab):
	col = len(tab[0])
	t = []
	li = 0
	while li < col:
		t.append([])
		li = li+1
	for l in tab:
		k = 0
		while k < col:
			t[k].append(l[k])
			k = k+1
	return t

def rang(tab):
	tab = transpose(tab)
	tab = pivot(tab)
	line, col = len(tab), len(tab[0])
	rg = 0
	for k in tab:
		if k != [0]*col:
			rg += 1
	return rg

if __name__ == "__main__":
	a = [[1, 1, 1, 1], [1, -1, 1, -1], [-1, 1, -1, 1]] ## Test
	b = [[0, 0, 0], [-2, 1, -1], [2, 0, 2]] ## Test
	print rang(b) ## Test

Conclusion :


Ce script est intéressant pour les calculs matriciels et donc pour les résolutions d'équations (suites, ...).

Je vais bientôt ajouter une fonction permettant d'avoir l'inverse de la matrice de départ si inversible elle est, puis une seconde pour le noyau et l'image de la matrice.
À suivre...

A voir également

Ajouter un commentaire

Commentaire

Messages postés
6413
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
17 mai 2018
293
Le pivot de Gauss !!! Ca me rappelle mes premiers exos de programmation, et toutes les fois ou je me suis arraché les cheveux sur ce code!

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.