一、题目要求
编程作业2:
根据定理2和莱弗勒算法,采用MATLAB编写从状态空间方程转化为传递函数阵的程序
输入为(A,B,C,D),输出为传递函数矩阵或其系数矩阵
要求:
程序的通用性,任意阶次系统均可检验;语言不限;
二、编程解答
本次解答采用matlab语言编写,原创作品,仿冒必究。
%**************************************************************************%
% 编程作业2:根据定理2和莱弗勒算法,采用MATLAB编写从状态空间方程转化为传递函数阵的程序
% 输入为(A,B,C,D),输出为传递函数矩阵或其系数矩阵
% 要求:程序的通用性,任意阶次系统均可检验;
%**************************************************************************%
% 测试样例
% A=[0 1 0;0 0 1;-5 -25 -4.3]
% B=[0;25;-121]
% C=[1 0 0]
% D=[0]
clc
clear
A=input('输入矩阵A:');
B=input('输入矩阵B:');
C=input('输入矩阵C:');
D=input('输入矩阵D:');
clc
disp("输入矩阵为:")
A
B
C
D
% 参数初始化
[m,n]=size(A);
alpha=zeros(1,m);
R=eye(m);
I=eye(m);
G=zeros(1,m-1);
P=R*A;
E=zeros(1,m);
% 求解传递函数分母系数alpha
for i=1:m
if(i==1)
alpha(1)=-trace(P)/1; %a(1)中存储的是an-1的值
else
R=R*A+alpha(i-1)*I;
P=R*A;
alpha(i)=-trace(P)/i;
end
end
% 求解传递函数分子系数E
for i=1:m-1
if(i==1)
G(1)=C*A*B;
else
T=A^i;
G(i)=C*T*B;
end
end %建立一个C*A^i*B的过渡向量,方便接下来的计算,共有n-1个
for i=1:m
if(i==1)
E(1)=C*B; %e(1)中存储en-1的值
else
K=0;
for j=1:i-2
K=alpha(j)*G(i-1-j)+K;
end
E(i)=G(i-1)+K+alpha(i-1)*C*B;
end
end
one=[1];
alpha_=[one,alpha];
a=size(alpha_,2);
b=size(E,2);
c=b;
for i=1:b
if E(i)==0
c=b-i;
break
end
end
E=[0,E];
G10=alpha_.*D(1);
G1=E+G10;
G2=alpha_;
% 程序运行结果
if c>a
disp("分子阶次大于分母阶次,系统不稳定")
else
disp("输出:")
disp("传递函数分子系数矩阵G1:")
G1
disp("传递函数分母系数矩阵G2:")
G2
E; %输出的序列依次为E(n),E(n-1),E(n-2),...E(1);
alpha_; %输出的序列依次为a(n),a(n-1),a(n-2)...a(1);
end