已知常微分方程的李亚普诺夫谱 - Python 3 [关闭]

2024-02-21

我想用数值方法计算李亚普诺夫谱洛伦兹系统 https://en.wikipedia.org/wiki/Lorenz_system通过使用本文件中描述的标准方法论文,第 81 页 https://venturi.soe.ucsc.edu/sites/default/files/Numerical_Calculation_of_Lyapunov_Exponents.pdf.

基本上需要整合洛伦兹系统和切向矢量(我为此使用了龙格-库塔方法)。切向向量的演化方程由洛伦兹系统的雅可比矩阵给出。每次迭代之后,需要对向量应用 Gram-Schmidt 方案并存储其长度。然后由存储长度的平均值给出三个李雅普诺夫指数。

我在python中实现了上述解释的方案(使用版本3.7.4),但我没有得到正确的结果。

我认为错误在于 der 向量的 Rk4 方法,但我找不到任何错误...轨迹 x、y、z 的 RK4 方法工作正常(如图所示)并且实现了 Gram-Schmidt 方案也得到正确实施。

我希望有人可以查看我的简短代码,也许会发现我的错误


编辑:更新代码

from numpy import array, arange, zeros, dot, log
import matplotlib.pyplot as plt
from numpy.linalg import norm

# Evolution equation of tracjectories and tangential vectors
def f(r):
    x = r[0]
    y = r[1]
    z = r[2]

    fx = sigma * (y - x)
    fy = x * (rho - z) - y
    fz = x * y - beta * z

    return array([fx,fy,fz], float)

def jacobian(r):
    M = zeros([3,3])
    M[0,:] = [- sigma, sigma, 0]
    M[1,:] = [rho - r[2], -1, - r[0] ]
    M[2,:] = [r[1], r[0], -beta]

    return M

def g(d, r):
    dx = d[0]
    dy = d[1]
    dz = d[2]

    M = jacobian(r)

    dfx = dot(M, dx)
    dfy = dot(M, dy)
    dfz = dot(M, dz)

    return array([dfx, dfy, dfz], float)

# Initial conditions
d = array([[1,0,0], [0,1,0], [0,0,1]], float)
r = array([19.0, 20.0, 50.0], float)
sigma, rho, beta = 10, 45.92, 4.0 

T  = 10**5                         # time steps 
dt = 0.01                          # time increment
Teq = 10**4                        # Transient time

l1, l2, l3 = 0, 0, 0               # Lengths

xpoints, ypoints, zpoints  = [], [], []

# Transient
for t in range(Teq):
    # RK4 - Method 
    k1  = dt * f(r)                 
    k11 = dt * g(d, r)

    k2  = dt * f(r + 0.5 * k1)
    k22 = dt * g(d + 0.5 * k11, r + 0.5 * k1)

    k3  = dt * f(r + 0.5 * k2)
    k33 = dt * g(d + 0.5 * k22, r + 0.5 * k2)

    k4  = dt * f(r + k3)
    k44 = dt * g(d + k33, r + k3)

    r  += (k1  + 2 * k2  + 2 * k3  + k4)  / 6
    d  += (k11 + 2 * k22 + 2 * k33 + k44) / 6

    # Gram-Schmidt-Scheme
    orth_1 = d[0]                    
    d[0] = orth_1 / norm(orth_1)

    orth_2 = d[1] - dot(d[1], d[0]) * d[0]
    d[1] = orth_2 / norm(orth_2)

    orth_3 = d[2] - (dot(d[2], d[1]) * d[1]) - (dot(d[2], d[0]) * d[0]) 
    d[2] = orth_3 / norm(orth_3)

for t in range(T):
    k1  = dt * f(r)                 
    k11 = dt * g(d, r)

    k2  = dt * f(r + 0.5 * k1)
    k22 = dt * g(d + 0.5 * k11, r + 0.5 * k1)

    k3  = dt * f(r + 0.5 * k2)
    k33 = dt * g(d + 0.5 * k22, r + 0.5 * k2)

    k4  = dt * f(r + k3)
    k44 = dt * g(d + k33, r + k3)

    r  += (k1  + 2 * k2  + 2 * k3  + k4)  / 6
    d  += (k11 + 2 * k22 + 2 * k33 + k44) / 6

    orth_1 = d[0]                    # Gram-Schmidt-Scheme
    l1 += log(norm(orth_1))
    d[0] = orth_1 / norm(orth_1)

    orth_2 = d[1] - dot(d[1], d[0]) * d[0]
    l2 += log(norm(orth_2))
    d[1] = orth_2 / norm(orth_2)

    orth_3 = d[2] - (dot(d[2], d[1]) * d[1]) - (dot(d[2], d[0]) * d[0]) 
    l3 += log(norm(orth_3))
    d[2] = orth_3 / norm(orth_3)

