Метод гаусса python код программы

Метод Гаусса является одним из основных методов решения систем линейных уравнений. В этой статье мы рассмотрим, как реализовать этот метод в языке программирования Python.

Описание метода Гаусса

Метод Гаусса основан на приведении матрицы системы к ступенчатому виду с помощью элементарных преобразований. Затем система решается обратной подстановкой.

Реализация метода Гаусса в Python

Для реализации метода Гаусса в Python, начнем с создания функции:

def gauss_method(matrix, vector): n = len(matrix) for i in range(n): max_el = abs(matrix[i][i]) max_row = i for k in range(i + 1, n): if abs(matrix[k][i]) > max_el: max_el = abs(matrix[k][i]) max_row = k matrix[i], matrix[max_row] = matrix[max_row], matrix[i] vector[i], vector[max_row] = vector[max_row], vector[i] for k in range(i + 1, n): c = -matrix[k][i] / matrix[i][i] for j in range(i, n): if i == j: matrix[k][j] = 0 else: matrix[k][j] += c * matrix[i][j] vector[k] += c * vector[i] x = [0 for _ in range(n)] for i in range(n — 1, -1, -1): x[i] = vector[i] / matrix[i][i] for k in range(i — 1, -1, -1): vector[k] -= matrix[k][i] * x[i] return x

Пример использования функции

Для демонстрации работы функции gauss_method, создадим матрицу и вектор, представляющие следующую систему уравнений:

Лекция 151: Реализация и тестирование метода Гаусса на компьютере


A = [ [3, 2, -1], [2, -2, 4], [-1, 0.5, -1] ] b = [1, -2, 0]

Теперь, вызовем функцию gauss_method и выведем результат:

result = gauss_method(A, b) print(«Решение системы уравнений:», result)

Выполнив данный код, мы получим решение системы уравнений с помощью метода Гаусса.

Вывод

Метод Гаусса является эффективным и широко используемым методом решения систем линейных уравнений. В этой статье мы рассмотрели пример реализации метода Гаусса на языке программирования Python. Предложенная функция может быть использована для решения систем уравнений с любым количеством переменных и уравнений.

Источник: www.articleshub.net

метод гаусса на python 3

Мне необходимо выполнить задачу: Метод Гаусса на питоне. Собственно сам алгоритм я реализовал, там ничего сложного, вот он:

myA=[ [1.0, -2.0, 3.0, -4.0], [3.0, 3.0, -5.0, -1.0], [3.0, 0.0, 3.0, -10.0], [-2.0, 1.0, 2.0, -3.0] ] myB = [ 2.0, -3.0, 8.0, 5.0] # — end of исходные данные # — вывод системы на экран def FancyPrint(A, B, selected): for row in range(len(B)): print(«(«, end=») for col in range(len(A[row])): print(«t».format(» » if (selected is None or selected != (row, col)) else «*», A[row][col]), end=») print(«t) * (tX) = (t)».format(row + 1, B[row])) # — end of вывод системы на экран # — перемена местами двух строк системы def SwapRows(A, B, row1, row2): A[row1], A[row2] = A[row2], A[row1] B[row1], B[row2] = B[row2], B[row1] # — end of перемена местами двух строк системы # — деление строки системы на число def DivideRow(A, B, row, divider): A[row] = [a / divider for a in A[row]] B[row] /= divider # — end of деление строки системы на число # — сложение строки системы с другой строкой, умноженной на число def CombineRows(A, B, row, source_row, weight): A[row] = [(a + k * weight) for a, k in zip(A[row], A[source_row])] B[row] += B[source_row] * weight # — end of сложение строки системы с другой строкой, умноженной начисло # — решение системы методом Гаусса (приведением к треугольному виду) def Gauss(A, B): column = 0 while (column < len(B)): print(«Ищем максимальный по модулю элемент в -м столбце:».format(column + 1)) current_row = None for r in range(column, len(A)): if current_row is None or abs(A[r][column]) > abs(A[current_row][column]): current_row = r if current_row is None: print(«решений нет») return None FancyPrint(A, B, (current_row, column)) if current_row != column: print(«Переставляем строку с найденным элементом повыше:») SwapRows(A, B, current_row, column) FancyPrint(A, B, (column, column)) print(«Нормализуем строку с найденным элементом:») DivideRow(A, B, column, A[column][column]) FancyPrint(A, B, (column, column)) print(«Обрабатываем нижележащие строки:») for r in range(column + 1, len(A)): CombineRows(A, B, r, column, -A[r][column]) FancyPrint(A, B, (column, column)) column += 1 print(«Матрица приведена к треугольному виду, считаем решение») X = [0 for b in B] for i in range(len(B) — 1, -1, -1): X[i] = B[i] — sum(x * a for x, a in zip(X[(i + 1):], A[i][(i + 1):])) print(«Получили ответ:») print(«n».join(«X =t».format(i + 1, x) for i, x in enumerate(X))) return X # — end of решение системы методом Гаусса (приведением к треугольному виду) print(«Исходная система:») FancyPrint(myA, myB, None) print(«Решаем:») Gauss(myA, myB)

