专栏
标签
#全国大学生数学建模竞赛 #MWORKS体验官 打卡第七天
主题活动
发布于 2025-08-25 09:40:28
查看 5过去308天

#全国大学生数学建模竞赛 #MWORKS体验官 打卡第七天

题目
image.png


思路
第一题:本题需要求解一个包含三个变量(y1, y2, y3)的常微分方程组,得到各变量随时间t的变化规律,并通过图形展示结果。根据问题给出的导数关系,构建了方程组函数odefun(t, y),然后设置了初始条件y0 = [0, 1, 1],接着设置了求解时间的范围[0, 10],然后使用solve_ivp函数求解,然后用np.linspace函数生成更多的点,方便画图,最后展示图像。
第二题:本题需要构建SIR传染病模型,模拟在封闭人群中,易感者(S)、感染者(I)、康复者(R)三类人群数量随时间的动态变化,分析疫情传播规律。根据题目条件,定义了模型参数,总人口N = 10000,感染率beta = 0.4,康复率gamma = 0.1,然后定义了微分方程组sir_model,然后定义了初始条件,然后设置了求解时间的范围是[0, 100],然后为了使画的图像更平整,绘制了更多的点,然后使用solve_ivp函数求解微分方程,solve_ivp选用的方法是RK45,此方法与题目要求的ode45类似,最后把图像展示出来。


结果
第一题
image.png

第二题
image.png


代码

# 第一题
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

# 定义微分方程组
def odefun(t, y):
    y1, y2, y3 = y
    # 返回每个变量的导数(dy1/dt, dy2/dt, dy3/dt)
    return [y2 * y3,
            -y1 * y3,
            0.51 * y1 * y2]

# 初始条件
y0 = [0, 1, 1]
# 求解时间区间,可调整
t_span = [0, 10]
# 求解微分方程
sol = solve_ivp(odefun, t_span, y0, dense_output=True)
# 生成更密集的时间点用于绘图
t = np.linspace(t_span[0], t_span[1], 1000)
y = sol.sol(t)

# 绘图
plt.figure(figsize=(8, 6))
plt.plot(t, y[0], label='y1(t)')
plt.plot(t, y[1], label='y2(t)')
plt.plot(t, y[2], label='y3(t)')
plt.xlabel('t')
plt.ylabel('y(t)')
plt.title('常微分方程组解的可视化图')
plt.legend()
plt.grid(True)
plt.show()



# 第二题
import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

# 定义模型参数
N = 10000  # 总人口
beta = 0.4  # 感染率
gamma = 0.1  # 康复率

# 定义 SIR 模型的微分方程组
def sir_model(t, y):
    S, I, R = y
    dSdt = -beta * S * I / N
    dIdt = beta * S * I / N - gamma * I
    dRdt = gamma * I
    return [dSdt, dIdt, dRdt]

# 初始条件
S0 = N - 10  # 初始易感者人数
I0 = 10  # 初始感染者人数
R0 = 0  # 初始康复者人数
y0 = [S0, I0, R0]

# 求解时间区间,可调整
t_span = [0, 100]
# 生成用于绘制曲线的时间点
t_eval = np.linspace(t_span[0], t_span[1], 1000)

# 调用 solve_ivp 求解
sol = solve_ivp(sir_model, t_span, y0, method='RK45', t_eval=t_eval)

# 绘制曲线
plt.figure(figsize=(10, 6))
plt.plot(sol.t, sol.y[0], label='S(t) 易感者')
plt.plot(sol.t, sol.y[1], label='I(t) 感染者')
plt.plot(sol.t, sol.y[2], label='R(t) 康复者')
plt.xlabel('时间 t (天)')
plt.ylabel('人数')
plt.title('SIR模型感染人数变化曲线')
plt.legend()
plt.grid(True)
plt.show()
所属专栏:其他
产品信息:Syslab Online
MWORKS体验官全国大学生数学建模竞赛

全部回答

暂无数据
暂无数据
用户
和原帖交流更多问题细节吧,去
我要发帖 我要发帖
资料中心 资料中心
查看更多>
热门帖子 热门帖子
主要贡献者 主要贡献者
过去7天