Metoda eliminacyjna w rozwiązywaniu układów równań linowych

0

Cześć, mam taki problem, że w kodzie poniżej, nie wiem co zrobić aby wdanej macierzy wiersze się nie zamieniały i żeby była możliwość porównania wyników, z zamianą wierszy i bez zamiany, byłbym wdzięczny za pomoc lub wskazówki :)

import numpy


def norma(xx):
    return (sum(x**2 for x in xx))**0.5

def wyznacz_blad_spelnienia_url(a,x,b):
    n = a.shape[0]
    r = numpy.zeros((n,), 'd')
    for i in range(n):
        t = 0.0
        for j in range(n):
            t += a[i,j]*x[j]
        r[i] = b[i] - t
    return norma(r)

def czytaj(nazwa):
    with open(nazwa) as f:
        dane = f.readlines()
    n = len(dane)
    a = numpy.zeros((n,n), 'd')
    b = numpy.zeros((n,))
    i = 0
    for x in dane:
        x = x.split()
        for j in range(n):
            a[i,j] = float(x[j])
        b[i] = float(x[n])
        i += 1
    return n, a, b

def czy_rozwiazanie(a, x, b, tol = 1e-10):
    res = wyznacz_blad_spelnienia_url(a,x,b)
    return norma(res) < tol

def czyGTr(a):
    n = a.shape
    for i in range(1, n[0]):
        for j in range(0, i):
            if (a[i,j] != 0):
                return False
    return True

def rozwiaz_uklad_trojkatny(a, b):
    # czy a jest m kw
    n = a.shape[0]
    assert a.shape == (n, n)
    assert b.shape == (n, )

    for i in range(n):
        if a[i,i] == 0.0:
            return None

    x = numpy.zeros((n,))
    # przeglądamy równania od ostatniego do pierwszego
    for i in range(n-1, -1, -1):
        # z i-tego równania wyznaczyć x[i]
        suma = 0.0
        for j in range(i+1, n):
            suma += a[i,j] * x[j]
        x[i] = (b[i] - suma) / a[i,i]
    return x

def do_postaci_trojkatnej(a, b):
    # czy a jest m kw
    n = a.shape[0]
    assert a.shape == (n, n)
    assert b.shape == (n, )
    for i in range(0, n-1):
        print('*')
        # i ty wiersz służy do wyzerowania element ów w i-tej kolumnie pod przekątną
        for j in range(i+1,n):
            # za pomocą wiersza nr i modyfikujemny wiersz nr j
            # tak by wyzerować w j-tym wierszu elem z itej kolumny
            if a[i,i] != 0.:
                wsp = - a[j,i] / a[i,i]
                for k in range(i, n):
                    a[j,k] += wsp*a[i,k]
                b[j] += wsp*b[i]
            else:
                print('katastrofa!')

def rozwiaz_url(a, b):
    # sproadź układ do postaci trójkątnej o takim samym rozwiąznaiu
    do_postaci_trojkatnej(a,b)
    # rozwiąz ten układ trójkąnty
    return rozwiaz_uklad_trojkatny(a,b)


def rozwiaz_ur(a, b):
    return rozwiaz_uklad_trojkatny(a,b)

plik = 'mzla.txt'
n, m, r =  czytaj(plik)
print(m, m.shape)
print(r, r.shape)
y = rozwiaz_url(m, r)
z = rozwiaz_ur(m,r)
print("Rozwiazanie bez zamiany:")
print(z)
print("Y")
print(y)
print("M")
print(m)
print("R")
print(r)
if y is not None:
    blad = wyznacz_blad_spelnienia_url(m,y,r)
    print(blad)
    n, m, r = czytaj(plik)
    blad = wyznacz_blad_spelnienia_url(m,y,r)
    print(blad)
    
if z is not None:
    bladd = wyznacz_blad_spelnienia_url(m,z,r)
    print(bladd)
    n, m, r = czytaj(plik)
    bladd = wyznacz_blad_spelnienia_url(m,z,r)
    print(bladd)

tak wygląda wczytywany plik:

-6.96 -0.21 2.28 1.70 -6.22 -6.48 -15.89
-4.26 -0.03 1.26 0.98 -3.92 -3.97 -9.94
-2.60 -0.18 1.02 0.72 -2.30 -2.40 -5.74
-1.66 0.15 0.24 0.26 -1.62 -1.56 -4.19
-0.95 -0.33 0.78 0.46 -0.68 -0.84 -1.56
-0.71 0.48 -0.54 -0.21 -0.94 -0.72 -2.64

0

W którym momencie wiersze się zamieniają, debugowałeś? Zamiana miejscami wierszy czy kolumn, nie ma wpływu na rozwiązanie układu równań.

0

nie ma w kodzie zamiany wierszy, trzeba stworzyć funkcje, która by to robiła tylko nie za bardzo wiem jak za to się zabrać, może nie mieć wpływu ale dostałem takie wytyczne w szkole by porównać

0

moze napisz z jakiej matematyki korzystales tworzac ten program ?

wg mnie przy obliczeniach na komputerze nie ma sensu stosowac eliminacji

nalezy rozwiazac rownanie macierzowe AX=B -> X=A^[-1] x B albo na wyznacznikach

1 użytkowników online, w tym zalogowanych: 0, gości: 1