常微分方程组解稳定性的分析

文章未完

相空间的绘制

我们随机选一个方程,随机选的,不是有数学手册吗,一般来说考题不可能出数学手册上的例子

import scipy.integrate as si 
import matplotlib.pyplot as plt
import numpy as np

## dx/dt = x**2-y**2+x+y
## dy/dt = x*y**2 - x**2*y

f  = lambda x,y:x**2-y**2+x+y
g  = lambda x,y:x*y**2 - x**2*y


dt = 0.01
time_start = 0
time_end   = 1
time = np.arange(time_start,time_end+dt,dt)

def system_Euler():
    global f
    global g
    global time
    
    x = np.zeros(time.size)
    y = np.zeros(time.size)
    x[0],y[0] = 1,2
    for i in range(1,len(time)):
        x[i] = x[i-1]+(f(x[i-1],y[i-1]))*dt
        y[i] = y[i-1]+(g(x[i-1],y[i-1]))*dt
        
    return x,y

def system_odeint(X,t=0):
    return np.array([X[0]**2-X[1]**2+X[0]+X[1],X[0]*X[1]**2-X[0]**2*X[1]])
system_init = np.array([1,2])

####################
x,y = system_Euler()

fig = plt.figure(figsize=(6,6),tight_layout=True)
fig.suptitle("Stability Analysis")

ax1 = plt.subplot(221)

ax1.plot(time,x, 'r-', label='$x(t)$')
ax1.plot(time,y, 'b-', label='$y(t)$')
ax1.set_title("Dynamics in time")
ax1.set_xlabel("time")
ax1.grid()
ax1.legend()

ax2 = plt.subplot(222)
ax2.plot(x,y,color="blue")
ax2.set_xlabel("x")
ax2.set_ylabel("y")  
ax2.set_title("Phase space")
ax2.grid()

#####################33
X,infodict = si.odeint(system_odeint,system_init,time,full_output=True)
x,y = X.T

ax3 = plt.subplot(223)

ax3.plot(time,x, 'r-', label='$x(t)$')
ax3.plot(time,y, 'b-', label='$y(t)$')
ax3.set_title("Dynamics in time")
ax3.set_xlabel("time")
ax3.grid()
ax3.legend()

ax4 = plt.subplot(224)
ax4.plot(x,y,color="blue")
ax4.set_xlabel("x")
ax4.set_ylabel("y")  
ax4.set_title("Phase space")
ax4.grid()


plt.savefig("0.jpg")
plt.pause(0.01)

一阶微分方程的稳定点

import scipy.integrate as si 
import matplotlib.pyplot as plt
import numpy as np
import sympy as sy
import copy 
## dx/dt = 2*x - x**2 - x*y
## dy/dt = x*y - y

f  = lambda X:X[0]*2 - X[0]**2 - X[0]*X[1]
g  = lambda X:-X[1] + X[0]*X[1]

dt = 0.01
time_start = 0
time_end   = 10
time = np.arange(time_start,time_end+dt,dt)
system_init = np.array([10,2])

def system_odeint(X,t=0):
    global f
    global g
    return np.array([f(X),g(X)])

fig = plt.figure(figsize=(12,6),tight_layout=True)
fig.suptitle("$x'=x(2-x-y);y'=y(-1+x)")

X,infodict = si.odeint(system_odeint,system_init,time,full_output=True)
x,y = X.T


def find_fixed_points():
    global f
    global g
    global X
    r = sy.symbols("r")
    c = sy.symbols("c")
    R = sy.Function("R")
    C = sy.Function("C")
    R = 2*r - r**2 -r*c
    C = -c + r*c
    REqual = sy.Eq(R,0)
    CEqual = sy.Eq(C,0)

    return sy.solve((REqual,CEqual),r,c)

ax1 = plt.subplot(121)
ax1.plot(time,x, 'r-', label='$x(t)$')
ax1.plot(time,y, 'b-', label='$y(t)$')
ax1.set_title("Dynamics in time")
ax1.set_xlabel("time")
ax1.grid()
ax1.legend()

