【Matlab】求阶跃响应的性能指标参数

明确控制系统的单位阶跃响应性能指标在时域主要有以下几个(参考《自动控制原理(非自动化版)--孟庆明主编》):

  • 延迟时间:单位阶跃响应曲线上升到稳态值的50%所需时间
  • 上升时间:单位阶跃响应曲线从稳态值的10%上升到90%所需要的时间
  • 峰值时间:单位阶跃响应曲线超过稳态值而达到第一个峰值所需要的时间
  • 调节时间:整个过渡过程所经历的时间,输出衰减到与稳态值偏差不大于稳态值的2%或5%所经历的时间(本文均选用2%误差带)
  • 超调量:响应过程中输出量超出稳态值的最大偏差,用它与稳态值比值的百分数表示
  • 振荡次数:单位阶跃响应曲线在0~调节时间内,穿越稳态值次数的一半(向下取整)
  • 稳态误差:时间趋于无穷时单位阶跃响应期望值与实际值之差

假设我们有一堆数据,只知道其中存在单位阶跃响应,但不知道起点和终点在哪里,首先需要做的是找出这一个数据段并截取下来,例如下图。

由图可见,这段数据有一个特征:开头段和末尾段收敛。默认开头段跟随指令开始阶跃,将末尾段“进入收敛区”的标准定义为该点数据与之后4个步长的数据之差小于0.02%,且该点之后的3个点都满足这个要求(加粗的具体数值可以根据data的实际情况调整)

