I seem to be losing a lot of precision with floats.
For example I need to solve a matrix:
4.0x -2.0y 1.0z =11.0 1.0x +5.0y -3.0z =-6.0 2.0x +2.0y +5.0z =7.0
This is the code I use to import the matrix from a text file:
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]))
I need to solve using gauss-seidel so I need to rearrange the equations for x, y, and z:
x=(11+2y-1z)/4 y=(-6-x+3z)/5 z=(7-2x-2y)/7
Here is the code I use to rearrange the equations. b is a matrix of coefficients and y is the answer vector:
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
However the answers I get back aren’t precise to the decimal place.
For example, upon rearranging the second equation from above, I should get:
y=-1.2-.2x+.6z
What I get is:
y=-1.2-0.20000000000000001x+0.59999999999999998z
This might not seem like a big issue but when you raise the number to a very high power the error is quite large. Is there a way around this? I tried the Decimal class but it does not work well with powers (i.e, Decimal(x)**2).
Any ideas?
I’m not familiar enough with the Decimal class to help you out, but your problem is due to the fact that decimal fractions can often not be accurate represented in binary, so what you’re seeing is the closest possible approximation; there’s no way to avoid this problem without using a special class (like Decimal, probably).
EDIT:What about the decimal class isn’t working properly for you? As long as I start with a string, rather than a float, powers seem to work fine.The module documentation explains the need for and usage of
decimal.Decimalpretty clearly, you should check it out if you haven’t yet.