フロートでかなりの精度を失っているようです。
たとえば、行列を解く必要があります。
4.0x -2.0y 1.0z =11.0
1.0x +5.0y -3.0z =-6.0
2.0x +2.0y +5.0z =7.0
これは、テキストファイルからマトリックスをインポートするために使用するコードです。
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]))
ガウス・ザイデルを使用して解く必要があるため、x、y、zの方程式を再配置する必要があります。
x=(11+2y-1z)/4
y=(-6-x+3z)/5
z=(7-2x-2y)/7
これが私が方程式を再配置するために使用するコードです。b
は係数の行列であり、y
は答えベクトルです。
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
しかし、私が返す答えは小数点以下の桁数まで正確ではありません。
たとえば、上から2番目の方程式を並べ替えると、次のようになります。
y=-1.2-.2x+.6z
私が得るものは:
y=-1.2-0.20000000000000001x+0.59999999999999998z
これは大きな問題ではないように思われるかもしれませんが、数値を非常に高い累乗に上げると、エラーは非常に大きくなります。これを回避する方法はありますか?クラスを試しましたDecimal
が、パワー(つまり)ではうまく機能しませんDecimal(x)**2
。
何か案は?