clear;clc
data=[0;0.00483333333333333;0.0186683055555556;0.0405167920787037;0.0694085086899066;0.104398538880760;0.144573903698365;0.189059202767804;0.237021361240398;0.287673522615346;0.340278131701575;0.394149255474025;0.448654192280081;0.503214421816537;0.557305949576903;0.610459100115863;0.662257813546533;0.712338499231021;0.760388499699967;0.806144216495655;0.849388947928371;0.889950486717681;0.927698523208254;0.962541897350610;0.994425739965037;1.02332854100393;1.04925917963288;1.07225394800038;1.09237359759342;1.10970043411138;1.12433548386208;1.13639575181432;1.14601158865432;1.15332418150591;1.15848318040403;1.16164447016947;1.16296809503280;1.16261634120350;1.16075198058459;1.15753667699601;1.15312955459563;1.14768592667393;1.14135618164745;1.13428482188350;1.12660964995128;1.11846109600710;1.10996167927856;1.10122559600674;1.09235842573047;1.08345694744393;1.07460905691990;1.06589377635798;1.05738134748040;1.04913339924957;1.04120318151180;1.03363585607241;1.02646883696958;1.01973217203024;1.01344895815182;1.00763578315232;1.00230318745955;0.997456139362198;0.993094518013621;0.989213598858538;0.985804536636825;0.982854841602793;0.980348845077900;0.978268150925661;0.976592069995978;0.975298035029005;0.974361993933308;0.973758779757089;0.973462456052826;0.973446636693325;0.973684779529684;0.974150453588402;0.974817579785241;0.975660645387362;0.976654892682831;0.977776482518114;0.979002633540263;0.980311738131874;0.981683456154438;0.983098787720582;0.984540126298874;0.985991293517862;0.987437557079918;0.988865633221821;0.990263675169225;0.991621249027565;0.992929298534181;0.994180100066718;0.995367209262777;0.996485400556595;0.997530600881617;0.998499818724455;0.999391069647122;1.00020329932170;1.00093630504591;1.00159065663038;1.00216761746944;1.00266906652858;1.00309742190289;1.00345556652387;1.00374677651640;1.00397465263500;1.00414305513805;1.00425604239211;1.00431781343510;1.00433265466766;1.00430489078670;1.00423884002401;1.00413877370575;1.00400888010620;1.00385323253075;1.00367576152924;1.00348023111056;1.00327021880420;1.00304909939194;1.00282003211538;1.00258595114994;1.00234955912520;1.00211332346334;1.00187947530209;1.00165001076687;1.00142669435602;1.00121106420630;1.00100443900937;1.00080792635647;1.00062243229612;1.00044867189848;1.00028718063011;1.00013832635397;1.00000232178090;0.999879237211502;0.999769013419301;0.999671474539584;0.999586340840609;0.999513241267068;0.999451725658172;1.00423460988852;1.01802962608073;1.03984803101812;1.06871888684573;1.10369659794603;1.14386748967007;1.18835545755267;1.23632672175364;1.28699372666792;1.33961822997390;1.39351362888330;1.44804657406263;1.50263792366677;1.55676309120815;1.60995184163654;1.66178759007591;1.71190625721227;1.75999473440383;1.80578901024483;1.84907200861061;1.88967118619395;1.92745593526082;1.96233483485397;1.99425279100032;2.02318810367390;2.04914949537019;2.07217313319581;2.09231967340318;2.10967135433352;2.12432916080049;2.13641008007617;2.14604446685110;2.15337353185143;2.15854696622301;2.16172071134924;2.16305488146682;2.16271184429002;2.16085446285622;2.15764449996646;2.15324118491871;2.14779994071685;2.14147126858580;2.13439978542921;2.12672340882718;2.11857268328286;2.11007024068267;2.10133038732796;2.09245880942025;2.08355238852796;2.07469911832353;2.06597811374567;2.05745970370452;2.04920559849852;2.04126912324167;2.03369550880049;2.02652223200190;2.01977939718900;2.01349015156235;2.00767112714310;2.00233290262235;1.99748047881371;1.99311376189388;1.98922804909600;1.98581451200438;1.98286067308412;1.98035087155867;1.97826671521963;1.97658751521187;1.97529070128035;1.97435221538979;1.97374688203306;1.97344875392562;1.97343143214175;1.97366836008085;1.97413309095925;1.97479952880367;1.97564214317661;1.97663615809176;1.97775771577948;1.97898401613849;1.98029343286166;1.98166560735147;1.98308152164583;1.98452355165810;1.98597550209867;1.98742262448897;1.98885161970578;1.99025062650361;1.99160919745859;1.99291826375962;1.99417009024271;1.99535822202459;1.99647742404227;1.99752361474846;1.99849379514951;1.99938597430348;2.00019909232379;2.00093294185767;2.00158808893121;2.00216579397376;2.00266793375556;2.00309692489384;2.00345564950535;2.00374738350806;2.00397572800150;2.00414454408516;2.00425789140766;2.00431997067571;2.00433507029288;2.00430751724225;2.00424163227636;2.00414168943040;2.00401187983229;2.00385627974481;2.00367882274088;2.00348327588323;2.00327321975395;2.00305203215731;2.00282287530139;2.00258868624921;2.00235217041915;2.00211579790621;2.00188180239070;2.00165218239844;2.00142870467687;2.00121290945345;2.00100611734734;2.00080943771135;2.00062377818864;2.00044985527777;2.00028820570979;2.00013919845171;2.00000304716285;1.99987982294240;1.99976946721938;1.99967180464875;1.99958655589067;1.99951335016234;1.99945173746494;1.99940120040004;1.99936116550256;1.99933101402817;1.99931009214483;1.99929772048799;1.99929320304933;1.99929583537789;1.99930491208103;1.99931973362062;1.99933961240676;1.99936387819811;1.99939188282336;1.99942300424353;1.99945664997934;1.99949225993132;1.99952930862374;1.99956730690582;1.99960580314572;1.99964438395411;1.99968267447544;1.99972033828497;1.99975707693034];
cmd=[1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2;2];
le               = length(data);
h_start          = cmd(1); 
flag_start       = 0;
count_steady     = 0;
index_steady     = 0;
index_overstart  = 0;
h_end            = -1;
%% 判是否收敛,确定稳态值
for i = 1:(le-7)
    convergence_flag = 0;% 是否收敛的标志
    if (cmd(i) > h_start) && (flag_start == 0)
        index_overstart = i;% 记录阶跃开始的标签
        flag_start = 1;% 第一次阶跃开始了
    end
    % 判断末尾是否进入收敛区
    if data(i) > h_start
        difference = abs((data(i)-data(i+4))/data(i));
        if difference <= 0.0002% 该点稳定,疑似进入收敛区
            k = 1;
            for j = i:(i+3) % 该点之后的3点能否都保持稳定
                error(k) = abs((data(j)-data(j+4))/data(j));
                k = k+1;
            end
            for k = 1:4
                if error(k) > 0.0002 % 不能保持稳定
                    convergence_flag = 0;% 未进入收敛区
                    break;% 终止执行for循环
                else
                    convergence_flag = convergence_flag + 1;% 计算稳定点数
                end
            end
        end
        if convergence_flag == 4 % 该点之后的3点都保持稳定,可确定进入收敛区,存在超调
            if convergence_flag_before == 4
                count_steady = count_steady;
            else
                count_steady   = count_steady + 1; % 计算有几个收敛区
                if count_steady == 2
                    index_steady = i;% 记录进入终段收敛状态的标签
                    h_end        = data(i);% 取第一个收敛点的高度为稳态值               
                end
            end
        end
        convergence_flag_before = convergence_flag;% 记录上一步的flag,避免重复计数收敛区
    end
end

就此,我们就截取出了一段需要研究的阶跃数据。

接下来首先可以求取稳态增量和剩余振荡次数。将“穿越稳态值”的标准定义为当前数据与稳态值的差占稳态增量的比低于0.0003(可根据data的实际情况调整)

%% 求稳态增量&剩余振荡次数
flag_steady      = 0;   
count            = 0;
steadyincrease = abs(h_start - h_end);% 求稳态增量     
if count_steady > 1
    flag_steady = 1;% 有多于1个收敛区,意味着有有意义的阶跃数据
    k           = 1;
    le1         = index_steady - index_overstart + 1;% 求阶跃数据长度
    sigma       = zeros(1,le1);
    for i = index_overstart:index_steady
        sigma(k) = abs(data(i)-h_end)/steadyincrease;% 当前数据与稳态值的差占稳态增量的比
        if sigma(k) <= 0.0003
            count = count + 1;% 0~ts内穿越稳态值次数+1
        end
        k = k+1;
    end     
    oscil = floor(count/2);% 向下取整即为剩余振荡次数
