在用MATLAB写自控原理的例题的时候,使用到了串联超前校正,其中有有一段代码使用到了spline函数,其作用相当于在一条已知直线上,已知x坐标,求解y坐标的功能。
在串联超前校正中正好有用武之地,在求得-10lg(a)之后,需要作平行线交原有的传递函数bode图幅频特性曲线上,以求得校正后的截止频率Wc,即卢老师课程中提到的OMEGA_A。实现代码如下:
fai_m = r_star - Pm + delta;
a = (1+sind(vpa(fai_m,3)))/(1-sind(vpa(fai_m,3)));
a = vpa(a,3);
baselin_10loga = -10*log10(a);
[Mag,phase,w] = bode(num,den);
%注意要将幅值转换成分贝dB的形式
mag_db = mag2db(Mag);
%模拟作图计算的环节
D = 3.9;
% 对Omega_D进行向右偏移,偏移量为D
omega_A = spline(mag_db,w,double(baselin_10loga));
omega_C = (wcp)^2/(omega_A);
omega_D = (omega_A)^2/(omega_C)+D;
num_correct = [1/omega_C,1];
den_correct = [1/omega_D,1];
%得到校正环节的传函
Gcs = tf(num_correct,den_correct);
可以看到求解OMEGA_A的时候用到了spline函数,当时出现了一个报错为:
报错的内容很简单,spline中要求必须为双精度或者单精度类型,查看工作区的数值表,发现平行线的参考插值baseline_loga的数据类型是sym符号类型,
其他的w,mag_db两个数据是double类型即双精度类型,
所以需要将baseline_loga转换成双精度类型,使用函数double()即可,类似于C语言中的强制类型转换。
则更正为
omega_A = spline(mag_db,w,double(baselin_10loga));
则可以成功运行,关于超前校正可以参考下篇文章:
https://blog.csdn.net/qq_59911256/article/details/133654825?spm=1001.2014.3001.5501