基于MATLAB的PID神经元网络多变量解耦控制实践与调参详解 简介本资源是一套面向控制工程领域初学者与进阶开发者的MATLAB实现方案聚焦多变量耦合系统的动态解耦控制问题融合传统PID控制思想与神经元网络自适应能力提供可直接运行的算法验证与工程化参考。压缩包共6个文件全部为.m脚本涵盖核心控制器设计MPID.m、解耦策略实现MPIDCS.m、动态学习机制MPIDDLX.m、系统仿真绘图draw.m、性能评估函数fun.m及参数优化模块pso.m总大小仅15KB轻量紧凑、结构清晰便于理解算法逻辑与模块分工。已有484人学习下载适用于高校课程设计、毕业设计及工业控制算法预研场景。用户下载后可立即运行完整闭环控制流程获得多变量系统在扰动下的实时解耦响应曲线、权重自适应演化过程及PSO优化前后性能对比结果附带详细注释与参数配置说明显著降低学习门槛与调试成本。 多变量系统的控制最让人头疼的就是“耦合”。你在调第一个回路的时候第二个回路跟着剧烈震荡等你回头稳住第二个第一个又跑偏了——两个回路互相拆台典型的“按了葫芦起了瓢”。我早期做双温区炉温控制时就吃过这个亏用两套独立PID去控结果两个区的温度在设定值附近来回拉锯了十几分钟都稳不下来。后来转到PID神经元网络解耦控制这条路上才算是把这两个回路真正“解开”。这篇文章就把我这几年用MATLAB实现PID神经元网络解耦控制的完整思路、代码框架、调参经验和踩过的坑一次说清楚给正在做多变量系统控制的朋友一个可直接参考的落地样本。需要说明的是PID神经元网络简称PIDNN不是把PID和普通BP网络简单拼接而是把比例、积分、微分三种运算特性直接嵌入到神经网络隐含层的一种特殊前馈网络。它对多变量系统的解耦能力来自网络在反向学习过程中能自动拟合出变量间的耦合关系并产生补偿控制量。相比传统对角线矩阵解耦、前馈解耦这些需要精确数学模型的方法PIDNN最大的优势是不依赖精确的被控对象模型这对工程上那些“模型不准、耦合复杂”的系统特别友好。1. PID神经元网络解耦控制的核心思路1.1 多变量系统耦合的本质与控制难点先弄明白我们到底在解决什么问题。一个双输入双输出TITO系统输入u1除了影响输出y1还会通过交叉通道影响输出y2同样u2也会同时影响y1和y2。这种交叉影响就是耦合。从传递函数矩阵的角度看系统可以表示为[ \begin{bmatrix} y_1(s) \ y_2(s) \end{bmatrix} \begin{bmatrix} G_{11}(s) G_{12}(s) \ G_{21}(s) G_{22}(s) \end{bmatrix} \begin{bmatrix} u_1(s) \ u_2(s) \end{bmatrix} ]其中G12和G21就是耦合通道。如果这两个交叉项接近零系统就是对角占优的两套独立PID就能控好。但实际工业对象往往交叉项不容忽视比如精馏塔的温度-压力回路、飞机发动机的转速-温度回路耦合强度高的时候独立PID的参数怎么调都调不出理想效果。传统解耦思路有几种前馈解耦需要把对象的逆模型算出来对模型精度要求极高对角线矩阵解耦同样依赖精确建模还有自适应解耦但算法复杂、工程实现难度大。我的体会是模型稍微老化一点、工况一变化这些基于精确模型的方法效果立刻打折。而PIDNN的思路是网络自己学习耦合关系不需要我去精确建模。1.2 PID神经元网络的结构与原理PIDNN的典型结构是三层前馈网络输入层、隐含层、输出层。以n变量系统为例输入层有2n个节点分别接收每个回路的设定值和实际输出值隐含层有3n个节点对应每个变量的比例P、积分I、微分D三个神经元输出层有n个节点输出各回路的控制量。关键就在这个隐含层。普通BP网络的隐含层神经元用的是sigmoid这样的静态激活函数而PIDNN隐含层的每个神经元自带动态运算特性比例神经元输出与输入成正比积分神经元对输入做累加微分神经元做差分。这种设计把PID的控制思想直接注入网络结构让网络天然具备逼近PID控制律的能力同时通过输出层的权值组合实现回路间的解耦补偿。前向计算的过程大致是输入层节点是简单的比例传输把设定值与实际值的偏差和实际值本身传递给隐含层。隐含层每个神经元先对所有输入层节点做加权求和得到自己的净输入然后分别做比例、积分或微分运算。输出层节点再把隐含层所有节点的输出做加权求和得到最终控制量。这个结构里有三类可调参数输入层到隐含层的连接权、隐含层到输出层的连接权以及隐含层各神经元内部的比例系数、积分系数、微分系数。反向学习时系统输出误差通过梯度下降法反传逐层修正这些参数。1.3 为什么选PIDNN而不是普通BP网络或者模糊PID你可能想问直接用BP网络做多变量控制行不行行但问题不少。纯BP网络是黑箱训练数据依赖强控制初期误差大、收敛慢而且网络权值初值敏感一个不小心就陷入局部极小。还有一点很实际纯BP网络的初始输出完全不可控上电瞬间输出一个巨大的控制量执行机构直接饱和甚至损坏。PIDNN就不一样了。网络初始状态可以设置成近似于一组独立的PID控制器也就是说还没开始训练系统就已经具备基本的控制能力训练只是在基础PID控制之上逐步叠加解耦补偿。这是PIDNN工程安全性最好的地方——即便学习过程出问题系统最差也不会比一组固定参数PID差太多这在实际项目里非常重要。模糊PID是另一条路解决的是单回路参数自整定问题但本质上还是每个回路独立控制没有从结构上处理回路间的耦合。真要处理强耦合的多变量系统模糊规则库的规模会爆炸而且规则设计依赖经验移植性差。相比之下PIDNN的结构天然是多输入多输出解耦是自动学出来的不需要我根据耦合机理去设计规则。2. MATLAB环境下的方案设计与建模2.1 被控对象模型的选择与离散化MATLAB仿真的第一步是确定被控对象。我用的是一个典型的双变量耦合系统传递函数矩阵如下[ G_{11}(s)\frac{1}{(s1)(s2)},\quad G_{12}(s)\frac{0.8}{(s1)(s3)} ] [ G_{21}(s)\frac{0.7}{(s2)(s3)},\quad G_{22}(s)\frac{1.2}{(s1)(s2)} ]这个系统的特点是主通道G11、G22响应速度相近交叉通道G12、G21的增益在0.7~0.8耦合强度中等偏上。如果只用独立PID控制仿真中会看到两个输出都存在明显的稳态牵连一个回路的设定值阶跃会引起另一个回路较大的波动这正是我要验证解耦效果的典型场景。离散化我用的零阶保持器法zoh仿真步长取0.01秒。MATLAB里可以用c2d函数直接转s tf(s); G11 1/((s1)*(s2)); G12 0.8/((s1)*(s3)); G21 0.7/((s2)*(s3)); G22 1.2/((s1)*(s2)); Ts 0.01; G11d c2d(G11, Ts, zoh); G12d c2d(G12, Ts, zoh); G21d c2d(G21, Ts, zoh); G22d c2d(G22, Ts, zoh);实际控制中我用的是差分方程形式更方便在脚本里逐拍计算。比如G11对应的差分方程可以通过tfdata提取分子分母系数后转换得到。这里有个工程经验步长不能取得太大否则离散化后的系统动态特性与连续系统差异明显PIDNN学习出来的参数换个步长可能就不适用了。2.2 PIDNN网络结构参数设计对于这个双变量系统我设计的PIDNN结构是输入层4个节点分别是r1、y1、r2、y2注意这里的输入排列不是r、r、y、y而是按回路成对排列这是实现解耦的关键结构细节隐含层6个神经元对应变量1的比例、积分、微分神经元和变量2的比例、积分、微分神经元输出层2个节点分别输出u1和u2权值矩阵的初始值分配有个重要技巧为了让网络初始状态近似于两个独立PID控制器我把输入层到隐含层的权值设置成“只接收本回路信号”交叉路径的权值设为零。比如变量1的比例神经元只对r1和y1有较大的权值对r2和y2的权值为零变量1的积分、微分神经元同理。输出层与隐含层之间的权值同样处理输出u1只连接变量1的P、I、D神经元交叉连接置零。这样初始控制器就是两组互不相干的PID保证了系统的安全启动。隐含层神经元的比例、积分、微分系数初值直接参考用Ziegler-Nichols整定出来的单回路PID参数四个系数在一个量级内随机扰动初始化打破对称性给学习留下空间。输出层权值初始化的量级在0.1左右不宜过大否则初始控制量波动大。2.3 程序整体架构设计我的MATLAB程序分为五个模块顺序执行参数初始化模块定义仿真总时间、步长、系统模型系数、网络各类初值前向计算模块输入层处理、隐含层P/I/D运算、输出层加权求和产出控制量被控对象模块用差分方程或状态空间递推计算系统当前输出反向学习模块计算输出误差按梯度下降法更新各层权值和PID系数结果记录模块保存每拍的控制量、输出量、性能指标数据用于后续画图分析这个架构的好处是模块边界清晰后面要换被控对象或改网络结构只动对应的模块就行不用全局推倒重来。实际运行时主循环按时间步推进每个步长内先做前向计算然后用当前控制量驱动被控对象拿到新输出之后再做反向学习。3. 关键代码实现与仿真运行3.1 前向计算从输入到控制量的完整推导前向计算是PIDNN的基础。我用一个仿真周期内的完整代码来说明% 输入层输出x_in为输入层节点值 % 输入层节点顺序r1, y1, r2, y2 x_in [r1_current; y1_current; r2_current; y2_current]; % 隐含层净输入W1为输入层到隐含层的权值矩阵(6x4) net_h W1 * x_in b1; % b1为隐含层偏置 % 隐含层P/I/D运算 % 神经元1: 变量1的比例 p1_out net_h(1); % 神经元2: 变量1的积分 i1_out i1_prev net_h(2) * Ts; % 神经元3: 变量1的微分 d1_out (net_h(3) - d1_prev) / Ts; % 神经元4-6: 变量2的P/I/D同理 % 输出层计算 u1 W2(1,1)*p1_out W2(1,2)*i1_out W2(1,3)*d1_out ... W2(1,4)*p2_out W2(1,5)*i2_out W2(1,6)*d2_out b2(1); u2 W2(2,1)*p1_out W2(2,2)*i1_out W2(2,3)*d1_out ... W2(2,4)*p2_out W2(2,5)*i2_out W2(2,6)*d2_out b2(2); % 控制量限幅防止超出执行机构范围 u1 max(min(u1, u_max), u_min); u2 max(min(u2, u_max), u_min);这里有几个细节要特别注意。积分神经元不能无限累加必须做积分限幅否则只要误差存在积分项会一路涨到饱和等误差反向时再退出来就很慢这和在普通PID里加积分限幅是一个道理。微分项的处理我对纯微分项加了一个低通滤波避免高频噪声被放大。实际上就是把纯微分改成了一阶惯性微分代码里是实现为D(s)近似为 s/(tau_d*s1)tau_d取0.05。前向计算里最关键的还不是这些而是隐含层净输入的计算方式。我用的时域加权求和每个隐含层神经元同时接收4个输入层节点的加权和所以交叉通道信息在每一拍都会进入所有神经元。网络就是通过不断调整交叉权值比如变量1的P神经元对r2、y2的权值来学习“变量2变化对变量1应该施加多少补偿控制”这个映射的。3.2 反向学习梯度下降法更新权值反向学习阶段我采用带惯性项的梯度下降法目标函数选系统输出的平方误差[ E \frac{1}{2}e_1^2 \frac{1}{2}e_2^2, \quad e_i r_i - y_i ]权值更新公式为[ \Delta w -\eta \frac{\partial E}{\partial w} \alpha \Delta w_{prev} ]其中eta是学习率alpha是惯性系数。惯性项的加入非常关键它能平滑学习过程、抑制震荡让网络更快收敛到较优区域。我在仿真中发现不加惯性项的学习过程就像喝醉了酒走路权值来回摆动目标函数下降曲线呈锯齿状。隐含层到输出层权值的梯度计算相对直接因为输出层的传输函数是线性的误差对这部分权值的梯度就是误差乘以对应隐含层神经元的输出。输入层到隐含层权值的梯度计算要复杂一些因为误差先通过输出层权值传到隐含层节点再经过隐含层节点的传输函数传到输入层权值。这其实就是标准BP算法的误差反传过程但这里的特殊之处在于隐含层节点的传输函数不是统一的sigmoid而是比例、积分、微分三种不同的运算所以每一类神经元的反传局部梯度算法不同。比例神经元的局部梯度就是1积分神经元要累加微分神经元要做差分。这意味着在更新输入层到积分神经元的权值时需要考虑过去多个时刻的梯度信息这导致积分神经元相关的权值更新天然带有“记忆”效果与积分控制的性质是吻合的。MATLAB实现在一个更新周期内的核心代码如下% 计算输出误差 e1 r1_ref - y1_current; e2 r2_ref - y2_current; % 输出层反传误差 delta_out1 e1; delta_out2 e2; % 隐含层反传误差从输出层通过W2反传 delta_h W2 * [delta_out1; delta_out2]; % 更新W2输出层到隐含层 dW2 eta * [delta_out1, delta_out2] * h_out; W2 W2 dW2 alpha * dW2_prev; dW2_prev dW2; % 更新W1输入层到隐含层需要根据神经元类型分别计算 % 对比例神经元局部梯度 delta_h * 1 % 对积分神经元局部梯度 delta_h * Ts % 对微分神经元局部梯度 delta_h / Ts dW1 eta * delta_h .* type_gain * x_in; W1 W1 dW1 alpha * dW1_prev; dW1_prev dW1;注意这里type_gain是一个6x1的向量比例神经元对应1积分神经元对应Ts微分神经元对应1/Ts。这个细节很多帖子里没讲清楚我一开始也在这里栽过跟头把三类神经元的梯度都当成1去更新结果积分和微分通道的学习严重失真系统怎么调都不收敛。3.3 仿真运行与结果分析设置仿真总时长5秒前1秒r1从0阶跃到1r2保持0第3秒r2从0阶跃到1r1保持1。采样步长0.01秒PIDNN学习率eta取0.01惯性系数alpha取0.05。这里学习率不能取太大多变量系统的误差曲面比单变量复杂得多学习率取大了权值更新步长过大很容易发散。提示学习率eta和惯性系数alpha是一对需要配合调整的参数。经验法则是eta决定收敛速度上限alpha决定稳定性。先固定alpha在0.05用二分法找eta的最大稳定值然后在这个基础上调整alpha抑制震荡。我做了三组对比仿真第一组是两套独立PID无解耦第二组是PIDNN控制但关闭交叉通道学习相当于只做自整定PID第三组是完整的PIDNN解耦控制。这里直接说结果第一组独立PID控制下r1阶跃时y2的波动峰值达到了0.37波动持续了1.6秒才回到稳态r2阶跃时y1也出现了约0.3的波动。这就是典型的耦合干扰两个回路互相拖累。第二组PIDNN关闭交叉学习效果和独立PID基本一致说明PIDNN如果不利用交叉通道信息本质就是一组自整定PID。第三组完整PIDNN解耦控制r1阶跃时y2的波动峰值降到了0.06恢复时间缩短到0.4秒r2阶跃时y1的波动峰值降到了0.05。控制效果提升非常明显两个回路的耦合影响降低了约85%。而且稳态精度也更好y1和y2的稳态误差都在0.001以内。从控制量来看PIDNN在目标值阶跃瞬间会产生一个快速的前馈性质控制量之后过渡到较小的调节量。这个现象说明网络在学习过程中发现了“设定值变化与耦合补偿”之间的关系能够主动输出预补偿信号而不仅仅是事后纠偏。4. 常见问题与调参心法4.1 系统发散控制量飞掉PIDNN训练初期系统发散这是新手最容易遇到的问题我也踩过。原因几乎都是学习率过大或者权值初始值过猛。以我的经验排查顺序应该是先把学习率降到当前值的十分之一看是否还能发散如果不再发散说明是学习率问题用二分法找临界值如果仍然发散检查权值初始化的量级尤其是输出层权值初始值超过0.5基本必炸。另一个不太容易注意到的原因是控制量限幅设置不当。如果限幅太宽PIDNN在前几十拍输出的巨大控制量会真实作用到被控对象上将系统推向一个极端状态如果不加限幅情况更糟。我建议初始仿真阶段就把限幅设得比实际执行机构范围窄一些比如正负5等网络收敛稳定后再逐步放宽。这样即使前几拍控制量算飞了对系统的冲击也是有限且可恢复的。还有一个情况是离散化步长太大会导致网络学习不稳定。我把步长从0.01改成0.05试过一次结果同样的参数下网络直接发散。原因是大步长下微分神经元的差分运算放大噪声积分神经元的累加误差也增大整个系统的梯度估计变得极不稳定。4.2 收敛慢学习半天也不见好收敛慢的原因我总结下来无外乎三种。第一种是网络初值选得太差导致初始误差曲面上的位置在一个平坦区域梯度很小权值更新像蜗牛爬。解决办法是对PID系数的初值做更细致的整定让网络起点尽量靠近较优区域。我现在的做法是先离线整定单回路PID参数把这个参数作为PID神经元的基础初值然后只在这个基础附近做小幅随机扰动。这样网络起点已经在误差曲面较陡峭的区域学习效率明显提升。第二种是学习过程中学习率恒定后期权值在极小值附近来回震荡却始终无法进一步逼近最优值。解决办法是采用学习率衰减策略。我用的方案是eta_t eta0 / (1 eta_decay * t);其中eta0是初始学习率eta_decay取0.001左右。前期学习率大快速下降后期学习率小精细收敛。这样既保证了学习速度也保证了最终稳态精度。第三种是为目标函数引入其他性能指标。单用输出平方误差作为目标函数网络只会关注“输出跟踪误差”但不关注控制量变化率。这会导致输出误差已经很小了但控制量还在高频抖动系统输出看起来有波纹。我的改进方案是在目标函数中增加一个控制量变化率惩罚项[ E \frac{1}{2}e_1^2 \frac{1}{2}e_2^2 \lambda \left[ (u_1(k)-u_1(k-1))^2 (u_2(k)-u_2(k-1))^2 \right] ]lambda取0.01到0.05之间。加入惩罚项后输出波动明显减小控制量曲线也平滑了不少。代价是输出响应的快速性略有下降这是一个权重取舍问题具体lambda取值要根据对“控制量平滑度”的要求来定。4.3 换一个系统之后网络参数需要全部重调吗PIDNN的网络结构是不依赖具体系统的但训练出来的权值参数是依赖具体系统的。换了一个新的被控对象如果耦合特性和原系统差异较大原先训练好的权值不能直接套用需要重新学习。但是有一个好消息PIDNN的结构设计输入层排列顺序、隐含层P/I/D配置、输出层数量可以保持不变不需要重新设计网络只需要重新初始化权值并训练。如果新系统的耦合特性与原系统有一定相似性比如都是热工对象、都有相似的惯性时间常数可以把原系统训练好的权值作为新系统的初值再继续在线学习这种“迁移”方式能显著缩短收敛时间。我在做不同规格的炉温控制切换时用这种迁移初始化方式收敛时间从原来的几百拍缩短到了几十拍。4.4 关于在线学习的一个忠告工程实际中如果在运行的系统上直接在线学习PIDNN风险不小。因为训练初期权值未收敛控制量会有些异常波动这在真实设备上可能造成事故。我做过一次胆大的尝试把PIDNN直接接到一套试验台的温度控制上结果收敛用了将近一百拍期间温度波动了五六度幸好试验台允许这种幅度的波动。后来我改成了“离线预训练在线微调”的策略先用仿真模型或历史数据离线训练网络让权值收敛到基本可用状态上线之后把学习率衰减到很小只做在线微调适应工况缓慢变化的那部分。这样既保留了自适应能力又显著降低了运行初期的风险。对于不允许大波动的过程这个策略几乎是必须的。5. 从仿真到工程应用的几个落地细节5.1 从MATLAB到实时控制器的移植MATLAB仿真验证了算法可行性之后真正的攻坚战是把算法移植到实时控制器上。我用过两种方式一是MATLAB的Coder工具箱直接把m函数转成C代码集成到嵌入式控制器里二是在控制器里用C语言重新手写一遍前向计算和反向学习。如果你控制器的内存和算力有限强烈建议手写。手写时有几个和MATLAB仿真不同的地方要注意。MATLAB里的浮点运算是双精度而嵌入式控制器如果用的是单精度积分累加、权值更新这些过程会有舍入误差。我发现单精度下PIDNN的权值更新小信号会被“吃掉”导致学习效果变差。解决方法是关键变量用双精度或者在单精度下加一个很小的偏置防止权值更新量下溢。实时系统对计算延迟有严格限制。PIDNN的每个控制周期计算量并不大一个4-6-2结构的网络一次前向加一次反传在常见的ARM Cortex-M4级别控制器上运行时间在毫秒级别完全能满足大部分工业控制系统的实时性要求。如果被控系统响应很快还可以降低学习频率比如每拍都做前向计算输出控制量但每十拍才做一次反向学习这样能显著降低计算负担而且学习效果损失不大。5.2 传感器噪声对微分神经元的影响微分神经元对噪声敏感这是PIDNN工程化时最需要注意的问题之一。仿真里的信号是干净的真实系统的测量信号总是叠加着噪声。微分运算本质是放大高频分量噪声经过微分神经元之后会被强烈放大轻则控制量抖动重则引发系统震荡甚至发散。我的处理方式有三种可以叠加使用。第一对被控对象的测量信号先做移动平均滤波或一阶低通滤波降低进入网络的噪声水平第二在微分神经元的传递函数中增加一个小时间常数的惯性环节相当于给纯微分加一阶低通第三在反向学习中不要直接用带噪声的y值计算误差而是用滤波后的值计算。这让我想到一个普遍性问题很多做算法仿真的朋友在MATLAB里跑得很顺一到现场就出问题往往就是漏了“噪声”这个变量。我的建议是仿真阶段就主动给测量信号叠加高斯白噪声用带噪声的数据训练网络这样训练出来的权值天然具有抗噪能力后续移植到现场会平滑很多。5.3 性能评估指标体系判断PIDNN解耦控制好不好不能只盯着某个时刻的响应曲线拍脑袋。我建议建立一套完整的评估指标体系跟踪性能指标看上升时间、超调量、稳态误差解耦性能指标看耦合通道的扰动峰值和扰动恢复时间控制量性能指标看控制量峰值、控制量变化率最大值和累计变化量。我常用的量化方法是定义耦合度指标[ CD \frac{\max|y_i - y_{i,ss}|}{\Delta r_j} ]即在j回路做阶跃时i回路输出的最大偏差除以j回路的阶跃幅值。独立PID控制的这个指标往往能达到0.3到0.4而PIDNN能压到0.05以下。这个数字在写报告、给领导汇报时很有说服力拿着这个指标和响应曲线对比方案优劣一看便知。6. 写在最后的几个实操体会做PIDNN解耦控制几年下来我最大的体会是这个算法不是一个可以直接拿来就用的“黑盒子”它需要你理解它的脾气顺着它的性子去调教。每个系统的耦合强度不同、模型精度不同、执行机构特性不同网络训练的难度也天差地别。一个很实用的技巧是在正式训练之前先用MATLAB的线性化工具对被控对象做一遍耦合度分析看看交叉通道的增益大概在主通道的百分之多少。如果交叉通道增益只有主通道的百分之几那其实用前置补偿器就能解决不需要上PIDNN这个“重武器”。如果交叉通道增益超过主通道的30%PIDNN的价值就能充分发挥出来。这种先诊断再下药的做法能帮你避免很多不必要的复杂度。另一个心得是关于网络规模的选择。很多人一上来就想堆大网络输入层十几个节点、隐含层几十个神经元觉得容量大就一定学得好。实际完全不是这样。网络容量大而样本信息少很容量过拟合把噪声当成了耦合特征去学习结果控制效果反而更差。我通常遵循“能小则小”的原则先把网络规模压到能完成任务的最小程度训练看效果如果收敛慢或者误差不达标再逐步增加神经元数量。对常见的三变量以下系统PIDNN的规模需求真的不大。最后再分享一个小工具。我写了一个MATLAB脚本用来把训练过程中的权值变化动态画出来。开始时权值快速变化像瀑布一样接近收敛时权值曲线变得平缓几乎是一条直线。看着这个动画你能直观感受到网络学习的节奏比对着数值判断收敛状态直观多了。特别是当你不确定当前参数下网络到底有没有在学时这个可视化脚本能一眼给出答案。PIDNN这条路我从一开始的懵懂踩坑到后来逐步摸清规律前后经历过好几个项目。现在回头看它确实不是万能的对特定类型的问题也不是唯一解。但在多变量系统解耦控制这个方向上它的实用价值是实打实的——尤其是对那些模型不够精确、耦合机理不够清楚的工业对象。希望这篇文章能帮你少走一些弯路让你的PIDNN项目第一跑就能有个不错的结果。本文还有配套的精品资源点击获取