Dezimalstellenprobleme mit Gleitkommazahlen und Dezimalstellen.Decimal

Ich scheine viel Präzision mit Schwimmern zu verlieren.

Zum Beispiel muss ich eine Matrix lösen:

4.0x -2.0y 1.0z =11.0
1.0x +5.0y -3.0z =-6.0
2.0x +2.0y +5.0z =7.0

Dies ist der Code, mit dem ich die Matrix aus einer Textdatei importiere:

f = open('gauss.dat')
lines =  f.readlines()
f.close()

j=0
for line in lines:
    bits = string.split(line, ',')
    s=[]
    for i in range(len(bits)):
        if (i!= len(bits)-1):
            s.append(float(bits[i]))
            #print s[i]
    b.append(s)
    y.append(float(bits[len(bits)-1]))

Ich muss mit Gauß-Seidel lösen, also muss ich die Gleichungen für x, y und z neu anordnen:

x=(11+2y-1z)/4
y=(-6-x+3z)/5
z=(7-2x-2y)/7

Hier ist der Code, mit dem ich die Gleichungen neu anordne.b ist eine Matrix von Koeffizienten undy ist der Antwortvektor:

def equations(b,y):
    i=0
    eqn=[]
    row=[]
    while(i<len(b)):
        j=0
        row=[]
        while(j<len(b)):
            if(i==j):
                row.append(y[i]/b[i][i])
            else:
                row.append(-b[i][j]/b[i][i])
            j=j+1
        eqn.append(row)
        i=i+1
    return eqn

Allerdings sind die Antworten, die ich zurück bekomme, nicht auf die Dezimalstelle genau.

Zum Beispiel, wenn ich die zweite Gleichung von oben neu anordnete, sollte ich erhalten:

y=-1.2-.2x+.6z

Was ich bekomme ist:

y=-1.2-0.20000000000000001x+0.59999999999999998z

Dies scheint kein großes Problem zu sein, aber wenn Sie die Zahl auf eine sehr hohe Potenz erhöhen, ist der Fehler ziemlich groß. Gibt es einen Weg, dies zu umgehen? Ich habe das @ ausprobieDecimal Klasse, aber es funktioniert nicht gut mit Kräften (d. h.Decimal(x)**2).

Irgendwelche Ideen

Antworten auf die Frage(12)

Ihre Antwort auf die Frage