如何在没有元素被函数更新的循环中追加

时间:2017-08-29 08:36:30

标签: python arrays append pass-by-reference numerical-integration

我有一个功能:

def euler(a, b, R, r, time, h):        # Euler Method
    a0 = a
    b0 = b
    R0 = R
    r0 = r
    for i in range(3):
        a[0][i] = a[0][i] + h * fai_1(a0, b0, R0, r0, i)
        a[1][i] = a[1][i] + h * fai_2(a0, b0, R0, r0, i)
        a[2][i] = a[2][i] + h * fai_3(a0, b0, R0, r0, i)
        b[0][i] = b[0][i] + h * fbi_1(a0, b0, R0, r0, i)
        b[1][i] = b[1][i] + h * fbi_2(a0, b0, R0, r0, i)
        b[2][i] = b[2][i] + h * fbi_3(a0, b0, R0, r0, i)
        r[i] = r[i] + h * fr(a0, b0, R0, r0, i)
    for i in range(3):
        R[0][i] = R[0][i] + h * fR(a0, b0, R0, r0)[0][i]
        R[1][i] = R[1][i] + h * fR(a0, b0, R0, r0)[1][i]
        R[2][i] = R[2][i] + h * fR(a0, b0, R0, r0)[2][i]
    time = time + h
    return [a, b, R, r, time]

其中h是常数规定值,a,b,r和R是3×3矩阵(2D阵列),并且函数fai_1,fai_2,......也是规定的。

我想运行上述函数100步,其中元素在每一步都附加到一个空数组。我遇到的麻烦是这个函数更新了每一步的值并覆盖了我的数组中的元素,所以我以100个相同的元素结束。

例如,我从

开始
a = [[0.0, 0.0, 0.0], [1.0, -1.0, 0.0], [-0.5, 1.0, 1.0]]  
b = [[0.0, 0.0, 0.0], [1.0, 1.0, 0.5], [-1.0, 0.5, 1.0]]
R = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]   
r = [-1.0, 1.0, 0.0]        
time = 0.0

并尝试执行(以提取b中的第一个数组)

barr = []
for i in range(3):
    u = euler(a, b, R, r, time, h)
    barr.append( u[1][0] )

print( barr )

打印:

[0.27195, 0.3172665, 0.175097505], [0.27195, 0.3172665, 0.175097505],
[0.27195, 0.3172665, 0.175097505]

我想得到:

[0.1, 0.1, 0.05], [0.19, 0.205, 0.11], [0.27195, 0.3172665, 0.175097505]

我相信我知道这里发生了什么。该函数每次调用时都会更新值u [1] [0],而后者会重写barr中的值。但是,我不知道如何解决这个问题。我尝试了许多不同的方式来写这个,但它总是以同样的问题结束。

对我来说最令人沮丧的是,我之前编写的代码非常类似于此:

def euler(theta, x, y, h):
    theta0 = theta
    x0 = x
    y0 = y
    for i in range(5):
        theta[i] = theta[i] + h * ftheta[i](theta0,x0,y0)
        x[i] = x[i] + h * fx[i](theta0,x0,y0)
        y[i] = y[i] + h * fy[i](theta0,x0,y0)
    return [theta, x, y]

x = [-1.39, 6.05, 1.0 , 0, 0]                        
y = [-3.33, -1.82, -2.0, 2.0, 0]
theta = [-3.98, 0.0, 1.0, np.pi / 4, 0]

然后,执行

xarr = [] 

for i in range(p):            
    u1 = euler(theta, x, y, h)
    xarr.append( u1[1][3] )
    yarr1.append( u1[2][3] )
    thetaarr1.append( u1[0][3] )

print(xarr)

这可以按照我的意愿工作,并且不会在每次迭代时更新xarr中的所有值。我能看到的唯一区别是2D阵列的引入,而不是1D。

任何人都可以帮我看看这里发生了什么吗?

不幸的是,我正在处理的代码太长而无法完整包含,但如果有人希望我添加可能相关的部分,请告诉我。

0 个答案:

没有答案