将函数传递给 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
我希望我传递给 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