ax2 = plt.subplot(122)
ax2.plot(x,y,color="blue")
ax2.set_xlabel("x")
ax2.set_ylabel("y")  
ax2.set_title("Phase space")
ax2.grid()
fixed_points = find_fixed_points()
for point in fixed_points:
    ax2.scatter(point[0],point[1],s=20,label="fixed points")
ax2.legend()

plt.savefig("0.jpg")
plt.pause(0.01)

微分方程稳定性的理论分析

  • 李雅普诺夫先生,一个很棒的人

一阶自洽微分方程平衡点稳定性的结论

设有微分方程,若等号右端不显含自变量t,则称之自治方程。

代数方程的实根称为方程的平衡点(奇点,奇解)

二阶自洽微分方程平衡点稳定性的结论

一个自洽的二阶微分方程可表示为两个一阶方程组成的方程组

代数方程组的实根是方程的平衡点

一阶自洽线性常系数方程组

对于,系数矩阵

显然,方程组有唯一平衡点,假定

特征方程:

特征根:

平衡点类型

稳定性

稳定结点

稳定

不稳定结点

不稳定

鞍点

不稳定

稳定退化结点

稳定

不稳定退化结点

不稳定

稳定焦点

稳定

不稳定焦点

不稳定

中心

不稳定

一个典型的非线性振动系统

显然他可以转换成一个近可积哈密顿系统

import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint as sio
from numpy.linalg import solve as sol
import random
random.seed(0)


dt = 0.001
time_start = 0
time_end = 2
time = np.arange(time_start,time_end+dt,dt)


def RK4(diff,time):
    global dt
    global init 
    X = np.zeros((time.size,len(init)))
    X[0] = init
    for i in range(time.size-1):
        s0 = diff(time[i],X[i])
        s1 = diff(time[i]+dt/2,X[i]+dt*s0/2.)
        s2 = diff(time[i]+dt/2,X[i]+dt*s1/2.)
        s3 = diff(time[i+1],X[i]+dt*s2)
        X[i+1] = X[i] + dt*(s0+2*(s1+s2)+s3)/6.
    return time,X

def diff(time,Xi):
    xi,yi = Xi
    epision = 0.1
    global omega
    diffxi = yi
    diffyi = xi**2 - xi + epision*np.cos(omega*time)
    return np.array([diffxi,diffyi])
    

omega = 0.4
createvar = locals()
for i in range(20):
    init = np.array([1+(i>0)*random.uniform(0,0.01),1+(i>0)*random.uniform(0,0.01)])
    createvar["t"+str(i)],createvar["X"+str(i)] = RK4(diff,time)

for i in range(20):  
    plt.plot(eval("X"+str(i))[:,0],eval("X"+str(i))[:,1])#,label="omega:"+str(round(omega,2)))

plt.legend()
    
plt.pause(0.01)

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【有限差分初学者必备】如何根据问题的特点将定解区域作网格剖分;如何把原微分方程离散化为差分方程组以及如何解此代数方程组。此外为了保证计算过程的可行和计算结果的正确,还需从理论上分析差分方程组的性态,包括解的唯一性、存在性和差分格式的相容性、收敛性和稳定性。对于一个微分方程建立的各种差分格式,为了有实用意义,一个基本要求是它们能够任意逼近微分方程,这就是相容性要求。另外,一个差分格式是否有用,最终要看差分方程的精确解能否任意逼近微分方程的解,这就是收敛性的概念。此外,还有一个重要的概念必须考虑,即差分格式的稳定性。因为差分格式的计算过程是逐层推进的,在计算第n+1层的近似值时要用到第n层的近似值 ,直到与初始值有关。前面各层若有舍入误差,必然影响到后面各层的值,如果误差的影响越来越大,以致差分格式的精确解的面貌完全被掩盖,这种格式是不稳定的,相反如果误差的传播是可以控制的,就认为格式是稳定的。只有在这种情形,差分格式在实际计算中的近似解才可能任意逼近差分方程的精确解。关于差分格式的构造一般有以下3种方法。最常用的方法是数值微分法,比如用差商代替微商等。另一方法叫积分插值法,因为在实际问题中得出的微分方程常常反映物理上的某种守恒原理,一般可以通过积分形式来表示。此外还可以用待定系数法构造一些精度较高的差分格式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

River Chandler

谢谢,我会更努力学习工作的!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值