Numpy:计算序列总和时的不同值

时间:2017-06-08 20:43:27

标签: python numpy physics numerical

我正在使用scipy.integrate的odeint函数来评估时间演变以找到方程式的解决方案

$$ \ dot x = - \ frac {f(x)} {g(x)},$$

其中$ f $和$ g $都是$ x $的函数。 $ f,g $由表格系列

提供

$$ f(x)= x(1 + \ sum_k b_k x ^ {k / 2})$$

$$ g(x)= 1 + \ sum_k a_k(1 + k / 2)x ^ {k / 2}。 $$

$ x $的所有正初始值都会导致解决方案及时爆发,但它们并非......好吧,并非总是如此。

系数$ a_n,b_n $是长多项式,其中$ b_n $以某种方式依赖于$ x $,$ a_n $依赖于几个保持不变的项。

根据我计算$ g(x)$的方式,我会得到非常不同的行为。

我尝试的第一种方法如下。 'a'和'b'是1x8和1x9 numpy数组。请注意,在函数g(x,a)中,a乘以第3行中的gterms,而不会出现在第2行中。

def g(x, a):
    gterms = [(0.5*k + 1.) * x**(0.5*k) for k in range( len(a) )]
    return = 1. + np.sum(a*gterms)

def rhs(u,t)
    x = u
    a, b = An(), Bn(x) #An() and Bn(x) are functions that return an array of coefficients
    return -f(x, b)/g(x, a)

t = np.linspace(.,.,.)
solution = odeint(rhs, <some initial value>, t)

第二种方式是:

def g(x, a):
    gterms = [(0.5*k + 1.) * a[k] * x**(0.5*k) for k in range( len(a) )]
    return = 1. + np.sum(gterms)

def rhs(u,t)
    x = u
    a, b = An(), Bn(x) #An() and Bn(x) are functions that return an array of coefficients
    return -f(x, b)/g(x, a)

t = np.linspace(.,.,.)
solution = odeint(rhs, <some initial value>, t)

注意区别:使用第一种方法,我将数组'a'粘贴到第3行的和中,而使用第二种方法,我将'a'的值吸入第2行的'gterms'列表中。

第一种方法给出了预期的行为:解决方案爆炸正x。但是,第二种方法不会这样做。第二种方法给出了一些x0>分支的分叉。 0作为来源。对于大于x0的初始条件,溶液按预期爆炸,但初始条件小于x0时,溶液趋于0非常缓慢。

其他注意事项:在rhs函数中,如果我从

更改它
def rhs(u,t)
    x = u
    ...
    return .

要     def rhs(u,t)         x = u [0]         ...         回来。

发生同样的确切变化

所以我的问题是:我使用的两种不同方法有什么区别?我无法告诉我这里的生活究竟是怎么回事。很抱歉这么冗长。

0 个答案:

没有答案