非线性系统:相平面法

news/2024/10/11 13:24:27/

非线性系统:相平面法

非线性系统的相平面法是一种重要的分析工具,用于研究系统的动力学行为。通过相平面法,可以直观地观察系统状态变量的变化,分析系统的稳定性、周期性和其他动力学特性。本文将详细介绍相平面法的基本思想、步骤、相轨迹的绘制方法,探讨线性系统与非线性系统的相平面分析,并提供一个非线性系统的程序示例,最后讨论相平面法的优缺点。

基本思想

相平面法通过将系统的状态变量表示在一个二维平面上,并绘制出这些变量随时间变化的轨迹,以揭示系统的动力学特性。相平面法可以帮助我们理解系统的稳定性、周期性行为、极限环等特性。

相平面法步骤

相平面法的基本步骤如下:

  1. 建立系统的微分方程
    对于一个二阶非线性系统,其微分方程可以表示为:
    x ¨ = f ( x , x ˙ ) \ddot{x} = f(x, \dot{x}) x¨=f(x,x˙)

  2. 转换为一阶微分方程组
    将二阶微分方程转换为两个一阶微分方程:
    { x ˙ = y y ˙ = f ( x , y ) \begin{cases} \dot{x} = y \\ \dot{y} = f(x, y) \end{cases} {x˙=yy˙=f(x,y)

  3. 数值求解微分方程
    使用数值方法(如 Runge-Kutta 法)求解微分方程组,得到状态变量随时间的演化。

  4. 绘制相平面和相轨迹
    在相平面上绘制状态变量之间的关系,形成相轨迹。

相轨迹绘制方法

Python 实现相平面和相轨迹绘制

以下是一个简单的 Python 示例,展示了如何绘制 Van der Pol 振荡器的相平面和相轨迹。

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivpdef van_der_pol(t, z, mu):x, y = zdxdt = ydydt = mu * (1 - x**2) * y - xreturn [dxdt, dydt]# 参数
mu = 1.0
t_span = (0, 100)
y0 = [1, 0]# 求解微分方程
sol = solve_ivp(van_der_pol, t_span, y0, args=(mu,), dense_output=True)# 绘制相平面和相轨迹
t = np.linspace(0, 100, 4000)
z = sol.sol(t)
x, y = zplt.plot(x, y, label='Van der Pol oscillator')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Phase Plane of Van der Pol Oscillator')
plt.legend()
plt.grid(True)
plt.show()

在上述代码中,我们定义了 Van der Pol 振荡器的微分方程,并使用 solve_ivp 函数求解该方程。然后,我们在相平面上绘制出系统的相轨迹。

线性系统的相平面分析

线性系统的相平面分析是一种经典方法,用于研究线性微分方程的动力学行为。通过分析系统的特征值,可以判断系统的稳定性。

对于一个二阶线性系统,其状态方程可以表示为:
x ˙ = A x \dot{\mathbf{x}} = A\mathbf{x} x˙=Ax
其中, x = [ x 1 , x 2 ] T \mathbf{x} = [x_1, x_2]^T x=[x1,x2]T 是状态向量, A A A 是系统矩阵。

系统矩阵 A A A 的特征值决定了系统在相平面上的行为:

  • 如果特征值均为负实数,系统趋于稳定的平衡点。
  • 如果特征值有正实数,系统是不稳定的。
  • 如果特征值为复数且实部为负,系统表现出稳定的螺旋轨迹。
  • 如果特征值为复数且实部为正,系统表现出不稳定的螺旋轨迹。

线性系统的相平面绘制示例

import numpy as np
import matplotlib.pyplot as plt# 定义线性系统
A = np.array([[0, 1], [-2, -3]])# 求解特征值和特征向量
eigvals, eigvecs = np.linalg.eig(A)# 绘制特征向量
origin = np.array([[0, 0], [0, 0]])
fig, ax = plt.subplots()
ax.quiver(*origin, eigvecs[0,:], eigvecs[1,:], color=['r','b'], scale=5)# 设置坐标轴
ax.axhline(0, color='black',linewidth=0.5)
ax.axvline(0, color='black',linewidth=0.5)
ax.grid(color = 'gray', linestyle = '--', linewidth = 0.5)plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.title('Phase Plane of Linear System')
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()

非线性系统的相平面分析

非线性系统的相平面分析比线性系统复杂得多,因为非线性系统的动力学行为更加多样化。通过相平面法,可以直观地观察非线性系统的复杂行为,如极限环、混沌等。

示例:Van der Pol 振荡器

Van der Pol 振荡器是一个经典的非线性系统,其动力学方程为:
{ x ˙ = y y ˙ = μ ( 1 − x 2 ) y − x \begin{cases} \dot{x} = y \\ \dot{y} = \mu (1 - x^2) y - x \end{cases} {x˙=yy˙=μ(1x2)yx

通过数值求解和绘制相轨迹,可以观察其在相平面上的动力学行为。

Python 实现

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivpdef van_der_pol(t, z, mu):x, y = zdxdt = ydydt = mu * (1 - x**2) * y - xreturn [dxdt, dydt]# 参数
mu = 1.0
t_span = (0, 100)
y0 = [1, 0]# 求解微分方程
sol = solve_ivp(van_der_pol, t_span, y0, args=(mu,), dense_output=True)# 绘制相平面和相轨迹
t = np.linspace(0, 100, 4000)
z = sol.sol(t)
x, y = zplt.plot(x, y, label='Van der Pol oscillator')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Phase Plane of Van der Pol Oscillator')
plt.legend()
plt.grid(True)
plt.show()

在这里插入图片描述

优缺点

优点

  1. 直观性:相平面法通过可视化的方式展示系统的状态变化,直观地揭示系统的动力学特性。
  2. 分析稳定性:通过分析相轨迹,可以判断系统的平衡点和稳定性。
  3. 揭示周期性行为:相平面法能够识别系统的周期性行为和极限环。

缺点

  1. 限于二维系统:相平面法只适用于二维系统,对于高维系统无法直接应用。
  2. 无法精确解析求解:相平面法主要是基于图形观察和分析,无法提供精确的定量信息。
  3. 可视化有限:对于复杂的相轨迹和相平面,仅凭人眼可能无法完全捕捉到细微的变化和行为特征。
  4. 对数值求解的依赖:相平面法通常依赖于数值计算和数值模拟,这涉及到选择适当的数值方法,并对数值误差和数值稳定性有充分的认识。

结论

相平面法是分析非线性系统的重要工具,通过绘制相轨迹,可以直观地观察和理解系统的动力学行为。虽然相平面法有其局限性,但它在揭示系统的稳定性、周期性和极限环等特性方面具有重要作用。希望本文能够帮助您更好地理解相平面法在非线性系统中的应用。如果您有任何问题或建议,欢迎在评论区留言讨论。
推荐两个可以直接绘制相轨迹的网站:
http://mathlets.org/mathlets/linear-phase-portraits-matrix-entry/
http://www.bluffton.edu/homepages/facstaff/nesterd/java/slopefields.html


http://www.ppmy.cn/news/1465823.html

相关文章

查看和修改自己的git提交时的作者信息

首先查看自己本地配置的信息:git config --list 修改姓名和邮箱: 配置用户名 git config --global user.name "真实姓名" 配置邮箱 git config --global user.email "公司分配的企业邮箱" 示例 git config --global user.name "张三" git…

Yocto - bitbake任务中clean和cleanall的区别

在 BitBake 中,clean 和 cleanall 命令都用于删除构建工件,但它们的范围和执行的清理程度不同。 1. clean 命令: 目的:clean命令用于删除与特定任务或配方相关的临时构建文件和工件。 范围:它只清除指定任务或配方生…

探索AI去衣技术中的反射应用

在当今数字时代,人工智能(AI)技术的飞速发展已经渗透到了我们生活的方方面面。其中,图像处理和计算机视觉作为AI的重要分支,正不断推动着创新应用的边界。今天,我们要探讨的是一个颇具争议但又技术上颇为有…

使用 Navicat 工具查看 SQLite 数据库中的 PNG 图片

Navicat 是一款功能强大的数据库管理工具,支持多种数据库类型,包括 SQLite。它提供了一个直观的用户界面,可以轻松查看、编辑和管理数据库数据。 SQLite 是一种轻量级的嵌入式数据库,常用于移动应用程序和小型项目。它支持存储各…

算法每日一题(python,2024.05.31)

题目来源(力扣. - 力扣(LeetCode),简单) 解题思路: 二次遍历,第一次遍历用哈希表记录每个字母的出现次数,出现一次则将它的value值赋为True,将它的下标赋为key值&#x…

[原创]C++ 11的thread_local线程局部变量与Lambda表达式配合使用, 却引发致命的, 难以发现的冲突.

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

5 分钟快速上手图形验证码,防止接口被恶意刷量!

5 分钟快速上手图形验证码,防止接口被恶意刷量! 大家好,我是程序员小白条,今天来给大家介绍一个快速实现图形验证码的优秀框架 AJ-Captcha。 需求分析 如果注册接口没有验证码这种类型的限制,很容易会被刷量&#x…

Hadoop+Spark大数据技术 第七次作业

第七次作业 1. 简述Spark SQL使用的数据抽象DataFrame与Dataset的区别。 DataFrame: 基于 Row 对象的二维表格结构,类似于关系型数据库中的表。 行和列都有明确的 Schema(模式),可以进行类型推断。 提供了丰富的操作接口&#xff…