将函数传递给 odeint,该函数应根据 odeint 解决方案中的每个时间步长减少

Passing a function to odeint that should decrease according to each time step in the solution of odeint

我希望我传递给 odeint 的参数之一是一个函数。

在我的例子中,这是哈勃常数 H,它应该随着 H ~ 1/t 而减小。

这次“t”与我的 odeint 用于求解耦合 ODE 的时间完全相同。 (我想求解膨胀宇宙中的运动方程,可以这么说,希望在 odeint 之外确定 H)

我如何告诉 odeint 我希望 H 随着 odeint 计算的每个时间步长递减?

我的代码中的相关行是(这里,H 是一个常数 (H=1),但我希望它是 H=1/t):

def func(X, t, parameters):
    theta, alpha, phi, beta = X      # unpack current values of X
    Lambda, fa, H = parameters  # unpack parameters
    derivs = [alpha, -2*beta/phi*alpha - 3*H*alpha , beta, -3*H*beta + alpha**2 *phi -Lambda**2 *phi**3 + fa**2 * phi] # list of derivatives
    return derivs
 
# Set initial (angle, angularvelo, radius, radialvelo) & bundle them to pass to odeint
theta0, alpha0, phi0, beta0 = np.pi, 30, 4, 100
X0 = [theta0, alpha0, phi0, beta0]
 
# Set time & stepsize. T should be time for 1 Period in the future.  
T = 5 tmax, dt = 1*T, T/10000
t = np.arange(0, tmax, dt)
# Set Parameters & bundle them to pass to odeint  
H = 1 
Lambda = 30
fa=1.5
parameters = [Lambda, fa, H]
# Call the ODE solver
(solution, restoffulloutput) = odeint(func, X0, t, args=(parameters,), full_output=True)

我认为最简洁的方法是为每个时间步长递减的值制作一个 class。

class MagicValue:
    def __init__(self, initial_value):
        self._value = initial_value

    @property
    def next_value(self):
        # modify self._value here
        return self._value

    @property
    def value(self):
        return self._value

现在修改您的函数以接受 MagicValue 并根据需要使用属性。

我找到了一个很好用的解决方案。

这就像在 odeint 函数中定义函数一样简单,因为 odeint 迭代的是“t”。

def func(X, t, parameters):
    theta, alpha, phi, beta = X      # unpack current values of X
    Lambda, fa, H = parameters  # unpack parameters
    H = 1/t # this line is doing the job
    derivs = [alpha, -2*beta/phi*alpha - 3*H*alpha , beta, -3*H*beta + alpha**2 *phi -Lambda**2 *phi**3 + fa**2 * phi] # list of derivatives
    return derivs