Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何生成chen';s超混沌序列。我曾尝试用python编写代码,但出现了一些问题。我得到了许多nan和infinity_Python_Encryption_Dna Sequence_Chaos - Fatal编程技术网

如何生成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])

我想你有几个问题

一个是Python
float
返回
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,工作得非常好。谢谢你,亚历克斯。