A főként a lineáris algebrában és a numerikus analízisben használatos Gram–Schmidt-ortogonalizálás (avagy Gram–Schmidt-eljárás, esetleg Gram–Schmidt-féle ortogonalizálási eljárás) egy skalárszorzatos tér egy véges, lineárisan független {vj} vektorrendszerét alakítja át egy olyan {uj} vektorrendszerré, melynek elemei páronként merőlegesek egymásra (a skalárszorzatra vonatkozóan), más szóval ortogonálisak, és a két vektorrendszer ugyanazt az alteret feszíti ki az említett skalárszorzatos térben.
------------------def scalar_product(u, v):
"""Két vektor skaláris szorzata."""
return sum(ui * vi for ui, vi in zip(u, v))
def vector_sub(u, v):
"""Két vektor különbsége: u - v."""
return [ui - vi for ui, vi in zip(u, v)]
def vector_scalar_mult(c, u):
"""Vektor szorzása skalárral: c * u."""
return [c * ui for ui in u]
def gram_schmidt(vectors):
"""Gram-Schmidt ortogonalizációs algoritmus."""
orthogonal = []
for v in vectors:
# Kezdjük az aktuális v vektorral
u = list(v)
# Vonjuk le a már megvan ortogonális vektorokra eső vetületeket
for ortho_u in orthogonal:
# Skaláris szorzatok kiszámítása
num = scalar_product(v, ortho_u)
den = scalar_product(ortho_u, ortho_u)
if den != 0:
proj = vector_scalar_mult(num / den, ortho_u)
u = vector_sub(u, proj)
orthogonal.append(u)
return orthogonal
# --- Példa használat ---
if __name__ == "__main__":
# Megadott lineárisan független vektorok
v1 = [1, 1, 0]
v2 = [1, 0, 1]
v3 = [0, 1, 1]
input_vectors = [v1, v2, v3]
result = gram_schmidt(input_vectors)
print("Eredeti vektorok:", input_vectors)
print("Ortogonális vektorok:")
for r in result:
print([round(val, 4) for val in r])
----------------
Eredeti vektorok: [[1, 1, 0], [1, 0, 1], [0, 1, 1]]
Ortogonális vektorok:
[1, 1, 0]
[0.5, -0.5, 1.0]
[-0.6667, 0.6667, 0.6667]
Nincsenek megjegyzések:
Megjegyzés küldése