Python 加速有限差分模型

Python 加速有限差分模型,python,numpy,numerical-methods,Python,Numpy,Numerical Methods,我有一个复杂的有限差分模型,它是用python编写的,使用与下面示例代码相同的一般结构。它有两个for循环,每次迭代一个,然后在每次迭代中,沿x数组的每个位置都有一个for循环。目前,代码需要两个长时间运行(可能是因为for循环)。有没有一种简单的方法可以使用numpy删除第二个for循环 下面是我使用的一般结构的一个简单示例 import numpy as np def f(x,dt, i): xn = (x[i-1]-x[i+1])/dt # a simple finite diff

我有一个复杂的有限差分模型,它是用python编写的,使用与下面示例代码相同的一般结构。它有两个for循环,每次迭代一个,然后在每次迭代中,沿x数组的每个位置都有一个for循环。目前,代码需要两个长时间运行(可能是因为for循环)。有没有一种简单的方法可以使用numpy删除第二个for循环

下面是我使用的一般结构的一个简单示例

import numpy as np

def f(x,dt, i):
   xn = (x[i-1]-x[i+1])/dt # a simple finite difference function
   return xn

x = np.linspace(1,10,10) #create initial conditions with x[0] and x[-1] boundaries
dt = 10 #time step
iterations = 100 # number of iterations

for j in range(iterations):
    for i in range(1,9): #length of x minus the boundaries
        x[i] = f(x, dt, i) #return new value for x[i]
有没有人对我如何提高效率有什么想法或意见

谢谢


Robin

对于初学者来说,这种结构上的微小变化可以提高大约15%的效率。如果此代码可以进一步优化,我不会感到惊讶,但这很可能是函数内部的算法,即简化数组元素操作的某种方法。使用发电机可能也会有所帮助

import numpy as np
import time

time0 = time.time()


def fd(x, dt, n):  # x is an array, n is the order of central diff
    for i in range(len(x)-(n+1)):
        x[i+1] = (x[i]-x[i+2])/dt # a simple finite difference function
    return x


x = np.linspace(1, 10, 10)  # create initial conditions with x[0] and x[-1] boundaries
dt = 10 # time step
iterations = 1000000 # number of iterations

for __ in range(iterations):
        x = fd(x, dt, 1)
print(x)

print('time elapsed: ', time.time() - time0)

不幸的是,for循环的内部
的主体有一些由函数
f
的结构引入的讨厌的依赖项。它是不可并行的。为什么你在你的内部循环一开始就把“i”归罪?当Python返回一个从1开始的范围时,这似乎完全没有必要。还有,当有其他更稳定的数值技术时,为什么要使用一阶中心差分法?您将如何构造函数以使其并行化?这是一个关于从1开始范围并移除i=i+1的很好的调用。如果你想通过差分商计算导数近似值,那么中心差分公式是
(x[1,:]-x[:-1])/(2*dt)
。对于一阶和最后一阶导数近似,您可能需要使用误差阶为2
(-3*x[0]+4*x[1]-x[2])/(2*dt)
(3*x[-1]-4*x[-2]+x[-3])/(2*dt的正向和反向微分公式。或者您想求解
x'(t)=x(t)
?然后,使用中心差商作为导数近似的差分公式是
x[i+1]=x[i-1]+2*dt*x[i]