python解决控制问题系例之一:解决微分方程-状态方程求解作图问题

python解决控制问题系例之一:解决微分方程-状态方程求解作图问题

1. 利用scipy.integrate功能包的solve_ivp求解方案

以求解lotka-Volterra 系统为例来演示如何使用slove_ivp。lotka-Volterra系统的动态模型可以描述为:
x ˙ = a x − b x y , y ˙ = − c y + d x y \dot{x} = ax - bxy, \\ \dot{y} = -cy + dxy x˙=axbxy,y˙=cy+dxy
在使用solve_ivp前,需要先建立系统模型函数lotkavolterra,函数的输入为自变量时间t、输入状态向量z=(x, y)以及系统的参数a,b,c,d。函数的返回值为一个列表,列表中每一项为一行微分方程的更新值。该部分具体的代码为:

# 引入必要的功能包
from scipy.integrate import solve_ivp
import numpy as np
import matplot.pyplot as plt

def lotkavolterra(t, z, a, b, c, d):
    x, y = z
    return [a * x - b * x * y, -c * y + d * x * y]

调用solve_ivp来生成微分方程的数值解,包含的参数包括:系统模型函数lotkavolterra, 时间t的范围,状态初值,以及参数a、b、c、d的具体值。具体代码为:

sol = solve_ivp(lotkavolterra, [0, 15], [10, 5], args=(1.5, 1, 3, 1), dense_output=True)
t = np.linspace(0, 15, 300)
z = sol.sol(t)

最后使用matplotlib功能包中的plot功能,画出系统状态关于时间t的轨迹。

plt.plot(t, z.T)
plt.legend(['x', 'y'], loc='best', shadow=True)
plt.xlabel('t')
plt.title('Lotka-Volterra System')
plt.show()

最终效果图:
在这里插入图片描述

2. 利用python-control功能包的input_output_response求解方案

此方案中需要用到control功能包。control功能包是包含了很多控制系统中常用的建模、分析和类matlab函数使用方法,对于求解微分方程构成的系统轨迹非常方便。

以功能包中的案例 predator-prey为例,讲解微分方程数值解求解方法。首先引入必要的功能包,包括numpy、control和matplotlib.pyplot, 代码为:

import control as ct
import numpy as np
import matplotlib.pyplot as plt

构建predator_prey的模型,其微分方程为:
H ˙ = ( r + u ) H 1 − H / K − a H L c + H , L ˙ = b a H L c + H − d L \dot{H} = \frac{(r + u)H}{1-H/K} - \frac{aHL}{c + H}, \\ \dot{L} = b\frac{aHL}{c + H} - dL H˙=1H/K(r+u)Hc+HaHL,L˙=bc+HaHL

  • 11
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值