# Correct Solution (2.16, 0.0, -32.4)

lya1 = l1 / (dt * T)
lya2 = l2 / (dt * T)  - lya1
lya3 = l3 / (dt * T) -  lya1 - lya2 

lya1, lya2, lya3

# my solution T = 10^5 : (1.3540301507934012, -0.0021967491623752448, -16.351653561383387) 

上面的代码是根据Lutz的建议更新的。 结果看起来好多了,但仍然不是 100% 准确。

  • 正确的解决方案(2.16、0.0、-32.4)

  • 我的解决方案(1.3540301507934012,-0.0021967491623752448,-16.351653561383387)

正确的解决方案来自狼的论文,第 289 页 https://chaos.utexas.edu/manuscripts/1085774778.pdf。在第 290-291 页,他描述了他的方法,该方法看起来与我在本文开头提到的论文(论文,第 81 页)中完全相同。

所以我的代码中一定还有另一个错误......


您需要将点和雅可比行列式系统求解为(正向)耦合系统。在原始来源中,一切都已完成,所有内容都更新为一个RK4要求组合系统。

因此,例如在第二阶段,您可以混合操作以形成组合的第二阶段

   k2 = dt * f(r + 0.5 * k1)   
   M = jacobian(r + 0.5 * k1)
   k22 = dt * g(d + 0.5 * k11, r + 0.5 * k1)

您还可以委托计算M在 - 的里面g函数,因为这是唯一需要它的地方,并且您增加了变量范围的局部性。

请注意,我更改了更新d from k1 to k11,这应该是数值结果误差的主要来源。


关于最新代码版本(2021 年 2 月 28 日)的附加说明:

正如评论中所说,代码看起来会按照算法的数学规定进行操作。有两种误读会阻止代码返回接近引用的结果:

  • 论文中的参数为sigma=16.
  • 该论文没有使用自然对数,而是使用二进制,即震级演化给出为2^(L_it)。所以你必须将计算出的指数除以log(2).

使用派生的方法https://scicomp.stackexchange.com/questions/36013/numeric-computation-of-lyapunov-exponent https://scicomp.stackexchange.com/questions/36013/numerical-computation-of-lyapunov-exponent我得到指数

[2.1531855610566595, -0.00847304754613621, -32.441308372177566]

与参考足够接近(2.16, 0.0, -32.4).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

已知常微分方程的李亚普诺夫谱 - Python 3 [关闭] 的相关文章

