0

我想生成陈的超混沌序列。公式如下:Chen 的超混沌序列方程

附上我写的代码。

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。

4

2 回答 2

1

我认为你有几个问题。

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

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

您可以添加一个时间增量变量(例如t),以小增量更改、、 和的值x0,从而模拟它们各自的微分。y0z0q0

这是运行 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)
于 2021-04-18T22:03:26.853 回答
0

您的代码远未达到您的期望:您将不得不在某个时刻求解该微分方程,而在上述示例中您没有在任何地方这样做。这解释了为什么您的值会迅速发散到无穷大,然后开始变成 NaN。

使用 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])
于 2021-04-18T21:34:25.317 回答