简介:专门处理分数阶系统建模与仿真的MATLAB微积分工具箱,面向科研人员、工程师及高校学生,解决分数阶微分方程求解、传递函数构建与数值积分等核心问题。压缩包共289个文件,总大小约2.32MB,含164个m脚本、53个mdl与37个slx模型文件,以及jpg/gif演示图、docx/pdf说明文档。已有1904人学习下载。资源内置FOTF与foss组件,支持Caputo、Riemann-Liouville定义下的分数阶近似算法,如梯形法、辛普森法及Lubich方法;配套详解文档说明函数接口与建模流程,并结合PID优化与模糊控制设计文件,可快速完成分数阶PID整定与模糊控制仿真,还能辅助理解分数阶传递函数在控制系统中的实际应用。整体结构清晰、示例丰富,是分数阶控制理论研究和工程仿真的高价值工具包,文档与示例按功能模块分类,便于检索与复用。
1. 分数阶模型为什么需要专门工具箱
先给结论:当你的被控对象用整数阶传递函数怎么拟合都差 20% 以上的幅频误差时,问题往往不在辨识算法,而在模型阶次本身。分数阶微积分允许微分算子携带非整数幂次,比如s^0.8、s^2.2,这让系统建模多出连续可调的参数维度,也意味着tf、ss对象和bode、step这套传统工具链直接失效。素材包里的 FOTF Toolbox 正是补齐了这条链路:fotf对象负责承载分数阶传递函数,foss支撑族与 Oustaloup 近似负责把抽象算子落到可仿真形式,isstable与optimfopid负责稳定性判断和控制参数寻优。适合做分数阶 PID 设计、粘弹性材料建模、反常扩散过程仿真的科研人员和工程师直接上手。
2. fotf 对象建模:把分数阶传递函数写进 MATLAB
2.1 分数阶微积分的三种定义与工程选型
分数阶导数不是整数阶导数的简单推广,绕不开定义选择。工程上常见三种:Riemann–Liouville(RL)、Caputo、Grunwald–Letnikov(GL)。RL 定义先对函数做分数阶积分再求整数阶导,初值条件需要分数阶积分初值,物理意义不直观;Caputo 把求导顺序反过来,初值条件退化为整数阶初值,控制系统里状态变量初始时刻物理量能直接沿用;GL 则直接基于差分极限给出离散形式,最适合数值实现。
FOTF 工具箱内部函数在解析建模时按 Caputo 语义处理传递函数,而时域数值积分走 GL 离散路径。三者在一定正则条件下等价,但混用定义会导致初值不一致。实操中不要做「Caputo 建模 + RL 类离散器」的组合,除非你确认初值全部为零。
2.2 fotf(a, na, b, nb) 的构建规则
fotf对象的核心思想是用「系数数组 + 阶次数组」描述分数阶传递函数,而不是像tf那样规定分子分母各自为整数阶多项式。其一般形式是
P = fotf(a, na, b, nb)其中a是分母多项式系数向量,na是每个系数对应的微分阶次向量;b与nb是分子的系数和阶次。以被控对象1.2 s^0.6 / (s^2.2 + 0.8 s^0.9 + 1)为例:
den = [1 0.8 1]; den_ord = [2.2 0.9 0]; num = [1.2]; num_ord = [0.6]; P1 = fotf(den, den_ord, num, num_ord); disp(P1);disp(P1)会打印分数阶传递函数文本形式。这里den_ord中最后一个0表示常数项1,系数与阶次按序一一对应,数组长度必须一致;分子只有一个系数时num_ord也只需一个元素。这个构造的典型错误是把系数和阶次向量的位置写反,结果不会报错,但模型面目全非,建议构建后立即disp确认。
另一种更直观的写法是用微分算子构造:
s = fotf('s'); P2 = 1 / (s^2.2 + 0.8*s^0.9 + 1);fotf('s')返回分数阶微分算子对象,之后可以像符号运算一样做乘除加减。运算符重载的判据是两侧至少有一个fotf对象,因此s^2.2 + 0.8*s^0.9 + 1会被解析成合法分母。这个写法的好处是可读性强,坏处是每步运算都会触发对象内部化简,频繁循环构建时性能不如直接构造fotf(a,na,b,nb)。
2.3 频域响应验证对象是否可解析
构造完对象第一步不是仿真,而是画 Bode 图确认模型形态。分数阶传递函数的频域响应可以直接代入(jω)^α计算幅相,工具箱内部也支持这个路径:
w = logspace(-2, 3, 500); [mag, ph] = bode(P1, w);logspace(-2,3,500)生成 0.01 到 1000 rad/s 的 500 个对数间隔频率点。高频段如果相位曲线出现非单调的毛刺,大概率是阶次数组顺序错乱或分母阶次最大值超过数值处理上限。频段选取经验是覆盖系统穿越频率前后各两个十倍频程,窄了会把近似误差误判成真实动态,宽了会让低频积分效应淹没中频特征。
3. foss 数值核心:Oustaloup 近似与 GL 离散化
3.1 为什么不能直接用整数阶算子替代s^α
MATLAB 基础工具箱里没有s^0.8这种东西。tf对象要求分子分母是s的整数幂多项式,s^α的幅频渐近线是20α dB/dec,相频渐近线是90α°,任何有限阶整数传函只能以 ±20 dB/dec 的整数倍斜率去逼近,相位误差会随频带变宽而累积。更本质的问题是分数阶算子具有记忆效应,当前时刻的导数依赖完整历史轨迹,整数阶状态空间模型无法在有限维内精确表征这种特性,只能做有理近似。
3.2 用 Oustaloup 递归滤波器把分数阶算子拉回有理域
Oustaloup 近似是目前工程上最常用的频域拟合法。其基本思想是在选定频段[ω_b, ω_h]内,用一系列交替分布的零点和极点去逼近s^α的幅相特性,零极点频率由以下公式确定:
function G = oust_approx(alpha, wb, wh, N) K = wh^alpha; z = -ones(2*N+1, 1); p = -ones(2*N+1, 1); for k = -N:N wz = wb * (wh/wb)^((k + N + 0.5 - 0.5*alpha) / (2*N+1)); wp = wb * (wh/wb)^((k + N + 0.5 + 0.5*alpha) / (2*N+1)); z(k+N+1) = -wz; p(k+N+1) = -wp; end G = K * zpk(z, p, 1); endalpha是分数阶次,wb和wh是近似的有效频段下上界,N是每侧零极点对数,总阶数为2N+1。K = wh^alpha的选择使近似在ω_h处的增益与理想(jω)^α对齐。函数返回zpk对象,可直接用tf(G)转成有理多项式形式。调用示例:
G_frac = oust_approx(0.8, 1e-2, 1e3, 4); bode(G_frac, {0.01, 1000});注意wb到wh的跨度不要超过 5 个十倍频程,跨度越大,频率边缘的拟合误差越明显。
3.3 频段、阶次与仿真步长的推荐参数
| 使用场景 | ω_b 选取 | ω_h 选取 | N 推荐 | 说明 |
|---|---|---|---|---|
| 闭环控制系统 | 穿越频率的 1/100 | 穿越频率的 100 倍 | 3~5 | 覆盖相角裕度所在频段即可 |
| 时域阶跃仿真 | 1/(10·T_sim) | 0.3·π/h | 4~6 | 高频逼近极点必须低于采样奈奎斯特频率 |
| 系统辨识验证 | 辨识信号最低频/10 | 辨识信号最高频×10 | 5 | 宽频带逼近会显著增加状态维数 |
N不是越大越好。每增加 1,有理传函阶数增加 2,Simulink 仿真积分步长会被迫缩小,耗时呈非线性上涨。我一般先用N=3跑通逻辑,再升到5验证结果差异,差异小于 1% 就说明近似阶数已收敛。
3.4 GL 定义下的短记忆时域积分
做分数阶微分方程时域求解时,GL 定义直接给出离散格式:
function y = gl_fd(f, alpha, h, L) Nbuf = round(L / h); w = ones(1, Nbuf + 1); for j = 1:Nbuf w(j+1) = w(j) * (1 - (alpha + 1) / j); end y = zeros(size(f)); for k = 1:numel(f) n = min(k, Nbuf + 1); y(k) = h^(-alpha) * sum(w(1:n) .* f(k:-1:k-n+1)); end endw是 GL 二项式系数,递推式w(j+1) = w(j) * (1 - (alpha+1)/j)避免了每次计算 Gamma 函数,是 FOTF 工具箱内部foss系列函数处理系数的最常见做法。L是短记忆窗口长度,即只回溯最近L秒的数据,窗口越短计算越快但截断误差越大,截断误差量级约为(L/h)^(-α)。实际调试顺序是:先用小窗口跑出趋势,再逐步增大L,直到响应曲线变化可忽略。
4. 稳定性判定与分数阶 PID 参数整定
4.1 isstable 的判定依据与使用边界
分数阶系统的稳定性判据与整数阶有本质差别。整数阶线性系统的特征值落在复平面左半平面即稳定;分数阶系统在变换后得到的系统矩阵特征值 λ 需要满足幅角条件:|arg(λ)| > απ/2,其中 α 是系统特征方程的分数阶阶次。这意味着除稳定边界外,不稳定区域是一个以负实轴为对称轴的扇形区域,比整数阶系统的判定更严格。工具箱里的isstable按此条件判断fotf对象,调用方式:
P = fotf([1 2 1], [1.5 1.0 0], [1], [0]); flag = isstable(P); disp(flag);如果返回逻辑值1,系统稳定;返回0则需调整控制器参数。使用边界要注意三点:一是矩阵特征值求解对数值病态敏感,构造对象前先用fotf的化简方法归并同阶次项;二是isstable与控制系统工具箱的函数同名,调用前用which isstable -all查看解析顺序;三是有理近似得到的稳定结论不完全等价于原分数阶系统稳定,只能作为工程设计参考。
4.2 通过 optimfopid 完成五参数寻优
定义分数阶 PID 控制器:
function J = pid_itae(x, P) Kp = x(1); Ki = x(2); Kd = x(3); lam = x(4); mu = x(5); C = fotf([1 0], [lam 0], [Kd Kp Ki], [mu+lam lam 0]); T = feedback(P * C, 1); dt = 0.005; t = 0:dt:5; y = step(T, t); e = 1 - y; J = sum(abs(e) .* t) * dt; end这里构造C时,分母为s^λ,分子三项分别为Kd·s^(λ+μ)、Kp·s^λ、Ki·s^0,对应系数数组[Kd Kp Ki]与阶次数组[mu+lam lam 0]。目标函数取 ITAE,abs(e).*t对时间加权,强调稳态误差对代价的贡献。dt=0.005时step输出 1001 个点,计算量适合寻优迭代。用fminsearch做初值搜索:
P_plant = fotf([1 0.8 1], [2.2 0.9 0], [1.2], [0.6]); x0 = [1, 0.5, 0.5, 0.8, 0.3]; [x_opt, J_opt] = fminsearch(@(x) pid_itae(x, P_plant), x0);素材包里的optimpid.fig与optimfopid.fig对应两个 GUI 界面,前者针对整数阶 PID 的 Kp、Ki、Kd 三参数整定,后者面向分数阶五参数[Kp Ki Kd λ μ]寻优。在 GUI 中操作时,需先把被控对象放到基础工作区,界面的 Plant 下拉框才能读取到对象名;目标函数和迭代上限在独立面板中设置,优化完成后结果写入工作区变量。脚本方式适合批处理,GUI 方式适合单对象交互式观察收敛过程,二者并不冲突。
4.3 整定效果验证与指标选择
寻优后必须做数值稳健性检查:把dt从 0.005 缩小到 0.001,若 ITAE 值变化超过 1%,说明离散误差参与并污染了寻优过程,此时返回第 3 章增大 Oustaloup 阶次或缩短 GL 窗口。接着做参数扰动测试,将Kp和Ki分别 ±10% 扰动,观察阶跃响应超调量变化是否连续。不连续跳变往往意味着陷入了近似误差主导的伪最优解。ISE 和 ITAE 的选择规则是:要求快速响应选 ITAE,要求能量最小选 ISE,定值控制优先 ITAE,跟踪控制优先 ISE。
5. 模糊逻辑联调与工具箱自检
5.1 加载 voffuzzy.fis 并查看推理结构
.fis是 MATLAB 模糊推理系统的标准存储格式,voffuzzy.fis描述的是一个以误差e和误差变化率ec为输入、输出 PID 参数修正系数ΔKp ΔKi ΔKd的 Mamdani 型模糊规则库。加载并检查它:
fis = readfis('voffuzzy.fis'); showrule(fis); ruleview(fis);showrule在命令行打印全部模糊规则,ruleview打开规则观测器,可直接拖动输入量看输出曲面。加载失败时优先检查当前工作目录与voffuzzy.fis所在路径是否一致。这个模糊文件的设计思路是做一些初步模糊推理,为optimfopid提供一组起始点,比纯随机初值收敛快且不容易落入局部最优。参数范围取在偏差大时大幅调整、偏差小时微调是最常见规则表形态,检查 8 条以上规则即可确认结构合理。
5.2 用 Oustaloup 近似做 Simulink 联调
FOTF 工具箱的fotf对象无法直接拖入 Simulink,标准做法是先把他做有理近似再对接模糊控制器。操作顺序如下:
- 在 MATLAB 工作区运行
G_s = oust_approx(0.8, 0.01, 100, 4),把分数阶算子近似成有理传递函数; - 把被控对象的
s^2.2和s^0.9分别替换为各自的 Oustaloup 近似,组装成普通tf对象; - Simulink 中放置 Transfer Fcn 模块填入该
tf的分子分母系数; - 放置 Fuzzy Logic Controller 模块,在参数框填入
readfis('voffuzzy.fis')返回的 FIS 变量名; - 将模糊输出通过增益换算叠加到基准 PID 参数上,连接为实时调整结构,而非离线查表。
素材包里的pid_op1.gif、pid_op2.gif到pid_op16.gif就是这种框架下扫参得到的响应曲线动画,每一组对应不同的分数阶次组合,用来直观查看超调量与调节时间随 λ、μ 的变化趋势。数值上要注意 Oustaloup 近似状态空间阶数是2N+1乘以分数项个数,N 取 4 时被控对象已经是 9 阶,仿真步长要用变步长求解器并限制最大步长,否则高频极点容易激发数值振荡。
5.3 验证 FOTF 工具箱的安装与 isstable 冲突处理
解压后将整个目录加入 MATLAB 路径是第一步,但很多人漏了验证是否真的生效。建议把以下四行做成check_fotf.m脚本:
fprintf('fotf: %d\n', exist('fotf', 'file')); fprintf('isstable: %d\n', exist('isstable', 'file')); fprintf('readfis: %d\n', exist('readfis', 'file')); s = fotf('s'); disp(s);返回2表示对应函数或脚本在路径中可见;最后一行能输出s对象说明运算符重载全部就绪。实际使用中报错最密集的是isstable冲突:控制系统工具箱自带isstable,它接受tf、ss对象,不接受fotf对象。当两个重名函数同时在路径上,MATLAB 按路径先后顺序解析调用。排查命令:
which isstable -all如果输出显示系统工具箱版本排在前面,需要用 Set Path 把 FOTF 工具箱目录上移到第一位,或者把 FOTF 版的isstable改名为fotf_isstable后统一替换脚本内调用。改名的代价是后续示例脚本要同步改,我一般优先调整路径顺序。最后回归验证:对已知稳定的分数阶对象isstable返回 1、对已知发散对象返回 0,确认判定逻辑没有因函数冲突被静默替换,这样工具箱才算真正可用。
本文还有配套的精品资源,点击获取