如何生成chen';s超混沌序列。我曾尝试用python编写代码,但出现了一些问题。我得到了许多nan和infinity
我想生成陈的超混沌序列。公式如下所示: 我写的代码附在后面如何生成chen';s超混沌序列。我曾尝试用python编写代码,但出现了一些问题。我得到了许多nan和infinity,python,encryption,dna-sequence,chaos,Python,Encryption,Dna Sequence,Chaos,我想生成陈的超混沌序列。公式如下所示: 我写的代码附在后面 import math a = 36 b = 3 c = 28 d = 16 k = 0.2 def chen(x0, y0, z0, q0): xdot = a * (y0 - x0) ydot = (-x0 * z0) + (d * x0) + (c * y0) - q0 zdot = (x0 * y0) - (b * z0) qdot = x0 + k return xdot, ydo
import math
a = 36
b = 3
c = 28
d = 16
k = 0.2
def chen(x0, y0, z0, q0):
xdot = a * (y0 - x0)
ydot = (-x0 * z0) + (d * x0) + (c * y0) - q0
zdot = (x0 * y0) - (b * z0)
qdot = x0 + k
return xdot, ydot, zdot, qdot
def chaotic_seq(x0, y0, z0, q0, length):
for i in range(length):
xdot, ydot, zdot, qdot = chen(x0, y0, z0, q0)
if math.isnan(xdot) or math.isnan(ydot) or math.isnan(zdot) or math.isnan(qdot):
print(i)
x0 = xdot
y0 = ydot
z0 = zdot
q0 = qdot
if __name__ == '__main__':
x0 = 0.3
y0 = -0.4
z0 = 1.2
q0 = 1
length = 2048
chaotic_seq(x0=x0, y0=y0, z0=z0, q0=q0, length=length)
我面临的问题是,在'I=11'之后,所有的值(xdot、ydot、zdot、qdot)都是NaN。您的代码远远没有达到您的期望:您将不得不在某个点解微分方程,而在上面的示例中您没有这样做。这就解释了为什么你的价值观会很快偏离到无穷远,然后开始变成“南” 使用scipy求解微分方程,我们得到以下代码,该代码给出了令人满意的结果: 来自scipy.integrate import solve\u ivp的
将matplotlib.pyplot作为plt导入
a=36
b=3
c=12
d=7
k=0.2
陈德福(uy,y):
x0,y0,z0,q0=y
xdot=a*(y0-x0)
ydot=(-x0*z0)+(d*x0)+(c*y0)-q0
zdot=(x0*y0)-(b*z0)
qdot=x0+k
返回xdot、ydot、zdot、qdot
定义顺序(x0,y0,z0,q0,长度):
返回solve_ivp(chen[0,length],[x0,y0,z0,q0])
x0=0.3
y0=-0.4
z0=1.2
q0=1
长度=50
溶胶=混沌(x0=x0,y0=y0,z0=z0,q0=q0,长度=长度)。y
#图x,y
plt.plot(sol[0],sol[1])
我想你有几个问题
一个是Pythonfloat
返回nan
值,因此您的函数很快就会遇到溢出错误,因此您需要一种比Python内置数据类型提供的默认float
支持更高精度值的数据类型。因此,您可以查看使用numpy
库的float128
数据类型(如下所示),或者使用decimal
模块(未显示)进行调查
其次,点符号表示输入变量的变化率,即xdot
是dx/dt
的缩写。因此,您可以添加一个时间增量变量(例如,t
),以小增量更改x0
、y0
、z0
和q0
的值,并模拟差异
以下是脚本的修改版本,可运行2048次迭代:
#!/usr/bin/env python
import sys
import numpy as np
a = np.float128(36)
b = np.float128(3)
c = np.float128(28)
d = np.float128(16)
k = np.float128(0.2)
t = np.float128(0.001)
def chen(x0, y0, z0, q0):
xdot = a * (y0 - x0)
ydot = (-x0 * z0) + (d * x0) + (c * y0) - q0
zdot = (x0 * y0) - (b * z0)
qdot = q0 + k
return xdot, ydot, zdot, qdot
def chaotic_seq(x0, y0, z0, q0, length):
for i in range(length):
xdot, ydot, zdot, qdot = chen(x0, y0, z0, q0)
if np.isnan(xdot) or np.isnan(ydot) or np.isnan(zdot) or np.isnan(qdot):
raise OverflowError("Overflow in dot variable calculation")
x0 += t * xdot
y0 += t * ydot
z0 += t * zdot
q0 += t * qdot
sys.stdout.write('after: [{}] {}\t{}\t{}\t{}\n'.format(i, x0, y0, z0, q0))
if __name__ == '__main__':
x0 = np.float128(0.3)
y0 = np.float128(-0.4)
z0 = np.float128(1.2)
q0 = np.float128(1)
length = 2048
chaotic_seq(x0=x0, y0=y0, z0=z0, q0=q0, length=length)
工作起来很有魅力。谢谢你的帮助。:)np.float128在我的环境中不工作,所以我使用了gmpy2,工作得非常好。谢谢你,亚历克斯。