ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

分数阶系统仿真入门:从new_fod到Simulink的完整实践

分数阶系统仿真入门:从new_fod到Simulink的完整实践 简介分数阶系统理论在信号处理、混沌系统与生物工程等领域应用广泛其非整数阶特性带来更丰富的动态行为同时也让仿真实现成为控制方向学习者常遇到的难点。这份MATLAB示例包面向正在学习分数阶建模与仿真的学生、研究者提供了可直接运行的底层代码与模型。包内共2个文件压缩包约11KB包含一个.m脚本和一个.mdl仿真模型前者实现分数阶微积分算子或传递函数构造后者展示Simulink环境下的系统搭建与阶跃/脉冲响应仿真流程二者配合可帮助用户快速理解分数阶系统的实现路径。目前已有98人学习下载。通过该资源读者既能掌握分数阶微分项的代码写法又能对照模型梳理建模—仿真—结果分析的整体思路并以此为基础扩展分数阶PID控制器或混沌系统实验节省从零搭建算法框架的时间。1. 分数阶仿真到底在仿什么从 fs.zip 里的三个文件说起拿到 fs.zip 解压后常见的场景是里面躺着 fs、new_fod.m、lie.mdl 这三个文件。很多人第一反应是直接双击 mdl 跑一遍看到一条阶跃响应曲线就以为结束了。但做过多组对比之后你会发现分数阶仿真和整数阶仿真的本质区别不在于“多了几个参数”而在于系统本身的记忆效应——当前时刻的输出依赖过去所有时刻的状态这直接决定了建模、求解器和结果分析的方式都不同。这里说的分数阶系统是指微分方程的阶次不是整数比如 $D^{0.5}x(t)x(t)u(t)$。这类系统在描述粘弹性材料、电化学扩散、热传导等场景时比整数阶模型更贴近物理实测数据。fs.zip 里的 new_fod.m 是核心的算子构造脚本lie.mdl 则是一个 Simulink 仿真模型两者配合才能把分数阶传递函数真正跑起来。适合谁来用正在做分数阶控制器设计、混沌同步或频域辨识的工程师和研究生以及想在 Simulink 环境里复现分数阶响应曲线的人。下文会先把数学基础讲透再拆解代码和模型最后给出参数整定与排错的完整路径。2. 分数阶微积分与传递函数建模new_fod.m 在算什么2.1 分数阶算子的频域近似原理分数阶微积分不像整数阶那样有唯一的定义常用的有 Riemann-Liouville、Caputo 和 Grünwald-Letnikov 三种。在做工程仿真时最常用的处理方式是把分数阶算子 $s^\alpha$ 用频域近似的方法转换成高阶整数阶传递函数这样才能在 Simulink 里用普通传递函数模块直接搭建。频域近似的基本思想是在一个选定的频段 $[\omega_b, \omega_h]$ 内用多个零极点对去逼近 $s^\alpha$ 的频率响应。最经典的近似方法是 Oustaloup 滤波器它的连续形式为[ s^\alpha \approx K \prod_{k-N}^{N} \frac{s\omega_k}{s\omega_k} ]其中零点和极点按几何级数分布$N$ 是逼近阶数$K$ 是增益校正系数。$N$ 越大逼近频段内的精度越高但模型阶数也越高仿真耗时随之上升。new_fod.m 本质上就是在做这种事情只不过它会让你自由指定阶次和频段然后返回一个可以直接在 Simulink 中使用的近似传递函数。2.2 new_fod.m 的代码拆解与参数说明假设 new_fod.m 的核心逻辑是输入阶次 alpha、频段下限 wb、上限 wh 和逼近阶数 N返回连续传递函数对象。用 MATLAB 实现一个简化版本如下function G new_fod(alpha, wb, wh, N) % new_fod 生成分数阶算子 s^alpha 的有理逼近传递函数 % 输入 % alpha - 分数阶阶次例如 0.5 表示 s^0.5 % wb - 频段下限 (rad/s) % wh - 频段上限 (rad/s) % N - 逼近阶数通常取 4~8 % 输出 % G - tf 对象即 (s^alpha) 的有理近似 % 第 1 步计算零极点频率 mu wh / wb; k -N:N; wkp wb * mu.^((k N 0.5 - 0.5*alpha) / (2*N 1)); wk wb * mu.^((k N 0.5 0.5*alpha) / (2*N 1)); % 第 2 步构造零极点增益 G tf(1, 1); for i 1:length(wkp) % 串联每个零极点对注意符号 G G * tf([1, wkp(i)], [1, wk(i)]); end % 第 3 步增益校正使低频段增益匹配 K (wh^alpha); G K * G; end这段代码里最关键的逻辑是第 1 步的频率分布公式。mu^((k N 0.5 - 0.5*alpha))这种指数分布保证了零点和极点在频段内对数均匀排列覆盖wb到wh的整个范围。第 2 步把每个零极点对串联起来形成高阶有理传递函数。第 3 步的增益校正确保在频段中点的增益等于 $\omega^\alpha$否则最后得到的系统直流增益会偏离理论值。实际使用中N的选择影响很大。取 4 时模型阶数只有 9 阶仿真速度快但相位误差在频段边缘可能超过 3 度取 8 时模型阶数 17 阶精度高但仿真计算量明显增加。我的习惯是先取N5跑通流程再根据最终响应曲线决定是否提升逼近阶数。另外注意wh要大于实际系统带宽的 10 倍以上否则高频段的近似误差会掩盖系统本身的动态。2.3 阶次 α 对系统动态的影响不同 α 值下分数阶系统的阶跃响应差异非常直观。把 α 从 0.2 一路调到 1.8观察系统从“类似一阶惯性”到“类似二阶振荡”之间的过渡α 范围响应特征典型物理场景0 α 0.5响应缓慢无超调长尾效应明显热传导、粘弹性蠕变0.5 α 1上升速度中等仍无超调但初始斜率较大电化学扩散、生物组织1 α 1.5出现轻微超调振荡衰减较慢粘弹性阻尼系统1.5 α 2超调明显类似欠阻尼二阶系统分数阶 PDD 控制器仿真时最容易犯的错误是忽略 α 的单位。α 0.5 时$s^{0.5}$ 的单位是 $s^{-0.5}$这会导致最终传递函数的量纲出现分数次幂进而影响控制系统增益的物理含义。在处理实际物理模型时必须将分数阶算子归一化即用 $\omega_c$ 去除 $s$例如 $(s/\omega_c)^{0.5}$这样控制器参数才能和整数阶 PID 参数进行对比。3. lie.mdl 里的分数阶仿真环境Simulink 搭建与仿真参数设置3.1 模型结构从传递函数到 ODE 求解器lie.mdl 是一个完整的 Simulink 模型内部通常包含信号源Step、分数阶传递函数模块基于 new_fod.m 生成、示波器和性能分析模块。由于分数阶算子已经被近似成了高阶整数阶传递函数你可以直接使用 Simulink 的 Transfer Fcn 模块或者 LTI System 模块把 new_fod.m 的输出G填进去。模型搭建的常见做法是在 MATLAB 命令行运行G new_fod(0.5, 0.01, 100, 5);生成算子近似打开 Simulink新建模型拖入Step、Transfer Fcn或LTI System、Scope、To Workspace在Transfer Fcn的 Numerator/Denominator 参数中填入G.num{1}和G.den{1}如果要仿真闭环系统则加入Sum和PID Controller把反馈环连好设置仿真时间和求解器运行并观察输出。这里有个细节tf对象返回的 num 和 den 可能是 cell 数组必须用{1}索引才能得到向量。如果直接在参数框填G.numSimulink 会报“参数必须为向量”的错误。另外如果系统是纯分数阶传递函数比如 $G(s) \frac{1}{s^{0.8}1}$不能直接写s^0.8必须先调用new_fod(0.8, ...)得到有理近似再填充否则 MATLAB 会抛出“Undefined function power for input arguments of type tf”这类错误。3.2 仿真时间、采样步长与求解器选择分数阶系统因为有长尾效应仿真时间设置不当很容易出现“曲线还没跑完”或者“稳定判据错误”的情况。整数阶系统通常设 10 秒就能看到稳态分数阶系统特别是 α 0.5 的时候可能需要 100 秒甚至更长。求解器选择上我一般遵循这样的原则系统类型推荐求解器步长设置原因近似阶数 N≤5无快速振荡ode45可变步长Max Step 自动精度高速度快N≥7模型阶数高ode23tb / ode15s可变步长相对容差 1e-6高阶模型容易刚性用隐式求解器更稳仿真含高频逼近误差ode4 (固定步长)步长 ≤ 0.01/wh消除高频抖动伪影实际调试时我发现当wh取得太高比如 1000 rad/s而求解器又自动采用大步长时阶跃响应曲线在起始阶段会出现锯齿状振荡。这不是系统真的在振荡而是高频零极点对的响应没有被足够密的时间点采样到。解决办法是把最大步长设为 $1/(10 \cdot w_h)$或者改用 ode4 固定步长。3.3 阶跃响应与误差验证模型搭好后第一步验证不是看曲线好不好看而是检查近似误差。做法是用同一组 α分别取 N3、N5、N7 生成三个传递函数依次运行仿真把三条阶跃响应画在同一张图上。正常结果应该是 N5 和 N7 的曲线几乎重合N3 的在初始阶段有明显偏差。如果 N5 和 N7 差距仍然很大说明频段[wb, wh]没有覆盖系统的有效频率范围需要扩大wh。注意破这个验证过程需要同时放入一个标准整数阶模型做对比。比如用G0 tf(1, [1 1])作为 α1 的基准然后运行 α0.8、0.9、1.0 的模型确认随着 α 趋近 1分数阶响应逐渐逼近整数阶响应。如果 α0.99 的曲线和 α1 的曲线差异超过 5%基本可以肯定是近似频段设置有问题。4. 分数阶 PID 控制器设计与参数整定实战4.1 分数阶 PID 与整数阶 PID 的差异整数阶 PID 控制器是 $C(s) K_p K_i/s K_d s$而分数阶 PIDPI$^\lambda$D$^\mu$扩展为 $C(s) K_p K_i/s^\lambda K_d s^\mu$其中 $\lambda$ 和 $\mu$ 是额外两个可调参数。多出的两个自由度让控制器可以在保持相位裕度不变的情况下同时调整增益穿越频率和高频增益这是整数阶 PID 无法做到的。在 lie.mdl 中实现分数阶 PID 时需要把 $1/s^\lambda$ 和 $s^\mu$ 分别用new_fod(-lambda, wb, wh, N)和new_fod(mu, wb, wh, N)生成近似传递函数然后通过 Simulink 的并联结构组合。注意这里new_fod第一个参数的符号$1/s^\lambda$ 对应 $-λ$ 的阶次因为 $s^{-\lambda}$ 就是积分算子的有理近似。4.2 在 fs.zip 框架下的控制器实现以下是一个分数阶 PID 的 MATLAB 构建示例可直接配合 lie.mdl 的闭环模型使用% 构建分数阶 PI^lambda D^mu 控制器 alpha_lambda 0.8; % 积分阶次 lambda alpha_mu 0.6; % 微分阶次 mu wb 0.01; wh 100; N 5; % 频域近似参数 % 生成积分和微分算子的近似 s_inv_lambda new_fod(-alpha_lambda, wb, wh, N); s_mu new_fod(alpha_mu, wb, wh, N); % 设定控制器增益可先按整数阶整定结果作为初值 Kp 2.5; Ki 1.2; Kd 0.8; % 并联组合成分数阶 PID C Kp Ki * s_inv_lambda Kd * s_mu; % 查看控制器是否为最小相位系统 [C_num, C_den] tfdata(C, v); fprintf(控制器阶次%d\n, length(C_den) - 1);这段代码的关键点是new_fod(-0.8, ...)生成的是 $s^{-0.8}$ 的近似而不是 $s^{-0.8}$ 的真值。由于频域近似只在选定频段内有效所以积分算子与微分算子的wb/wh必须保持相同否则闭环系统幅值裕度的计算会产生系统误差。控制器阶次是 $2N1$ 的两倍左右因为两个算子叠加导致传递函数阶次相加所以在后续仿真中要关注求解器的刚性程度。参数整定时可以把整数阶 PID 的参数作为初值先用 MATLAB 的pidtune整定一个整数阶 PID然后把Kp, Ki, Kd代入分数阶控制器接着微调 $\lambda$ 和 $\mu$。经验上增大 $\lambda$ 会降低稳态误差消除速度但增强低频抗扰能力增大 $\mu$ 会提高响应快速性但放大高频噪声。4.3 参数整定方法与迭代优化工程上常见的整定流程是频域整定加时域验证。首先在 MATLAB 中画出开环系统 $C(s)G(s)$ 的 Bode 图检查相位裕度是否在 45° 到 60° 之间。如果相位裕度不足优先减小 $\mu$如果增益穿越频率过低则增大 $K_p$ 或减小 $\lambda$。下面给出一组直接可用的参考参数表面向典型被控对象 $G(s) 1/(s^{0.8}1)$控制器目标λμKpKiKd相位裕度快速响应0.70.93.01.51.242°平衡性能0.80.62.51.20.851°强鲁棒性0.90.42.01.00.560°注意这张表只适用于你使用与上述相同的频域近似参数wb0.01, wh100, N5的情况。如果你改了频段控制器参数必须重新整定因为零极点位置已经变了。迭代优化时我会写一个脚本通过stepinfo(C, G)的返回结构来评估超调量、调节时间和稳态误差然后自动循环修改 $\lambda$ 和 $\mu$。每轮仿真后对比指标如果超调过大就减小 $\mu$ 或增大 $\lambda$如果响应太慢就增大 $K_i$ 和 $\mu$。这种手动扫参的方式比直接跑多维优化更可控也更容易发现模型近似带来的异常。5. 仿真结果验证与常见坑从波形到收敛性5.1 超调、振荡与响应速度的量化评估仿真完成后不能只看 Scope 里的曲线要量化评估。在 MATLAB 里用stepinfo自带逻辑运行以下脚本% 假设闭环传递函数为 T G new_fod(0.8, 0.01, 100, 5); C 2.5 1.2*new_fod(-0.8, 0.01, 100, 5) 0.8*new_fod(0.6, 0.01, 100, 5); T feedback(C*G, 1); info stepinfo(T); fprintf(超调量: %.2f%%\n, info.Overshoot); fprintf(调节时间(2%%): %.3f s\n, info.SettlingTime); fprintf(上升时间: %.3f s\n, info.RiseTime);当info.Overshoot为Inf或者调节时间远超理论值时最常见的原因不是控制器没调好而是频域近似的频段选择问题。比如wb取 0.01但系统实际包含低频极点 0.001那么近似在低频段失真导致稳态响应出现缓慢漂移。此时把wb降低一个数量级重新生成算子即可。另一个高频问题如果wh取 100但控制器微分项 $\mu0.9$ 的高频增益过高仿真时会出现采样率不足导致的“数值振荡”。观察输出曲线如果振荡频率约为仿真步长的整数倍基本可以判定是步长问题应把求解器改成固定步长 ode4并设置步长为1/(50*wh)量级。5.2 初值敏感性与历史依赖问题分数阶系统的初始条件不像整数阶那样只给 $x(0)$ 就完事。用 Caputo 定义时初始条件需要给整数阶导数的初值用 Riemann-Liouville 定义时要给出分数阶积分的初值。在 fs.zip 的近似框架中由于已经把分数阶算子变成了高阶整数阶传递函数实际 Simulink 的状态空间表达式是由近似零极点决定的因此初值问题被“转移”到了这些内部状态上。这意味着如果你在 Simulink 中对积分器模块手动设置初值与分数阶理论上的初值并不直接对应。常见的处理办法是让仿真从零状态开始先运行一段足够长的“预热”时间再在特定时刻施加阶跃激励。这样规避初值设定问题同时也能观察到分数阶系统特有的“历史记忆”对后续响应的影响。手动施加信号时用Step模块的Step time参数把它设为 1 秒或更大让系统在施加输入前已经充分稳定。5.3 提升仿真精度的技巧仿真精度不足时不要一味减小求解器容差那会成倍增加计算时间。先做这几件事第一检查new_fod的N是否足够可以用 2.3 节提到的对比法第二检查频段范围用开环 Bode 图覆盖系统谐振峰前后各两个十倍频程第三在 Simulink 配置里将“Max step size”设为固定值比如0.001秒避免变步长在系统响应缓慢时跨过大步长导致高频近似项产生伪振荡。另一个有效技巧是在模型中加入一个Transfer Fcn模块做后置滤波比如 $1/(0.001s1)$滤掉高频近似噪声。但要注意滤波时间常数不能太大否则会掩盖真实动态。我通常取wh倒数的 1/10 到 1/5例如wh100时滤波时间常数取 0.001s既能平滑曲线又不影响主频带。最后如果要输出到论文或报告中用to Workspace模块保存时间序列数据同时把求解器的相对容差设为1e-6绝对容差1e-8这样导出数据的重复性好也不会因为后处理重采样而丢失细节。本文还有配套的精品资源点击获取
返回列表