我正在尝试创建一个洛伦兹解决方案,其中一个参数被调制。
在创建一组简单的 Lorenz 方程时,使用 odeint 很简单:
Multiplier = 10. # Use multiplier to widen bandwidth
Sigma = Multiplier * 16.
Rho = Multiplier * 45.6
Beta = Multiplier * 4
##################################
#
# dx/dt = Sigma(y-x)
# dy/dt = Rho*x - y-20xz
# dz/dt = 5xy - Beta*z
#
##################################
def f(y, t, param):
Xi = y[0]
Yi = y[1]
Zi = y[2]
Sigma = param[0]
Rho = param[1]
beta = param[2]
f0 = Sigma*(Yi -Xi)
f1 = Rho*Xi - Yi - 20*Xi*Zi
f2 = 5*Xi*Yi - beta*Zi
return [f0, f1, f2]
# Initial Conditions
X0 = 1.0
Y0 = 1.0
Z0 = 1.0
y0 = [X0, Y0, Z0]
t = np.arange(0, 10, .001) #Create 10 seconds of data
dt = t[1] - t[0]
param = [Sigma, Rho, Beta]
# Solve the DEs
soln = odeint(f, y0, t, args = (param,))
X = soln[:, 0]
Y = soln[:, 1]
Z = soln[:, 2]
上面的代码完美地创建了一个简单的 Lorenz 系统。我现在想创建一个调制参数 Lorenz 系统来研究它在通信中的有效性。这可以通过调制参数 Beta 来完成。Beta(t) 可以采用两个值之一,4.0 或 4.4 来表示“0”或“1”。
为了调制 beta,我选择了随机的 1 和 0,并将它们分配给 beta 的两个值,4.0 和 4.4,每个“1”或“0”有 500 个样本。
Bit_Rate = 2.
Number_of_Bits = np.int(len(X)*dt*Bit_Rate)
Number_of_samples_per_bit = np.int(1/ dt / Bit_Rate)
Bauded_Beta = []
for i in range(0, Number_of_Bits):
Bit = np.random.randint(0,2)
if Bit == 0:
for j in range(Number_of_samples_per_bit):
Bauded_Beta.append(Multiplier * 4.4)
else:
for k in range(Number_of_samples_per_bit):
Bauded_Beta.append(Multiplier * 4.0)
然后,我将对 odeint 参数集的调用更改为:param = [Sigma, Rho, Bauded_Beta]
param = [Sigma, Rho, Bauded_Beta]
# Solve the DEs
soln = odeint(f, y0, t, args = (param,))
X = soln[:, 0]
Y = soln[:, 1]
Z = soln[:, 2]
当我运行它时,我收到以下错误消息,“检测到非法输入(内部错误)。以 full_output = 1 运行以获取定量信息。ValueError:使用序列设置数组元素。odepack.error:函数调用的结果是不是正确的浮点数组。ValueError:使用序列设置数组元素。odepack.error:函数调用的结果不是正确的浮点数组。”
我知道这个错误来自 beta 不再是恒定的。但是,如何将调制参数传递给 odeint?