我正在使用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] ... 回来。
发生同样的确切变化
所以我的问题是:我使用的两种不同方法有什么区别?我无法告诉我这里的生活究竟是怎么回事。很抱歉这么冗长。