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