在odeint的解决方案中传递函数到odeint应该根据每个时间步减少

问题描述

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

在我的情况下,这是哈勃常数H,应随H〜1 / t减小。

这次,“ t”与我的odeint用于求解耦合ODE的时间完全相同。 (我想在一个扩展的宇宙中求解运动方程,并希望H在odeint之外确定)

我如何告诉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,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,H]
# Call the ODE solver
(solution,restoffulloutput) = odeint(func,X0,args=(parameters,),full_output=True)

解决方法

我认为最干净的方法是为每个时间步长递减的值创建一个类。

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”。

numberOfSwaps = bubSort(numList)
print(numList)
print(numberOfSwaps)