【问题标题】:speed up finite difference model加速有限差分模型
【发布时间】:2018-05-19 00:16:45
【问题描述】:

我有一个复杂的有限差分模型,它是用 python 编写的,使用与以下示例代码相同的一般结构。它有两个 for 循环,一个用于每次迭代,然后在每次迭代中,一个循环用于沿 x 数组的每个位置。目前,代码需要很长时间才能运行(可能是由于 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]

有没有人对我如何提高效率有任何想法或想法?

谢谢,

罗宾

【问题讨论】:

  • 不幸的是,内部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]

标签: python numpy numerical-methods


【解决方案1】:

对于初学者来说,结构上的这个小改动将效率提高了大约 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)

【讨论】:

    猜你喜欢
    • 2015-08-24
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2013-09-30
    • 2016-01-11
    • 1970-01-01
    • 2016-07-24
    • 2017-11-29
    相关资源
    最近更新 更多