4- дәріс Тақырыбы


KRAMER программасын қарастырайық. Бұл программада DETER



бет4/4
Дата01.01.2022
өлшемі50,19 Kb.
#107643
түріПрограмма
1   2   3   4
Байланысты:
4-Лекция АП

KRAMER программасын қарастырайық. Бұл программада DETER квадратты матрицаның анықтауышын есептеу процедурасының көмегімен сызықты алгебралық теңдеулер жүйесінің шешімі табылады.

{Ах=b теңдеулер жүйесін Крамер әдісімен шешу программасы }

from functools import reduce

from operator import mul, sub

 

def column(row):

    i = 0

    n = len(row)

    while not row[i] and i < n:

        i += 1

    return i if i < n else -1

 

def sign(indexes):

    s = sum((0, 1)[x < y] for k, y in enumerate(indexes) for x in indexes[k+1:])

    return ((s + 1) % 2 - s % 2)

 

def det(matrix):

    M = matrix[:]

    n = len(M)

 

    indexes = [0 for _ in range(n)]



 

    for i in range(n):

        k = column(M[i])

        for j in (x for x in range(n) if x != i):

            M[j] = tuple(map(sub, M[j],

                             map(mul, M[i], [M[j][k] / M[i][k]] * (n+1))))

        indexes[i] = k

 

    return reduce(mul, (M[i][indexes[i]] for i in range(n)), 1) * sign(indexes)



 

def kramer(les):

    """ Решение методом Крамера """

 

    n = len(les)



    tmp = list(zip(*les))

    b = tmp[-1]

    del tmp[-1]

 

    delta = det(tmp)



    if not delta:

        raise RuntimeError("Решения нет")

 

    result = []



    for i in range(n):

        a = tmp[:]

        a[i] = b

        result.append(det(a) / delta)

    return result

 

def gauss(les):

    """ Решение методом Гауса """

 

    n = len(les)



    M = les[:]

 

    indexes = [0 for _ in range(n)]



 

    for i in range(n):

        k = column(M[i])

        M[i] = [M[i][j] / M[i][k] for j in range(n+1)]

        for j in (x for x in range(n) if x != i):

            M[j] = tuple(map(sub, M[j], map(mul, M[i], [M[j][k]] * (n + 1))))

        indexes[i] = k

 

    return [M[indexes[i]][n] for i in range(n)]



 

if "__main__" == __name__:

    matrix = [(2 5 4 30),

                  (1 3 2 150),

                  (2 10 9 110)]

 

    print(kramer(matrix))



    print("=" * 50)

    print(gauss(matrix))


Бақылау сұрақтары:

1. Рекурсия дегенді қалай түсінеміз?

2. Қандай көмекші алгоритм рекурсивті деп аталады? Өз мысалдарыңызды келтіріңіз.

3. Шектік шарт дегеніміз не? Оның қолданысы не үшін керек?



4. Рекурсивті түсу дегеніміз не?

5. Рекурсивті көтерілу дегеніміз не?

Достарыңызбен бөлісу:
1   2   3   4




©engime.org 2024
әкімшілігінің қараңыз

    Басты бет