MATL计算四维有界噪声下的Van der Pol振子Lyapunov指数谱
由于MATL是一种基于栈的语言,我们需要将四维有界噪声下的Van der Pol振子微分方程转化为逆波兰表示。该微分方程为:
dx/dt = y dy/dt = mu(1-x^2)y - x + epsilon*randn() 其中epsilon为噪声强度,randn()为MATL中生成高斯随机数的函数。
将该微分方程转化为逆波兰表示,得到如下MATL代码:
5&Ys % 将时间步长设为0.05 0 0.1 40 0.3 % 初始化x, y, mu, epsilon和t 5e3 % 设定计算步数为5000 5\ % 将计算步数压入栈 ` % 开始循环 t % 将当前时间t压入栈 0.1 % 将时间步长0.1压入栈
- % 将t+0.1压入栈 dup % 将t+0.1复制一份 40 % 将mu压入栈 0.3 % 将epsilon压入栈 0 % 将噪声项初始化为0 5 % 将计算步数设为5,用于生成5个高斯随机数 ` % 开始循环 0 % 将0压入栈 0.1 % 将标准差0.1压入栈 g % 生成一个高斯随机数 + % 将生成的高斯随机数加到噪声项上 5\ % 结束循环,将生成的噪声项压入栈 dup % 将t+0.1复制一份 dup % 复制一份t+0.1,用于计算dy/dt dup % 再复制一份t+0.1,用于计算dx/dt 2$ % 将y和x复制到栈顶
- % 计算mu(1-x^2)y 1$ % 将x复制到栈顶
- % 计算mu(1-x^2)y - x 6 % 将噪声项压入栈
- % 加上噪声项 1$ % 将y复制到栈顶 / % 计算dy/dt 3$ % 将x复制到栈顶 / % 计算dx/dt 0.1 % 将时间步长压入栈
- % 将dx/dt和dy/dt乘上时间步长 dup % 再复制一份dx和dy,用于计算lyapunov指数 4$ % 将当前的lyapunov指数谱压入栈 2$ % 将y压入栈 1$ % 将x压入栈 3$ % 将dy/dt压入栈 0$ % 将dx/dt压入栈 5 % 将lyapunov指数计算步数设为5 ` % 开始循环 4$ % 将lyapunov指数谱复制到栈顶 4$ % 再复制一份,用于计算雅可比矩阵 3$ % 将dy/dt复制到栈顶 1$ % 将x复制到栈顶 + % 计算dx/dt + dy/dt * % 计算(dx/dt + dy/dt) * lyapunov指数 + % 加上当前的lyapunov指数谱 5\ % 结束循环,将计算得到的新的lyapunov指数谱压入栈 4$ % 将新的lyapunov指数谱复制到栈顶 2$ % 将y复制到栈顶,用于计算下一步
- % 计算y + dy/dt*dt 1$ % 将x复制到栈顶,用于计算下一步
- % 计算x + dx/dt*dt 5\ % 弹出计算步数 1- % 计算剩余的计算步数 ` % 结束循环,该部分代码的输出为lyapunov指数谱
将上述代码保存在一个m文件中,然后运行该文件即可计算出四维有界噪声下的van del pol振子微分方程的解以及其lyapunov指数谱。
原文地址: https://www.cveoy.top/t/topic/nzZV 著作权归作者所有。请勿转载和采集!