2026. július 27., hétfő

Példa Gram-Schmidt ortogonalizálásra

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