如何生成陈氏超混沌序列。我曾尝试用python编写代码,但出现了一些问题。我得到了许多nan和infinity

2024-05-19 09:00:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我想生成陈的超混沌序列。公式如下所示:Chen's hyperchaotic sequence equations

我写的代码附在后面

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


Tags: ordefmathlengthchenxdotq0z0
2条回答

我想你有几个问题

其中一个原因是,Python float返回nan值,因此您的函数似乎很快就会遇到溢出错误,因此您需要一种比Python内置数据类型提供的默认float支持更高精度值的数据类型。因此,您可以考虑使用numpy库的float128数据类型(如下所示),或者研究使用decimal模块(未显示)

其次,点符号表示输入变量中的变化率。例如,xdot是差分表达式dx/dt的简写符号

您可以添加一个时间增量变量(例如,t),该变量以小增量更改x0y0z0q0的值,模拟它们各自的差异

以下是脚本的修改版本,可运行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)

您的代码远远没有达到您的期望:您将不得不在某个点上求解该微分方程,而在上面的示例中,您没有这样做。这就解释了为什么你的价值观会很快偏离到无穷远,然后开始变成“南”

使用scipy求解微分方程,我们得到以下代码,该代码给出了令人满意的结果:

from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

a = 36
b = 3
c = 12
d = 7
k = 0.2

def chen(_, 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
    return xdot, ydot, zdot, qdot


def chaotic_seq(x0, y0, z0, q0, length):
    return solve_ivp(chen, [0, length], [x0, y0, z0, q0])

x0 = 0.3
y0 = -0.4
z0 = 1.2
q0 = 1
length = 50
sol = chaotic_seq(x0=x0, y0=y0, z0=z0, q0=q0, length=length).y
# plot x,y
plt.plot(sol[0], sol[1])

相关问题 更多 >

    热门问题