else
    flag_steady = 0;% 没有有意义的阶跃数据
end

接下来可以基于稳态增量和稳态值,求取超调量。

%% 求超调
overshoot_flag = 0;% 用来标志是否存在超调
if count_steady > 1
    k      = 1;
    le1    = index_steady - index_overstart + 1;
    sigma  = zeros(1,le1);
    for i = index_overstart:index_steady
        sigma(k) = (data(i)-h_end)/steadyincrease;% 求每一步长的差/稳态增量
        if sigma(k)>0
            overshoot_flag = 1;% 存在超调
        end     
        k = k+1;
    end
    if overshoot_flag == 1
        overshoot = max(sigma);
    else
        overshoot = 0;
    end
else
    flag_steady = 0;% 没有有意义的阶跃数据
end

接下来可以基于稳态值求取稳态误差。

%% 求稳态误差
h_endcmd = cmd(le);
if count_steady > 1
    es = abs(h_endcmd - h_end)/steadyincrease;
else
    flag_steady = 0;% 没有有意义的阶跃数据
end

最终运行结果:

本组数据存在有意义的阶跃区间,开始于i=140,结束于i=274;

阶跃开始值为1,稳态值为h_end = 1.999879822942400,稳态增量为steadyincrease = 0.999879822942400;

剩余振荡次数为oscil = 1,超调量为overshoot = 0.163194670779770,稳态误差为es = 1.201915018610771e-04。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在MATLAB中绘制阶跃响应曲线,可以使用`step`函数。`step`函数可以计算并绘制线性时不变系统的阶跃响应曲线。 首先,确保MATLAB环境已经启动。 下面是一个简单的示例代码,展示如何使用`step`函数绘制阶跃响应曲线: ```matlab % 创建一个系统 num = [1]; % 系统的分子多项式系数 den = [1, 2, 1]; % 系统的分母多项式系数 sys = tf(num, den); % 创建传输函数模型 % 绘制阶跃响应曲线 step(sys); ``` 在上面的代码中,我们首先定义了一个系统的传输函数,然后使用`step`函数来绘制该系统的阶跃响应曲线。 执行代码后,MATLAB会绘制出阶跃响应曲线图。你可以通过缩放图像、添加图例等方式来优化图像的显示。 需要注意的是,此示例中的系统是一个二阶系统,你可以根据需要修改`num`和`den`来定义不同的系统。 ### 回答2: matlab阶跃响应曲线的代码如下: ```matlab % 设置系统参数 num = [1]; % 分子多项式系数 den = [1, 2, 1]; % 分母多项式系数 % 创建传递函数 sys = tf(num, den); % 绘制阶跃响应曲线 step(sys); % 添加图表标题和坐标轴标签 title('阶跃响应曲线'); xlabel('时间'); ylabel('输出信号'); ``` 以上代码首先定义了系统的传递函数,通过给定的分子多项式系数和分母多项式系数。然后,使用`tf`函数创建了系统的传递函数模型。接下来,使用`step`函数绘制了阶跃响应曲线。最后,使用`title`函数添加了图表标题,使用`xlabel`和`ylabel`函数添加了坐标轴标签。 使用这段代码,你可以根据需要修改系统的分子和分母多项式系数,以绘制不同系统的阶跃响应曲线。 ### 回答3: 要画阶跃响应曲线,首先要明确系统的传递函数。假设系统的传递函数为H(s),则阶跃响应的拉普拉斯变换表达式为1/s*H(s)。下面是在Matlab中绘制阶跃响应曲线的代码: 1. 定义系统的传递函数H(s): ``` num = [1]; % 分子多项式系数 den = [1, 2, 1]; % 分母多项式系数 H = tf(num, den); % 创建传递函数对象 ``` 这里假设系统的传递函数为1/(s^2 + 2s + 1),即二阶惯性系统,分子多项式的系数为1,分母多项式的系数为[1, 2, 1]。 2. 绘制阶跃响应曲线: ``` t = 0:0.1:10; % 时间范围从0到10,步长为0.1 u = ones(size(t)); % 初始阶跃输入 [y, t] = lsim(H, u, t); % 使用lsim函数获取阶跃响应 plot(t, y); % 绘制阶跃响应曲线 xlabel('时间'); % 设置x轴标签 ylabel('响应'); % 设置y轴标签 title('阶跃响应曲线'); % 设置标题 ``` 在以上代码中,首先创建了时间数组t,然后定义了一个与t相同大小的输入阶跃信号u。通过lsim函数计算得到系统的阶跃响应y,最后使用plot函数绘制阶跃响应曲线。 以上就是在Matlab中画阶跃响应曲线的代码,你可以根据自己的系统传递函数进行修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值