我似乎失去了很多使用浮点数的精度。小数位浮点数和小数点的位置问题。小数点
例如我需要解决一个矩阵:
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
这里是我用来重新排列equ ations。 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
但是我找回答案并不精确到小数点后一位。
例如,在重新安排从上面的第二个方程,我应该得到:
y=-1.2-.2x+.6z
我得到的是:
y=-1.2-0.20000000000000001x+0.59999999999999998z
这看起来可能不是一个大问题,但是当你提高数量非常高,功率误差相当大。有没有解决的办法?我尝试了Decimal
课程,但它不适用于权力(即Decimal(x)**2
)。
任何想法?
我以前用力量的问题是我试图提高到0.5的能力。为此,我必须编写decimal.Decimal(“1.2)** decimal.Decimal(”0.5“) – darudude 2008-11-13 15:39:47
您错过了一个引用,也许这就是问题所在。如果您发现它太冗长,可以始终使用D = decimal.Decimal; D(“1.2”)** D(“0.5”) – recursive 2009-01-02 17:09:28