这是我的示例代码.它是高斯塞德尔(矩阵求解器)的迭代过程.基本上当错误足够小时,它会突破while循环.
i=1
while (i>0):
x_past = x_present
j=0
while(j<3):
value=0
k=0
while(k<3):
if(k!=j):
if(i==1):
if(k>j):
value=value+0
else:
value=value+x_present[k]*eqn[j][k]
else:
value=value+x_present[k]*eqn[j][k]
else:
value=value+eqn[j][k]
k=k+1
x_present[j:j+1]=[value]
j=j+1
print "X_PAST"
print x_past
print "X_PRESENT"
print x_present
if(error(x_past, x_present)<10**-2):
break;
i=i+1
Run Code Online (Sandbox Code Playgroud)
我减少了代码,使其更易于管理.如果你不明白它的作用,解决这个问题并不是那么重要.
这是问题所在.每次
x_present[j:j+1]=[value]
Run Code Online (Sandbox Code Playgroud)
运行时,x_past等于x_present.我不知道为什么会这样,因为我设置的x_past等于x_present的唯一位置是在循环的顶部.如果我带走了
x_past=x_present
Run Code Online (Sandbox Code Playgroud)
句子,x_past永远不会等于x_present.这使我认为这是导致问题的两个陈述的某种组合.
如果每次x_past = x_present错误= 0并且第一次迭代后循环中断,则这是一个很大的问题.代码确实有效,例如,如果我告诉代码运行8次迭代并且中断它给了我应该的答案.
在过去的4个小时里,我一直在努力解决这个问题,而且我完全被困住了.我没有使用python很长时间,所以我的麻烦射击技巧语法明智不是那么好.任何帮助,将不胜感激!!
mon*_*kut 30
是的,我认为这里的答案显示了你的问题.只是为了尝试澄清一点点.
您正在引用列表,因此当列表更改时,对该列表的任何引用都将反映该更改.展示:
>>> x_present = [4,5,6]
>>>
>>> x_past = x_present
>>>
>>> x_past
[4, 5, 6]
>>>
>>> x_present.append(7)
>>>
>>> x_past
[4, 5, 6, 7]
>>>
Run Code Online (Sandbox Code Playgroud)
如果你想要列表的副本,你需要这样做,listcopy = mylist [:].
>>> x_past = x_present[:]
>>> x_past
[4, 5, 6, 7]
>>>
>>> x_present.append(8)
>>>
>>> x_past
[4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)