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
ansy
。这些变量取决于时间(离散时间)。我们有一个起始条件,希望随着时间的推移迭代它们。假设我们有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年,所以在这个答案发布两年后)。