问题
import re
def get_number(element):
re_number = re.match("(\d+\.?\d*)", element)
if re_number:
return float(re_number.group(1))
else:
return 1.0
def getvalues(equation):
elements = re.findall("([a-z0-9.]+)", equation)
return [get_number(element) for element in elements]
eqn = []
eqn_no = int(raw_input("Enter the number of equations: "))
for i in range(eqn_no):
eqn.append(getvalues(str(raw_input("Enter Equation %d: " % (i+1)))))
print "Main Matrix: "
for i in range((eqn_no)):
for j in range((eqn_no+1)):
print "\t%f" %(eqn[i][j]),
print
print
equation=[]
equation=eqn
for k in range((eqn_no-1)):
for i in range((k+1),eqn_no):
for j in range((eqn_no+1)):
if(eqn[i][j]!=0):
eqn[i][j]=eqn[i][j]-(eqn[k][j]*(equation[i][k]/eqn[k][k]))
print "Matrix After %d step: " %(k+1)
for i in range(eqn_no):
for j in range((eqn_no+1)):
print "\t%f"%(eqn[i][j]),
equation[i][j]=eqn[i][j];
print
print
for input:
25x+5y+z=106.8
64x+8y+z=177.2
144x+12y+z=279.2
output is:
Main Matrix:
25.000000 5.000000 1.000000 106.800000
64.000000 8.000000 1.000000 177.200000
144.000000 12.000000 1.000000 279.200000
Matrix After 1 step:
25.000000 5.000000 1.000000 106.800000
0.000000 8.000000 1.000000 177.200000
0.000000 12.000000 1.000000 279.200000
Matrix After 2 step:
25.000000 5.000000 1.000000 106.800000
0.000000 8.000000 1.000000 177.200000
0.000000 0.000000 1.000000 279.200000
But it should be like
Main Matrix:
25.000000 5.000000 1.000000 106.800000
64.000000 8.000000 1.000000 177.200000
144.000000 12.000000 1.000000 279.200000
Matrix After 1 step:
25.000000 5.000000 1.000000 106.800000
0.000000 -4.80000 -1.56000 -96.208000
0.000000 -16.8000 -4.76000 -335.968000
Matrix After 2 step:
25.000000 5.000000 1.000000 106.800000
0.000000 -4.80000 -1.56000 -96.208000
0.000000 0.000000 0.699999 0.759981
First of all this is a partial code for solving root of n number of equations using Naive Guass elemination method. Does anyone have any idea why the hell on earth is this happening? Why the zero parts are changing and others aren't? I have done this code in c++ and it works there perfectly but here I'm facing many problem. Maybe I'm newbie to python. I'm using python 2.7.....
回答1:
I think the problem is the assignment equation = eqn
. Since eqn
is a list, it is a mutable and thus passed as a reference, when you assign a mutable, the variable actually contains a pointer to that object. This means that equation
and eqn
are the same list.
You should
from copy import deepcopy
equation = deepcopy(eqn)
You need deepcopy
instead of copy
because you have a list of lists, also the inner list needs to be copied.
回答2:
This line:
equation=eqn
doesn't do what you think it does. Try this instead:
import copy
equation=copy.deepcopy(eqn)
Python assignment isn't a copy operation, but rather a binding operation. The line you have means "bind the name equation
to the same object to which eqn
is currently bound."
Your algorithm requires that equation
and eqn
are distinct objects.
来源:https://stackoverflow.com/questions/31461840/nested-list-doesnt-work-properly