3、仿真环境搭建:MATLAB/Simulink环境配置、Python与TensorFlow/PyTorch环境配置、联合仿真接口设置
好,咱们进入第三章。说实话,仿真环境搭建这事儿,看着简单,但坑是真不少。我见过太多人花了一周调环境,最后发现是版本不兼容。所以这一章,我把自己踩过的坑、积累的经验,一次性倒给你们。
3.1 MATLAB/Simulink环境配置
MATLAB/Simulink,做多能协同控制的老本行。我个人习惯用2021b以后的版本,主要是对Python接口支持得更好。
3.1.1 安装与版本选择
- 版本建议:R2021b 或 R2023a。太老的版本,联合仿真时容易出幺蛾子。
- 必备工具箱:Simulink、Stateflow、Simscape Electrical、Optimization Toolbox、Parallel Computing Toolbox。
- 避坑:我曾经装了个R2019b,结果发现跟Python 3.9死活连不上。后来换了R2021b,问题迎刃而解。
3.1.2 环境变量与路径设置
装完MATLAB,第一件事是配环境变量。不然你写代码时,MATLAB找不到Python,那叫一个抓狂。
% 在MATLAB命令行中执行
setenv('PATH', [getenv('PATH') ';C:\Python39\']);
pyversion('C:\Python39\python.exe');
% 验证是否成功
py.print('Hello from Python!');
嗯,这里要注意:路径里的反斜杠要写双份,或者用正斜杠。我刚开始就因为这个折腾了半小时。
3.1.3 Simulink模型参数配置
做多能协同仿真,模型参数配置是关键。我一般这样设置:
| 参数项 | 推荐值 | 说明 |
|---|---|---|
| Solver | ode45 / ode23t | 连续系统用ode45,刚性系统用ode23t |
| 步长 | auto / 固定0.01s | 多能协同建议固定步长,方便联合仿真 |
| Stop Time | 根据场景定 | 一般设24h或48h,看你的调度周期 |
你想想看,如果步长不统一,Python那边算完了,Simulink这边还没跑完,数据就对不上了。
3.2 Python与TensorFlow/PyTorch环境配置
Python环境,说白了就是版本管理。我建议用Anaconda,省心。
3.2.1 创建虚拟环境
# 创建环境
conda create -n energy_control python=3.9
conda activate energy_control
# 安装核心库
pip install numpy pandas matplotlib scipy
pip install tensorflow==2.10.0 # 或者 pytorch
pip install gym # 强化学习环境
为什么用Python 3.9?因为TensorFlow 2.10是最后一个支持GPU的版本,再往上就得折腾了。我有个项目,就因为用了Python 3.11,TensorFlow死活装不上,最后回退到3.9才搞定。
3.2.2 TensorFlow vs PyTorch 选择
我个人习惯:做强化学习用PyTorch,做时序预测用TensorFlow。但这不是绝对的。
- TensorFlow:部署方便,工业界用得多。如果你要做模型导出到Simulink,TF更友好。
- PyTorch:调试方便,学术界偏爱。我写论文时基本用PyTorch。
3.2.3 GPU加速配置
做深度学习仿真,没GPU真不行。我建议至少配个RTX 3060以上。
# 检查GPU是否可用
import tensorflow as tf
print(tf.config.list_physical_devices('GPU'))
# PyTorch
import torch
print(torch.cuda.is_available())
如果返回False,别慌。先检查CUDA版本对不对。我曾经因为CUDA 11.8配了TF 2.12,结果不兼容,换成CUDA 11.2就好了。
3.3 联合仿真接口设置
这才是重头戏。多能协同控制,说白了就是让MATLAB和Python互相喊话。
3.3.1 MATLAB调用Python
MATLAB里直接调Python函数,非常方便。
% MATLAB代码
% 调用Python的强化学习模型
py_model = py.importlib.import_module('my_rl_model');
action = py_model.predict(state);
% 把Python的numpy数组转成MATLAB矩阵
action_mat = double(py.array.array('d', action));
嗯,这里要注意数据类型转换。Python的list和MATLAB的矩阵不是一回事,我刚开始经常忘记转换,结果报错。
3.3.2 Python调用MATLAB引擎
# Python代码
import matlab.engine
eng = matlab.engine.start_matlab()
# 调用Simulink模型
result = eng.sim('energy_system_model', 24.0)
# 获取仿真结果
power = result['power'][0]
eng.quit()
你想想看,这样就能在Python里控制Simulink跑仿真了。我做过一个项目,用Python的强化学习算法,每步都调用Simulink算一次潮流,效果很好。
3.3.3 基于文件的联合仿真
如果实时调用太慢,可以用文件交换数据。
- MATLAB把仿真结果写入CSV或.mat文件
- Python读取文件,进行计算
- Python把结果写回文件
- MATLAB读取,继续仿真
3.3.4 基于TCP/IP的实时通信
对实时性要求高的场景,用Socket通信。
# Python服务端
import socket
s = socket.socket()
s.bind(('localhost', 12345))
s.listen(1)
conn, addr = s.accept()
while True:
data = conn.recv(1024)
# 处理数据
conn.send(response)
% MATLAB客户端
t = tcpclient('localhost', 12345);
write(t, data);
response = read(t);
我曾经用这种方式,实现了Simulink和Python的实时协同仿真,延迟控制在10ms以内。
3.4 知识体系总览
下面这张图,是我自己总结的仿真环境搭建框架。你照着这个思路走,基本不会迷路。
好了,环境搭建这块就这些。说白了就是三件事:MATLAB配好、Python配好、接口打通。你按这个流程走,基本不会出大问题。如果遇到奇怪的问题,先检查版本,再检查路径,八成能解决。