Python课程作业:如何基于输出数据绘制Ce-t曲线图?
问题分析与修正方案
核心问题点
- 绘图变量错误:循环里用
plt.plot(t, Ce),但Ce是初始定义的0,不是每次求解得到的Ce_solution;而且单调用plt.plot画单个点默认无显示(既无线条也无标记)。 - 函数未动态更新:
func定义在循环外,后续循环中qm被更新为qe,但func内部的qm仍保持初始值,导致每次求解的Ce_solution结果错误。 - 未积累数据点:没有保存每次循环的
t和Ce值,无法形成完整的曲线数据。
修正后的代码
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import fsolve %matplotlib inline # 给定参数 F = 150 M = 70 Co = 350 init_guess = Co / 10 qm = 246 KL = 0.0026 q_prior = 0 # 用于存储数据的列表 t_list = [] ce_list = [] count = 1 while count < 21: t = 60 * 70 / 150 * count # 即28*count # 每次循环重新定义func,确保使用最新的qm值 func = lambda Ce: (Co - Ce) * F / (1000 * M) + q_prior - qm * KL * Ce / (1 + KL * Ce) # 求解Ce,提取数组中的标量值 Ce_solution = fsolve(func, init_guess)[0] # 计算qe qe = qm * KL * Ce_solution / (1 + KL * Ce_solution) # 保存当前数据点 t_list.append(t) ce_list.append(Ce_solution) # 打印当前数据 print(f'Ce {Ce_solution:.4f}, qe {qe:.4f}, t {t:.0f}') # 更新qm为当前qe,用于下一次循环 qm = qe count += 1 # 绘制完整曲线 plt.plot(t_list, ce_list, marker='o', linestyle='-', color='b') plt.xlabel('时间t') plt.ylabel('Ce') plt.xlim([0, 560]) plt.ylim([0, 350]) plt.title('Ce-t曲线图') plt.grid(True) plt.show()
修正说明
- 数据存储与绘图优化:用
t_list和ce_list积累每次循环的时间和Ce值,最后一次性绘制完整曲线;添加marker='o'让数据点可见,同时保留连线。 - 动态更新求解函数:将
func移到循环内部,每次循环都使用最新的qm值,保证求解逻辑符合迭代要求。 - 标量值提取:
fsolve返回数组,用[0]提取标量值,避免后续数据处理出现类型问题。 - 图表可读性优化:添加坐标轴标签、标题和网格,让图表更清晰。
内容的提问来源于stack exchange,提问作者Lihime
相关产品推荐
相关产品推荐

