对于循环附加到列表(可能是可解释的奇怪行为)



我试图实现这里详细介绍的Runge-Kutta方法。但是,我想返回这些值,所以我修改了VDP1((方程,如下所示。

奇怪的行为是,如果我同时计算x并将该值附加到数组中,那么在每一步中,它似乎都会将列表中的所有条目替换为所附加的条目。你可以看到问题的第一个代码位和输出,剩下的只是我展示的不起作用的部分。

extend((按预期工作,所以这可能只是向像我这样愚蠢的人解释为什么两者的功能如此不同的又一次机会。我对这两者的理解是基于这里给出的答案:

  • append将其参数作为单个元素添加到列表的末尾。列表本身的长度将增加一
  • extend对其参数进行迭代,将每个元素添加到列表中,从而扩展列表。但是,列表的长度将增加可迭代参数中有许多元素

这不会让我相信每个项目都会以某种方式被附加的项目所取代。但无论如何,这是具有意外输出的代码。

def rKN(x, fx, n, hs):
k1 = []
k2 = []
k3 = []
k4 = []
xk = []
for i in range(n):
k1.append(fx[i](x)*hs)
for i in range(n):
xk.append(x[i] + k1[i]*0.5)
for i in range(n):
k2.append(fx[i](xk)*hs)
for i in range(n):
xk[i] = x[i] + k2[i]*0.5
for i in range(n):
k3.append(fx[i](xk)*hs)
for i in range(n):
xk[i] = x[i] + k3[i]
for i in range(n):
k4.append(fx[i](xk)*hs)
for i in range(n):
x[i] = x[i] + (k1[i] + 2*(k2[i] + k3[i]) + k4[i])/6
return x
def fa1(x):
return 0.9*(1 - x[1]*x[1])*x[0] - x[1] + np.sin(x[2])
def fb1(x):
return x[0]
def fc1(x):
return 0.5
def VDP1():
f = [fa1, fb1, fc1]
x = [1, 1, 0]
X_v = []
hs = 0.05
for i in range(3):
x = rKN(x, f, 3, hs)
# x = [1,i,3]
print(x)
X_v.append(x)
print(X_v)
VDP1()

输出:

calc x value is [0.9472269022674134, 1.0487033185947015, 0.024999999999999998] 
calc x value is [0.8893603370715508, 1.0946376878598068, 0.049999999999999996] 
calc x value is [0.8271667883479003, 1.1375671528881417, 0.075] 
X_v array is 
[[0.8271667883479003, 1.1375671528881417, 0.075], [0.8271667883479003, 1.1375671528881417, 0.075], [0.8271667883479003, 1.1375671528881417, 0.075]]

正如您所看到的,X_v数组只是最后一项的三元组。

如果我们从append切换到.extend(x(,它确实扩展了列表,但当我们更喜欢列表列表时,它会将其作为平面列表返回。

使用.extend(x(输出

calc x value is [0.9472269022674134, 1.0487033185947015, 0.024999999999999998] 
calc x value is [0.8893603370715508, 1.0946376878598068, 0.049999999999999996] 
calc x value is [0.8271667883479003, 1.1375671528881417, 0.075] 
X_v array is 
[0.9472269022674134, 1.0487033185947015, 0.024999999999999998, 0.8893603370715508, 1.0946376878598068, 0.049999999999999996, 0.8271667883479003, 1.1375671528881417, 0.075]

如果我们尝试使用.extend([x](来获取列表列表,结果与使用append相同。如果我尝试X_v=X_v+[X],我同样会得到同样的奇数结果。

如果你想弄清楚,请运行下面的代码,尽管在追加之前重新定义了x,但我得到了追加的旧值。

def VDP1():
f = [fa1, fb1, fc1]
x = [1, 1, 0]
X_v = []
hs = 0.05
for i in range(3):
x = rKN(x, f, 3, hs)
# print(type(x))
# print(len(x))
x = [i-1,i,i+1]
# print(type(x))
# print(len(x))
print('calc x value is {} '.format(x))
X_v.append(x)
print('X_v array is n{}'.format(X_v))
VDP1()

输出:

calc x value is [-1, 0, 1] 
calc x value is [0, 1, 2] 
calc x value is [1, 2, 3] 
X_v array is 
[[-1.0013470352949683, -0.0500470769424533, 1.025], [-0.00479801080448152, 0.9998822513537077, 2.025], [1, 2, 3]]

如果我使用I作为索引位置添加到np.array,我可以得到我所期望的:

def VDP1():
f = [fa1, fb1, fc1]
x = [1, 1, 0]
n = 4
X_v = np.zeros([n,3])
hs = 0.05
for i in range(n):
x = rKN(x, f, 3, hs)
print('calc x value is {} '.format(x))
X_v[i] = x
print('X_v array is n{}'.format(X_v))
VDP1()

输出:

X_v array is 
[[0.9472269  1.04870332 0.025     ]
[0.88936034 1.09463769 0.05      ]
[0.82716679 1.13756715 0.075     ]
[0.7615015  1.17729645 0.1       ]]

很明显,有一些我不理解的附加/扩展或列表行为。

感谢您的帮助!

def rKN(x, fx, n, hs):
k1 = []
k2 = []
k3 = []
k4 = []
xk = []
result = []
for i in range(n):
k1.append(fx[i](x)*hs)
for i in range(n):
xk.append(x[i] + k1[i]*0.5)
for i in range(n):
k2.append(fx[i](xk)*hs)
for i in range(n):
xk[i] = x[i] + k2[i]*0.5
for i in range(n):
k3.append(fx[i](xk)*hs)
for i in range(n):
xk[i] = x[i] + k3[i]
for i in range(n):
k4.append(fx[i](xk)*hs)
for i in range(n):
#x[i] = x[i] + (k1[i] + 2*(k2[i] + k3[i]) + k4[i])/6# I changed  
result.append(x[i] + (k1[i] + 2*(k2[i] + k3[i]) + k4[i])/6)
return result #x[i]=value != result.append(value) at the memory
def fa1(x):
return 0.9*(1 - x[1]*x[1])*x[0] - x[1] + np.sin(x[2])
def fb1(x):
return x[0]
def fc1(x):
return 0.5
def VDP1():
f = [fa1, fb1, fc1]
x = [1, 1, 0]
X_v = []
hs = 0.05
for i in range(3):
x = rKN(x, f, 3, hs)
# x = [1,i,3]
print(x)
X_v.append(x)
print(X_v)
VDP1()
print:
[0.9472269022674134, 1.0487033185947015, 0.024999999999999998]
[0.8893603370715508, 1.0946376878598068, 0.049999999999999996]
[0.8271667883479003, 1.1375671528881417, 0.075]
[[0.9472269022674134, 1.0487033185947015, 0.024999999999999998], [0.8893603370715508, 1.0946376878598068, 0.049999999999999996], [0.8271667883479003, 1.1375671528881417, 0.075]]

最新更新