Python 用Numpy计算两个耦合方程

Python 用Numpy计算两个耦合方程,python,numpy,Python,Numpy,这一次,这不是一个真正重要的问题,但可能是一个有趣的问题 假设我们有两个变量xansy。这些变量取决于时间(离散时间)。我们有一个起始条件,希望随着时间的推移迭代它们。假设我们有x[0]=a和y[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):

这一次,这不是一个真正重要的问题,但可能是一个有趣的问题

假设我们有两个变量
x
ans
y
。这些变量取决于时间(离散时间)。我们有一个起始条件,希望随着时间的推移迭代它们。假设我们有
x[0]=a
y[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
的方法来解决它,而不需要迭代。
我试着想出一些移动或其他的东西。我只想对没有循环的数组进行计算,因为循环真的很无聊。我刚想到递归函数调用,但明天早上我必须尝试一下

正如上面的评论所说,这不能很好地矢量化。如果你想要一个有助于速度的快速修复,考虑<代码>内联< /COD>选项,从<代码> SimPy。下面的代码是一个脚本,它为您所需的离散系统提供了一个工作示例。对于大型数组,这应该比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
导入scipy.weave作为weave
将numpy作为np导入
def模拟_x_和_y(x,y,a,b):
x[0]=a;y[0]=b;
n_范围=len(x)
代码=”“
#包括
对于(int n=1;n
这种递归关系是无法在NumPy中以有效的矢量化形式编写的东西的典型情况。如果速度很重要,那就用另一种语言,比如Cython。也许
numexpr
也可以优化这一点,但不确定。我认为这是不可能的,但无论如何都想问一下。如果你的分数超过100,使用xrange会有所帮助,但我认为这正是你在numpy中无法做到的操作。你有很多打字错误。我为您编辑了一个(当您分配0个变量时),但您也使用了n而不是I。您已经编写了离散方程。如果这真的是你需要解决的问题,那么你就没有其他办法了。然而,如果您真正需要的是解决一个连续的ODE,那么scipy有几个专门用于此目的的例程
weave
已被弃用并计划删除;文档中提到了“大多数测试都是在Windows 2000上完成的”和“需求:Python:我使用2.1.1”。独立版本的GitHub页面建议新代码使用Cython。我认为对于这样一个小例子来说,简单地使用
ctypes
更有意义,而不是导致对Cython的依赖,并将其用于如此小的用例的构建过程。但感谢您指出weave的不受欢迎之处(从GitHub自述的日期来看,这似乎发生在2014年,所以在这个答案发布两年后)。