Читайте также:
Укажите все преимущества программы антиклещ

Но мне необходимо, чтобы матрицу коэффицентов и правых частей можно было вводить в самой программе, а не в коде. То есть чтобы появилось поле «Введите матрицу коэфицентов» и «Введите матрицу правых частей», я ввожу туда данные и программа вычисляет. Пробовал изменить первые две строки на

СЛАУ в Python


myA = input(«введите матрицу коэфициентов») myB= input(«Введите матрицу правых частей»)

Но выдает ошибку Не подскажите как можно исправить? Заранее спасибо!

Источник: ru.stackoverflow.com

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

Gauss / gauss.py /

Code definitions
Code navigation index up-to-date

  • Go to file T
  • Go to line L
  • Go to definition R
  • Copy path
  • Copy permalink

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Cannot retrieve contributors at this time
254 lines (206 sloc) 6.29 KB

  • Open with Desktop
  • View raw
  • Copy raw contents Copy raw contents Copy raw contents

Copy raw contents

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

eps = 1e-10 # погрешность
# Функция вывода матрицы на экран
def displayArray ( info , a ):
print ( info )
n = len ( a )
for i in range ( n ):
line = «»
for j in range ( n + 1 ):
line += str ( «%10.5f» % a [ i ][ j ]) + » «
if j == n — 1 :
line += «| «
print ( line )
print ( «» )
# Функция вывода матрицы на экран
def displayArray2 ( info , a ):
print ( info )
n = len ( a )
for i in range ( n ):
line = «»
for j in range ( n ):
line += str ( «%10.5f» % a [ i ][ j ]) + » «
print ( line )
print ( «» )
# Функция вывод решения на экран
def displaySolution ( x ):
print ( «Решение системы:» )
for i , val in enumerate ( x ):
print ( «x%x» % ( i + 1 ), » = %5.5f» % val )
# Функция вывода умножения матриц на экран
def displayVec ( info , r ):
print ( info )
n = len ( r )
for i in range ( n ):
print ( «%5.5f» % r [ i ], end = » » )
print ( «» )
# Нахождение максимально элемента в строке
def maxelement ( a , col , count_swap ):
n = len ( a )
maxel = a [ col ][ col ]
maxrow = col
for i in range ( col + 1 , n ):
if maxel < abs ( a [ i ][ col ]):
maxel = abs ( a [ i ][ col ])
maxrow = i
if col != maxrow :
swap ( a , maxrow , col )
count_swap += 1
return count_swap
# Проверка на ноль
def checkByZero ( q ):
if abs ( q ) < eps :
return 1
# Вычисление определителя
def determinant ( a , count_swap ):
det = 1
n = len ( a )
if count_swap % 2 :
count_swap = — 1
else :
count_swap = 1
for i in range ( n ):
det *= a [ i ][ i ]
det *= count_swap
return det
# Перестановка строк
def swap ( a , row_one , row_two = 0 ):
n = len ( a )
for i in range ( n + 1 ):
tmp = a [ row_one ][ i ]
a [ row_one ][ i ] = a [ row_two ][ i ]
a [ row_two ][ i ] = tmp
# Вычетание строк
def sub ( a , row_one , row_two , mn = 1 ):
n = len ( a )
for i in range ( n + 1 ):
a [ row_one ][ i ] -= a [ row_two ][ i ] * mn
return a
# Приведение к треугольной матрице
def triangle ( a ):
n = len ( a )
count_swap = 0
for j in range ( n ):
count_swap = maxelement ( a , j , count_swap )
for i in range ( j + 1 , n ):
c = a [ i ][ j ] / a [ j ][ j ]
sub ( a , i , j , c )
return count_swap
# Нахождение решение, методом обратного хода
def searchSolution ( a ):
n = len ( a )
solution = [ 0 for i in range ( n )]
for i in range ( n — 1 , — 1 , — 1 ):
solution [ i ] = a [ i ][ n ] / a [ i ][ i ]
for j in range ( i — 1 , — 1 , — 1 ):
a [ j ][ n ] -= a [ j ][ i ] * solution [ i ]
return solution
# Метод Гаусса
def gauss ( a ):
count_swap = triangle ( a )
det = determinant ( a , count_swap )
flag = checkByZero ( det )
if flag :
print ( » n Матрица вырожденная. Определитель равен нулю n » )
exit ( 1 )
x = searchSolution ( a )
return x
# Умножение матриц
def matrix_mul ( a , x ):
n = len ( a )
m = len ( x )
result = []
for i in range ( n ):
s = 0
for j in range ( m ):
s += x [ j ] * a [ i ][ j ]
result . append ( s )
return result
# Умножение матриц 2
def matrix_mul_2 ( a , b ):
n = len ( a )
res = [[ 0 for i in range ( n )] for j in range ( n )]
for i in range ( n ):
for j in range ( n ):
for k in range ( n ):
res [ i ][ j ] += a [ i ][ k ] * b [ k ][ j ]
return res
# Выделение матрицы B
def getVectorB ( a ):
n = len ( a )
vectorB = []
for i in range ( n ):
vectorB . append ( a [ i ][ n ])
return vectorB
def getVectorA ( a ):
vectorA = a [:]
return vectorA
# Нахождение невязки
def discrepancy ( res , b ):
for i in range ( len ( b )):
res [ i ] = b [ i ] — res [ i ]
return res
# Обратная матрица
def inverse ( a ):
n = len ( a )
inv = [[ 0 for i in range ( len ( a ) + 1 )] for j in range ( len ( a ))]
for i in range ( n ):
for j in range ( n ):
if i == j :
a [ j ][ n ] = 1.0
else :
a [ j ][ n ] = 0.0
q = copy . deepcopy ( a )
vec_sol = gauss ( q )
for k in range ( len ( vec_sol )):
inv [ k ][ i ] = vec_sol [ k ]
return inv
# Вычисление нормы
def norm ( a ):
n = len ( a )
max = 0
for i in range ( n ):
sum = 0
for j in range ( n ):
sum += abs ( a [ i ][ j ])
if max < sum :
max = sum
return max
# Число обусловленности матрицы
def condition_number ( norm_one , norm_two ):
cond = norm_one * norm_two
return cond
if __name__ == «__main__» :
import numpy , copy
arr = numpy . loadtxt ( ‘input.txt’ , float )
clean_arr = copy . deepcopy ( arr )
displayArray ( «Начальная матрица» , arr )
# Метод Гаусса
count_swap = triangle ( arr )
displayArray ( «Треугольная матрица» , arr )
det = determinant ( arr , count_swap )
flag = checkByZero ( det )
if flag :
print ( » n Матрица вырожденная. Определитель равен нулю n » )
exit ( 1 )
print ( «Определитель: %5.5f» % det )
x = searchSolution ( arr )
displaySolution ( x )
# Нахождение невязки
b = getVectorB ( clean_arr )
displayVec ( «Вектор B:» , b )
res = matrix_mul ( clean_arr , x )
displayVec ( «Результат перемножения матрицы A на вектор решения X:» , res )
dis = discrepancy ( res , b )
displayVec ( «Невязка:» , dis )
# Нахождение обратной матрицы
inv = inverse ( clean_arr )
displayArray2 ( «Обратная матрица» , inv )
# Нахождение числа обусловленности матрицы
a = getVectorA ( clean_arr )
displayArray2 ( «Матрица A» , a )
norm_a = norm ( clean_arr )
print ( «Норма А: » , norm_a , end = «» )
norm_inv = norm ( inv )
print ( » n Норма обратной матрицы: » , norm_inv , end = «» )
cond = condition_number ( norm_a , norm_inv )
print ( » n Число обусловленности матрицы: » , cond , end = «» )
  • Copy lines
  • Copy permalink
  • View git blame
  • Reference in new issue
Читайте также:
Ошибки в программе Microsoft visual c

Источник: github.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru