如何用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
相关产品推荐
相关产品推荐

