You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Scipy solve_ivp建模种群增长ODE并绘制正确曲线?

种群增长ODE建模问题(y'=ky)解决方案

核心问题:离散vs连续模型的差异

你描述的t=1时种群为1,t=2时为2,t=3时为4属于离散几何增长,每单位时间数量翻倍,公式是 y(t) = y₀ × 2^(t-t₀),是离散的几何级数模型。
而你要建模的ODE y'=ky 是连续增长模型,种群数量随时间持续变化,解析解为 y(t) = y₀ × e^(kt)。当k=1时,t=1时y≈2.718,t=2时≈7.389,和你预期的离散结果完全不同——这就是你之前结果不符合预期的关键。

用solve_ivp正确实现连续ODE模型

以下是完整的代码示例,包含求解、绘图,同时对比离散增长的结果:

import numpy as np
from scipy.integrate import solve_ivp
import matplotlib.pyplot as plt

# 定义微分方程:y' = k*y,k=1
def dydt(t, y):
    k = 1
    return k * y

# 初始条件:这里设t=0时y₀=1,若要t=1时y=1,需设y₀=1/np.e≈0.3679
y_initial = [1]
# 时间范围:从0到3
t_range = [0, 3]
# 生成密集时间点用于绘图
t_points = np.linspace(t_range[0], t_range[1], 100)

# 求解ODE
solution = solve_ivp(dydt, t_range, y_initial, t_eval=t_points)

# 绘图展示
plt.figure(figsize=(8, 5))
plt.plot(solution.t, solution.y[0], label='连续ODE解 (y=e^t)', color='blue')
# 绘制你预期的离散增长点
t_discrete = [1, 2, 3]
y_discrete = [1, 2, 4]
plt.scatter(t_discrete, y_discrete, color='red', label='离散几何增长', zorder=5)
plt.xlabel('时间t')
plt.ylabel('种群数量y')
plt.legend()
plt.grid(True)
plt.show()

调整ODE以匹配离散增长(可选)

如果你想用连续ODE近似离散的“每单位时间翻倍”,可以调整增长率k:
离散翻倍的条件是 2 = e^(k×1),解得 k = ln2 ≈ 0.6931。此时ODE的解为 y(t) = y₀ × 2^t,完美匹配你描述的离散点。只需把代码中的k=1改成k=np.log(2)即可。

关于odeint的错误排查

你之前用odeint结果不对,大概率是以下原因:

  • 初始条件设置错误:比如想让t=1时y=1,但直接设初始值为1,忽略了ODE是从t=0开始积分的,需要计算对应t=0的初始值y₀=1/e。
  • 混淆了离散与连续模型的差异,用连续ODE去拟合离散点,自然无法匹配。

内容的提问来源于stack exchange,提问作者harmonius cool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 16:33:35