随机推荐

  • 用于记录在给定项目/文件/方法上花费的时间的 Eclipse 插件? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我经常发现自己在同一个月 一周内从事 2 个或更多项目 有时我被迫在白天在项目之间切换 正确记录每个项目
  • 连接/断开数据库的最佳实践是什么?

    我想知道如何在 MEAN 堆栈应用程序中连接到数据库 特别是 何时应创建与数据库的连接以及何时应销毁与数据库的连接 我应该在每个新的 HTTP 请求上创建和销毁连接 还是应该存储曾经创建的连接并尽可能长时间地将其用于任何后续请求 我使用 M
  • C++ freeRTOS任务,非静态成员函数的无效使用

    哪里有问题 void MyClass task void pvParameter while 1 this gt update void MyClass startTask xTaskCreate this gt task Task 204
  • 如何重新创建以前的活动?

    我有一个主要活动 我们称之为 A 和第二个活动 我们称之为 B 用于更改应用程序的语言 关键是 当我单击按钮更改语言时 我也会调用recreate B 改变它的语言 到这里为止就OK了 当我返回主活动 A 并且它尚未更新语言时 问题就出现了
  • Swift tableView insertRows 在顶部,同时保持正确的索引

    Problem 我需要顶部填充tableView 以保持现有单元格的内容加载 例如播放视频 ref child live mode queryOrderedByKey queryLimited toLast 200 observe chil
  • 为 WebdriverIO/Cucumber 框架生成 HTML 报告

    我在用WebdriverIO 黄瓜 https github com webdriverio wdio cucumber framework wdio cucumber framework 用于我的测试自动化 我想在 HTML 文件中获取测
  • 在 PhoneGap 平台上使用 OpenID

    我目前正在使用 PhoneGap 开发一个应用程序 我的应用程序使用 OpenID 来验证用户身份 成功验证用户身份后 它应该返回到我的应用程序 我已使用 location href 将页面重定向到本地地址 例如 iOS 应用程序的 fil
  • 为什么 XP 上的 IE8 无法使用 JQuery 正确读取 XML?

    在 data xml 中给出此 XML
  • 如何记录 Python 崩溃?

    我正在树莓派中运行 python 代码 该代码应该永远有效 然而 几个小时后它崩溃了 由于它在远程计算机上运行 因此我看不到它在崩溃期间给出的消息 如何将此消息存储在文件中以便我可以看到问题所在 这是在linux下自主执行的吗 或者我应该编
  • 从 nlohmann json 访问元素

    我的 JSON 文件类似于此 active false list1 A B C objList key1 value1 key2 0 1 现在使用 nlohmann json 我已经设法存储它 并且当我进行转储时jsonRootNode d
  • c# readonly DataGridView 与一个启用的单元格

    我有只读 datagridview 在某些特定情况下 我需要在双击行后启用一个单元格 使 readonly false 并将焦点放在当前行中的该特定单元格上 例如输入它 光标应该开始闪烁 I have private void dataGr
  • 检查文档状态 DocuSign

    如何检查文档是否已使用 DocuSign API 签名 是否存在可以让我了解文档状态的 API 服务 我尝试获取 已完成 文件夹中的所有对象 但响应不包含 documentId 并且我不知道每个对象是哪个文档 DocuSign 轨道接受者状
  • 有没有免费的库可以实现类似于MSMQ(Microsoft Message Queuing)的消息队列?

    我有兴趣使用一个免费库 该库具有类似于 MSMQ 的功能 可以在 win 表单应用程序中的 3 个应用程序域之间发送 接收消息 我只需要专用队列功能 没有公共队列或 AD 支持 请提供链接和一些优点 缺点 如果您认为需要更多积分来了解更详细
  • C语言中\n是多字符吗?

    我读到 n 由 CR 和 LF 组成 每个都有自己的 ASCII 代码 那么C中的 n是用单个字符表示还是多字符表示呢 Edit 请具体说明您的答案 而不是简单地说 是的 or 不 不是 在 C 程序中 它是一个字符 n 代表行尾 然而 某
  • JavaCV 录像机方向在纵向模式下不正确

    嗨 我正在使用https github com bytedeco javacv https github com bytedeco javacv 用于录制视频 使用横向模式时方向很好 但当我将方向更改为纵向模式时 视频旋转 90 度 任何人
  • 使用 NHibernate 时出错

    考虑到这个例子 https www hibernate org 362 html作为基本示例 我创建了该应用程序 但是当我执行该应用程序时出现以下错误 The ProxyFactoryFactory was not configured 使
  • 在 Bootstrap 4 中的模式中滚动下拉菜单

    我目前正在从 Bootstrap4 alpha 迁移到 Bootstrap4 stable 到目前为止 一切都很好 除了我的模态出现的这个问题 我在任何地方都使用下拉菜单 包括包含许多项目的下拉菜单 以前 滚动效果很好 现在它没有 当我滚动
  • 将 pandas 函数实现为 numpy 函数

    有没有办法可以转换xy mean使用 pandas 库计算的函数就像y mean功能 我发现 pandas 功能Y mean pd Series PC list rolling number mean dropna to numpy 比 n
  • 将字符串转换为 Uri

    如何在 Java Android 中将字符串转换为 Uri IE String myUrl http stackoverflow com myUri 您可以使用parse静态方法来自Uri import android net Uri Ur
  • 已知常微分方程的李亚普诺夫谱 - Python 3 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我想用数值方法计算李亚普诺夫谱洛伦兹系统 https en wikipedia org wiki Lorenz syst