238 lines
6.4 KiB
Markdown
238 lines
6.4 KiB
Markdown
# MCM 2026 Problem A - O-Prize Grade Figure Generation
|
||
|
||
完整的15张图生成系统,用于MCM 2026问题A的高质量论文配图。
|
||
|
||
## 文件结构
|
||
|
||
```
|
||
ZJ_v2/
|
||
├── config.yaml # 配置文件(参数、场景定义)
|
||
├── plot_style.py # 统一绘图样式
|
||
├── validation.py # 质量验证工具
|
||
├── requirements.txt # Python依赖
|
||
├── run_all_figures.py # 主执行脚本
|
||
├── fig01_macro_logic.py # 图1: 总体流程图
|
||
├── fig02_system_interaction.py # 图2: 系统交互图
|
||
├── fig03_ocv_fitting.py # 图3: OCV拟合验证
|
||
├── fig04_internal_resistance.py # 图4: 内阻3D曲面
|
||
├── fig05_radio_tail.py # 图5: 网络尾流效应
|
||
├── fig06_cpl_avalanche.py # 图6: CPL反馈环路
|
||
├── fig07_baseline_validation.py # 图7: 基准动力学验证
|
||
├── fig08_power_breakdown.py # 图8: 功率分解图
|
||
├── fig09_scenario_comparison.py # 图9: 场景对比(含GPS影响)
|
||
├── fig10_tornado_sensitivity.py # 图10: 龙卷风灵敏度图
|
||
├── fig11_heatmap_temp_signal.py # 图11: 温度-信号热力图
|
||
├── fig12_monte_carlo.py # 图12: 蒙特卡洛路径
|
||
├── fig13_survival_curve.py # 图13: 生存曲线
|
||
├── fig14_lifecycle_degradation.py # 图14: 老化轨迹
|
||
├── fig15_radar_user_guide.py # 图15: 雷达建议图
|
||
├── figures/ # 输出目录(自动创建)
|
||
│ ├── Fig01_*.pdf/png
|
||
│ ├── Fig02_*.pdf/png
|
||
│ └── ...
|
||
└── artifacts/ # 验证报告
|
||
└── figure_build_report.json
|
||
```
|
||
|
||
## 图表清单
|
||
|
||
### 第一部分:模型架构(4张)
|
||
1. **Fig01** - 宏观逻辑流程图(3阶段)
|
||
2. **Fig02** - 系统边界与变量交互
|
||
3. **Fig05** - 网络尾流效应示意
|
||
4. **Fig06** - CPL反馈环路机制
|
||
|
||
### 第二部分:物理建模(2张)
|
||
5. **Fig03** - OCV曲线拟合(R²≥0.99)
|
||
6. **Fig04** - 内阻R₀(T,z)三维曲面
|
||
|
||
### 第三部分:基准结果(2张)
|
||
7. **Fig07** - 基准放电4联图(SOC/V/I/T)
|
||
8. **Fig08** - 功率成分堆叠面积图
|
||
|
||
### 第四部分:场景分析(3张)
|
||
9. **Fig09** - 多场景对比(标注GPS影响)
|
||
10. **Fig10** - 龙卷风灵敏度排名
|
||
11. **Fig11** - 双参数热力图(温度×信号)
|
||
|
||
### 第五部分:不确定性(2张)
|
||
12. **Fig12** - 蒙特卡洛意大利面图(N=100)
|
||
13. **Fig13** - 生存/可靠性曲线
|
||
|
||
### 第六部分:长期影响(2张)
|
||
14. **Fig14** - 全生命周期老化(SOH&TTE)
|
||
15. **Fig15** - 用户建议雷达图
|
||
|
||
## 快速开始
|
||
|
||
### 1. 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
**注意**: Graphviz需要单独安装系统级可执行文件:
|
||
- Windows: https://graphviz.org/download/
|
||
- 安装后将 `bin/` 目录添加到系统PATH
|
||
|
||
### 2. 生成所有图像
|
||
|
||
```bash
|
||
python run_all_figures.py
|
||
```
|
||
|
||
### 3. 查看输出
|
||
|
||
- **图像**: `figures/` 目录(每张图有PDF和PNG两种格式)
|
||
- **验证报告**: `artifacts/figure_build_report.json`
|
||
|
||
## 配置说明
|
||
|
||
所有参数在 `config.yaml` 中定义:
|
||
|
||
```yaml
|
||
global:
|
||
seed: 42 # 随机种子(确保可重复)
|
||
dpi: 300 # PNG分辨率
|
||
|
||
battery_params:
|
||
Q_full: 2.78 # 电池容量 (Ah)
|
||
E0: 4.2 # OCV参数
|
||
R_ref: 0.1 # 参考内阻 (Ω)
|
||
# ...更多参数
|
||
|
||
scenarios:
|
||
baseline: {...} # 基准场景
|
||
navigation: {...} # 导航场景(GPS开启)
|
||
# ...其他场景
|
||
```
|
||
|
||
## 质量保证
|
||
|
||
### 自动验证
|
||
- **Fig03**: R² ≥ 0.99
|
||
- **Fig07**: 电压-电流负相关(CPL特征)
|
||
- **Fig09**: ΔTTE标注与计算一致
|
||
- **Fig13**: 生存曲线单调递减
|
||
|
||
### 输出标准
|
||
- 所有图像300 DPI
|
||
- PDF矢量格式 + PNG光栅格式
|
||
- Times New Roman字体
|
||
- 统一配色方案
|
||
|
||
## 特色功能
|
||
|
||
### 1. 确定性输出
|
||
- 固定随机种子
|
||
- 明确的rcParams设置
|
||
- 无系统时间依赖
|
||
|
||
### 2. GPS影响可视化
|
||
- **Fig09**: 专门标注导航场景的ΔTTE
|
||
- **Fig15**: GPS最佳实践建议
|
||
|
||
### 3. 多维度分析
|
||
- **Fig11**: 温度×信号耦合效应
|
||
- **Fig12**: 蒙特卡洛不确定性
|
||
- **Fig14**: 多周期老化预测
|
||
|
||
### 4. 数据完整性
|
||
- 所有数据从config读取
|
||
- 无硬编码路径
|
||
- 缺失配置时清晰报错
|
||
|
||
## 使用场景
|
||
|
||
### 论文写作
|
||
1. 第1-2节引用 Fig01-02(架构)
|
||
2. 第3节引用 Fig03-06(建模)
|
||
3. 第7节引用 Fig07-08(基准)
|
||
4. 第8-9节引用 Fig09-11(场景)
|
||
5. 第10节引用 Fig12-13(UQ)
|
||
6. 第11节引用 Fig14(老化)
|
||
7. 第12节引用 Fig15(建议)
|
||
|
||
### 演示汇报
|
||
- 使用PDF格式(矢量,放大无损)
|
||
- 关键图:Fig03(验证), Fig09(GPS), Fig12(UQ)
|
||
|
||
### 调试验证
|
||
- 检查 `figure_build_report.json`
|
||
- 所有指标一目了然
|
||
|
||
## 常见问题
|
||
|
||
**Q: Graphviz图像不生成?**
|
||
A: 确保Graphviz可执行文件在PATH中,运行 `dot -V` 测试。
|
||
|
||
**Q: 如何修改参数?**
|
||
A: 编辑 `config.yaml`,重新运行 `run_all_figures.py`。
|
||
|
||
**Q: 如何单独生成某一张图?**
|
||
```python
|
||
import yaml
|
||
from fig03_ocv_fitting import make_figure
|
||
|
||
config = yaml.safe_load(open('config.yaml'))
|
||
result = make_figure(config)
|
||
print(result['computed_metrics'])
|
||
```
|
||
|
||
**Q: 图像风格如何统一?**
|
||
A: 所有脚本都调用 `plot_style.set_oprice_style()`。
|
||
|
||
## 技术细节
|
||
|
||
### 数据生成策略
|
||
- **Fig03-04, 07-08**: 基于物理模型的确定性数据
|
||
- **Fig09**: 多场景仿真对比
|
||
- **Fig12-13**: 蒙特卡洛随机采样
|
||
- **Fig14**: 老化模型外推
|
||
|
||
### 验证逻辑
|
||
见 `validation.py`:
|
||
- 文件存在性检查
|
||
- 尺寸非零检查
|
||
- 图表特定指标检查
|
||
|
||
### 模块化设计
|
||
每个图脚本独立,结构一致:
|
||
```python
|
||
def make_figure(config):
|
||
# 1. 设置样式
|
||
set_oprice_style()
|
||
|
||
# 2. 生成数据
|
||
# ...
|
||
|
||
# 3. 绘图
|
||
# ...
|
||
|
||
# 4. 保存
|
||
save_figure(fig, output_base)
|
||
|
||
# 5. 返回结果
|
||
return {
|
||
"output_files": [...],
|
||
"computed_metrics": {...},
|
||
"validation_flags": {...},
|
||
"pass": True/False
|
||
}
|
||
```
|
||
|
||
## 版本历史
|
||
|
||
- **v2.0** (2026-02-02): 完整15图系统,O奖级质量
|
||
- **v1.0**: 初始ZJ版本(仅Fig03, Fig07)
|
||
|
||
## 许可与引用
|
||
|
||
本代码为MCM 2026竞赛准备,遵循竞赛规则。
|
||
|
||
---
|
||
|
||
**生成日期**: 2026年2月2日
|
||
**目标**: O Prize (Outstanding Winner)
|
||
**团队**: MCM 2026 Problem A
|