用Numpy计算两个耦合方程

时间:2012-04-02 21:51:36

标签: python numpy

这一次,这不是一个非常重要的问题,但也许是一个有趣的问题。

我们假设我们有两个变量xy。这些变量取决于时间(离散时间)。我们有一个起始条件,并希望随着时间的推移迭代它们。我们假设我们有x[0] = ay[0] = b。我们现在想要在很短的时间内计算所有给定点,并且我们知道这两个变量之间的以下关系:

x[n+1] = x[n] + y[n]
y[n+1] = y[n] + np.sin(x[n+1])

当然我们可以通过循环来实现:

x[0], y[0] = a, b

for n in range(100): # just an arbitrary iteration
    x[n+1] = x[n] + y[n]
    y[n+1] = y[n] + np.sin(x[n+1])

好。这是可能的,如果我没有犯错误=)。我想要的可能就是拥有一个更好,更numpy的方式来解决它而不需要迭代。 我试图提出一些改变或其他的东西。我只想在没有循环的情况下对数组进行计算,导致循环真的很无聊。我刚才有一个关于递归函数调用的想法,但我必须在明天早上尝试一下。

1 个答案:

答案 0 :(得分:2)

正如评论者所说,这不能很好地矢量化。如果您想要一个有助于提高速度的快速解决方案,请考虑inline中的scipy.weave选项。下面的代码是一个脚本,为您所需的离散系统提供了一个工作示例。这应该比大型数组的Python for循环要好得多。

import scipy.weave as weave
import numpy as np

def simulate_x_and_y(x,y,a,b):

    x[0] = a; y[0] = b;
    n_range = len(x)

    code = """
    #include <math.h>

    for(int n = 1; n < n_range; n++){
        x(n) = x(n-1) + y(n-1);
        y(n) = y(n-1) + sin(x(n)); 
    }
    """

    weave.inline(code, ['x','y','n_range'], 
                 type_converters = weave.converters.blitz,
                 compiler = "gcc", headers=["<math.h>"]
                )


if __name__ == "__main__":

    x = np.zeros(10);
    y = np.zeros(10);
    a = 4.0; b = 10.0;

    print "Before:"
    print x
    print y

    simulate_x_and_y(x,y,a,b)

    print "After:"
    print x
    print y