当前位置: 首页 > news >正文

数学建模算法-day[14]

6.2 传染病预测问题

问题提出
世界上存在很多传染病,如何根据其传播机理预测疾病得传染范围及染病人数等,对传染病的控制意义十分重大。

1.指数传播模型
基本假设

(1) 所研究的区域是一封闭区域,在一个时期内人口总量相对稳定,不考虑人口的迁移(迁入或迁出)。
(2) ttt时刻染病人数N(t)N(t)N(t)是随时间连续变化的、可微的函数。
(3) 每个病人在单位时间内的有效接触(足以使人致病)或传染的人数为λ\lambdaλλ>0\lambda>0λ>0为常数)。

模型建立与求解

N(t)N(t)N(t)ttt时刻染病人数,则t+Δtt+\Delta tt+Δt时刻的染病人数为N(t+Δt)N(t+\Delta t)N(t+Δt)。从t→t+Δtt\to t+\Delta ttt+Δt时间内,净增加的染病人数为N(t+Δt)−N(t)N(t+\Delta t)-N(t)N(t+Δt)N(t),根据基本假设(3),有
N(t+Δt)−N(t)=λN(t)Δt N(t+\Delta t)-N(t)=\lambda N(t)\Delta t N(t+Δt)N(t)=λN(t)Δt
若记t=0t=0t=0时刻染病人数为N0N_0N0,则由基本假设(2),在上式两端同时除以Δt\Delta tΔt,并令Δt→0\Delta t\to 0Δt0,得传染病染病人数的微分方程预测模型:
{dN(t)dt=λN(t),t>0,N(0)=N0.(6.13) \left\{\begin{aligned}& \frac{dN(t)}{dt}=\lambda N(t),t>0,\\& N(0)=N_0. \end{aligned}\right.\tag{6.13} dtdN(t)=λN(t),t>0,N(0)=N0.(6.13)
利用mathematica就可以求出该模型的解析解为
N(t)=N0eλt. N(t)=N_0e^{\lambda t}. N(t)=N0eλt.

DSolve[{n'[t] == \[Lambda]*n[t], n[0] == n0}, n[t], t]

结果分析与评价

模型结果显示传染病的传播是按指数函数。。。

这一节主播学过了,不想过多介绍,有空了再说

6.3 常微分方程的求解

这一节在韩中庚老师的书里是介绍了matlab的,不过本人matlab不是非常适合这种符号计算的,于是本人在这里同时也介绍mathematica的用法,例子还是书上的。

6.3.1 常微分方程的符号解

Matlab符号运算工具箱提供了功能强大的求常微分方程符号解函数dsolve,Methematica提供了功能强大的求常微分方程符号解函数DSolve

例 6.3 求解微分方程y′=−2y+2x2+2x,y(0)=1y'=-2y+2x^2+2x,y(0)=1y=2y+2x2+2x,y(0)=1

求得的符号解为y=e−2x+x2y=e^{-2x}+x^2y=e2x+x2

mathematica代码

DSolve[{y'[x] == -2*y[x] + 2*x^2 + 2*x, y[0] == 1}, y[x], x]

matlab代码

clc;clear
syms y(x)
y=dsolve(diff(y)==-2*y+2*x^2+2*x,y(0)==1)

例 6.4 求解二阶线性微分方程y′′−2y′+y=ex,y(0)=1,y′(0)=−1y''-2y'+y=e^x,y(0)=1,y'(0)=-1y′′2y+y=ex,y(0)=1,y(0)=1

求得二阶线性微分方程的解为y=ex+x2ex2−2xexy=e^x+\frac{x^2e^x}{2}-2xe^xy=ex+2x2ex2xex

mathematica代码

DSolve[{y''[x] - 2 y'[x] + y[x] == Exp[x], y[0] == 1, y'[0] == -1}, y[x], x]

matlab代码

clc;clear
syms y(x)
dy=diff(y);
y=dsolve(diff(y,2)-2*diff(y)+y==exp(x),y(0)==1,dy(0)==-1)

例 6.5 已知输入信号为u(t)=e−tcos⁡tu(t)=e^{-t}\cos tu(t)=etcost,试求下面微分方程的解。
y(4)(t)+10y(3)(t)+35y′′(t)+50y′(t)+24y(t)=u′′(t),y(0)=0, y′(0)=−1, y′′(0)=1, y′′′(0)=1 y^{(4)}(t) + 10 y^{(3)}(t) + 35 y''(t) + 50 y'(t) + 24 y(t) = u''(t), \quad y(0) = 0,\ y'(0) = -1,\ y''(0) = 1,\ y'''(0) = 1 y(4)(t)+10y(3)(t)+35y′′(t)+50y(t)+24y(t)=u′′(t),y(0)=0, y(0)=1, y′′(0)=1, y′′′(0)=1

mathematica代码

DSolve[{D[y[t], {t, 4}] + 10 y'''[t] + 35 y''[t] + 50 y'[t] + 24 y[t] == u''[t], y[0] == 0, y'[0] == -1, y''[0] == 1, y'''[0] == 1}, y[t], t]

matlab代码

clc;clear
syms y(t) u(t)
dy=diff(y,1);
dy2=diff(y,2);
dy3=diff(y,3);
u(t)=exp(-t)*cos(t);
y=dsolve(diff(y,4)+10*diff(y,3)+35*diff(y,2)+50*diff(y,1)+24*y==diff(u,2),y(0)==0,dy(0)==-1,dy2(0)==1,dy3(0)==1)

下面给出求常微分方程组符号解的例子。

例6.6 试求解下列柯西问题:
{dxdt=Ax,x(0)=[1,1,1]T \left\{\begin{aligned}& \frac{dx}{dt}=Ax,\\& x(0)=[1,1,1]^T \end{aligned}\right. dtdx=Ax,x(0)=[1,1,1]T
的解,其中x(t)=[x1(t),x2(t),x3(t)]T,A=[3−1120−11−12]x(t)=[x_1(t),x_2(t),x_3(t)]^T,\boldsymbol{A} = \begin{bmatrix} 3 & -1 & 1 \\ 2 & 0 & -1 \\ 1 & -1 & 2 \end{bmatrix}x(t)=[x1(t),x2(t),x3(t)]T,A=321101112

求得的解为
x(t)=[43e3t−12e2t+1623e3t−12e2t+5623e3t+13] \boldsymbol{x}(t) = \begin{bmatrix} \dfrac{4}{3} \mathrm{e}^{3t} - \dfrac{1}{2} \mathrm{e}^{2t} + \dfrac{1}{6} \\[1em] \dfrac{2}{3} \mathrm{e}^{3t} - \dfrac{1}{2} \mathrm{e}^{2t} + \dfrac{5}{6} \\[1em] \dfrac{2}{3} \mathrm{e}^{3t} + \dfrac{1}{3} \end{bmatrix} x(t)=34e3t21e2t+6132e3t21e2t+6532e3t+31

本人不会用mathematica求这类问题了,555.没学过

matlab代码

clc;clear
syms x(t) [3,1]  %定义符号向量,x(t)后有空格
A=[3 -1 1;2 0 -1;1 -1 2];
[s1,s2,s3]=dsolve(diff(x)==A*x,x(0)==ones(3,1))

例6.7 试解初值问题
[x1′(t)x2′(t)x3′(t)]=[10021−2321][x1(t)x2(t)x3(t)]+[00etcos⁡2t],[x1(0)x2(0)x3(0)]=[011] \begin{bmatrix} x_1'(t) \\ x_2'(t) \\ x_3'(t)\end{bmatrix}=\begin{bmatrix} 1 & 0 & 0 \\ 2 & 1 & -2 \\ 3 & 2 & 1 \end{bmatrix} \begin{bmatrix} x_1(t) \\ x_2(t) \\ x_3(t) \end{bmatrix} + \begin{bmatrix} 0 \\ 0 \\ \mathrm{e}^t \cos 2t \end{bmatrix}, \quad \begin{bmatrix} x_1(0) \\ x_2(0) \\ x_3(0) \end{bmatrix} =\begin{bmatrix} 0 \\ 1 \\ 1 \end{bmatrix} x1(t)x2(t)x3(t)=123012021x1(t)x2(t)x3(t)+00etcos2t,x1(0)x2(0)x3(0)=011
所得的解为

x(t)=[x1(t)x2(t)x3(t)]=[0et[cos⁡(2t)−sin⁡(2t)−tsin⁡(2t)2]et[cos⁡(2t)+5sin⁡(2t)4+tcos⁡(2t)2]] \boldsymbol{x}(t) = \begin{bmatrix} x_1(t) \\ x_2(t) \\ x_3(t) \end{bmatrix} =\begin{bmatrix} 0 \\ \displaystyle \mathrm{e}^t \left[ \cos(2t) - \sin(2t) - \frac{t \sin(2t)}{2} \right] \\ \displaystyle \mathrm{e}^t \left[ \cos(2t) + \frac{5 \sin(2t)}{4} + \frac{t \cos(2t)}{2} \right] \end{bmatrix} x(t)=x1(t)x2(t)x3(t)=0et[cos(2t)sin(2t)2tsin(2t)]et[cos(2t)+45sin(2t)+2tcos(2t)]

matlab代码

clc;clear
syms x(t) [3,1]
A=[1 0 0;2 1 -2;3 2 1];
[s1,s2,s3]=dsolve(diff(x)==A*x+[0,0,exp(t)*cos(2*t)]',x(0)==[0,1,1]')

例6.8 试求常微分方程组
{f′′+g=3g′+f′=1 \left\{\begin{aligned}& f''+g=3\\& g'+f'=1 \end{aligned}\right. {f′′+g=3g+f=1
在初边值条件f′(1)=0,f(0)=0,g(0)=0f'(1)=0,f(0)=0,g(0)=0f(1)=0,f(0)=0,g(0)=0时的解。

求得的解为
f(x)=x−e−3e2+1ex+e(3e+1)e2+1e−x−3,g(x)=e−3e2+1ex−3e2+ee2+1e−x+3. f(x) = x - \frac{\mathrm{e} - 3}{\mathrm{e}^2 + 1} \mathrm{e}^x + \frac{\mathrm{e}(3\mathrm{e} + 1)}{\mathrm{e}^2 + 1} \mathrm{e}^{-x} - 3,\\ g(x) = \frac{\mathrm{e} - 3}{\mathrm{e}^2 + 1} \mathrm{e}^x - \frac{3\mathrm{e}^2 + \mathrm{e}}{\mathrm{e}^2 + 1} \mathrm{e}^{-x} + 3. f(x)=xe2+1e3ex+e2+1e(3e+1)ex3,g(x)=e2+1e3exe2+13e2+eex+3.

matlab代码

clc;clear
syms f(x) g(x)
df=diff(f,1);
[f,g]=dsolve(diff(f,2)+g==3,diff(g)+diff(f)==1,df(1)==0,f(0)==0,g(0)==0)

mathematica代码

DSolve[{f''[x] + g[x] == 3, g'[x] + f'[x] == 1, f'[1] == 0, f[0] == 0,g[0] == 0}, {f[x], g[x]}, x]

6.3.2 初值问题的Matlab数值解

matlab的工具箱提供了几个解常微分方程数值解的函数,如ode45,ode23,ode113,其中:ode45采用四五阶龙格-库塔方法(以下简称RK方法),是解非刚性常微分方程的首选方法;ode23采用二三阶RK方法;ode113采用的是多步法,效率一般比ode45高。

在化学工程及自动控制等领域中,所涉及的常微分方程组初值问题常常是所谓的“刚性”问题。具体地说,对一阶线性常微分方程组
dydx=Ay+ϕ(x),(6.26) \frac{dy}{dx}=Ay+\phi(x),\tag{6.26} dxdy=Ay+ϕ(x),(6.26)
式中:y,ϕ∈Rm;Ay,\phi\in R^m;Ay,ϕRm;Ammm阶方阵。若矩阵AAA的特征值λi(i=1,2,⋯ ,m)\lambda_i(i=1,2,\cdots,m)λi(i=1,2,,m)满足关系
{Re⁡λi<0,i=1,2,⋯ ,m,max⁡1⩽i⩽m∣Re⁡λi∣≫min⁡1⩽i⩽m∣Re⁡λi∣ \begin{cases} \operatorname{Re}\lambda_i < 0, i = 1, 2, \cdots, m, \\ \max\limits_{1 \leqslant i \leqslant m} |\operatorname{Re}\lambda_i| \gg \min\limits_{1 \leqslant i \leqslant m} |\operatorname{Re}\lambda_i| \end{cases} {Reλi<0,i=1,2,,m,1immaxReλi1imminReλi
则称方程组(6.26)为刚性方程组或stiff方程组,称数
s=max⁡1⩽i⩽m∣Re⁡λi∣/min⁡1⩽i⩽m∣Re⁡λi∣ s=\max\limits_{1 \leqslant i \leqslant m} |\operatorname{Re}\lambda_i| / \min\limits_{1 \leqslant i \leqslant m} |\operatorname{Re}\lambda_i| s=1immaxReλi∣/1imminReλi
为刚性比。理论上的分析表明,求解刚性问题所用的数值方法最好是对步长hhh不做任何限制。

Matlab的工具箱提供连几个解刚性常微分方程的功能函数,如ode15s,ode23s,ode23t,ode23tb。

下节将简单介绍ode45求数值解的用法。今天就到这里吧。

参考文献
[1] 司守奎,孙玺青 数学建模算法与应用第3版[M]

http://www.dtcms.com/a/305242.html

相关文章:

  • Java中写文件的显示大小实时性
  • 深入理解 boost::lock_guard<boost::mutex>
  • mybatis-plus由mysql改成达梦数据库
  • 【Linux】重生之从零开始学习运维之Mysql事务
  • Python day28
  • 破解企业无公网 IP 难题:可行路径与实现方法?
  • Three.js 渲染优化处理
  • 【C++算法】74.优先级队列_最后一块石头的重量
  • 查找特定的值
  • zama test
  • BGP团体属性
  • Linux部署各类软件
  • 《剑指offer》-算法篇-位运算
  • 【深度学习新浪潮】什么是世界模型?
  • 洛谷 P9779 [HUSTFC 2023] 不定项选择题
  • 记一次导出pdf表单引发的问题
  • Linux救援模式之简介篇
  • 文件相关问题(AI回答)
  • 【从0开始学习Java | 第5篇】封装
  • 85、【OS】【Nuttx】【番外】gcc 关键字:位域(上)
  • 影翎Antigravity将发布全球首款全景无人机,8月开启公测招募
  • Leetcode 08 java
  • Linux | 文件权限
  • 面试刷题平台项目总结
  • ERROR c.a.c.n.c.NacosPropertySourceBuilder
  • 对讲机该怎么选?2025建议买的对讲机品牌
  • 并查集介绍及典型应用和编程题
  • 专线与专线之间的区别
  • Docker初学者需要了解的几个知识点(二):Docker、容器镜像
  • 2025年运维相关面试题