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

如何用Matplotlib拆分ODE求解结果,分别绘制P与C的曲线

解决Matplotlib拆分ODE求解数组绘图的报错问题

你的代码里有两个核心问题导致数组操作报错:一是缩进语法错误,二是把模型函数定义在while循环内,既不规范也容易引发变量作用域问题。下面是修正后的完整代码,实现分别绘制PACC(solution[:,0])和癌细胞(solution[:,1])的曲线:

# Altering Alpha in Tumor Cells vs PACCs
# What is alpha? α = Rate of conversion of cancer cells to PACCs
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
from google.colab import files

# 把模型函数移到循环外,通过参数传递α值,避免重复定义
def modelP(x, t, alpha):
    P, C = x
    λc = 0.0601 
    K = 2000 
    ν = 1 * (10**-6) 
    λp = 0.1 
    γ = 2

    # 微分方程计算
    dPdt = λp * P * (1 - (C + γ*P)/K) + alpha * C 
    dCdt = λc * C * (1 - (C + γ*P)/K) - alpha * C + ν * P 
    return dPdt, dCdt

value = -6
# 准备图例标签,方便区分不同α的曲线
pacc_labels = []
cancer_labels = []

while value <= 0:
    alpha = 1 * (10**value)
    # 初始条件
    C0 = 256 
    P0 = 0 
    Pinit = [P0, C0]
    
    # 时间点
    t = np.linspace(0, 730) 

    # 求解ODE,用args传递当前的α参数
    solution = odeint(modelP, Pinit, t, args=(alpha,)) 
    
    # 分别绘制PACC(第一列)和癌细胞(第二列)的曲线
    plt.plot(t, solution[:,0], linestyle='-')
    plt.plot(t, solution[:,1], linestyle='--')
    
    # 记录对应标签
    pacc_labels.append(f'PACC (α=1e{value})')
    cancer_labels.append(f'癌细胞 (α=1e{value})')
    
    value += 1 

# 设置图表样式
plt.xlabel('Time [days]')
plt.ylabel('细胞数量')
# 图例放在外侧避免遮挡曲线
plt.legend(pacc_labels + cancer_labels, bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()

plt.show()

修正细节说明:

  • 修复缩进错误:原代码中modelP函数内的注释和微分方程代码缩进层级混乱,导致Python解析报错,修正后保证函数内所有代码缩进一致。
  • 函数移出循环:把modelP移到while循环外,通过odeint的args参数传递当前循环的α值,避免每次循环重复定义函数,也减少了变量冲突风险。
  • 拆分数组绘图:明确使用solution[:,0](PACC数量)和solution[:,1](癌细胞数量)分别绘图,用实线/虚线区分两类细胞,添加图例区分不同α值的曲线。
  • 变量名优化:把求解结果从P改成solution,避免和模型内的P(PACC变量)重名,代码可读性更强。

之前的数组操作报错大概率是因为语法错误导致ODE求解失败,P没有生成预期的二维数组,修正后就能正常拆分绘图了。

内容的提问来源于stack exchange,提问作者Elaine Garrett

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:55:32