matlab控制系统仿真教程答案唐(matlab求传递函数的极点)

简单的控制算法,没有用Simulink工具,直接写代码。主要点就是分清楚仿真环境和需要验证的算法。也就是说首先要数学建模,建立一个‘环境’,用来模拟实际环境。然后写自己的控制算法。最后把算法用到‘环境’上,就是在仿真了。全部代码如下:%Thesimulationofthestablependulumcart%usingPID,poleplacementandLQRclc;clea…

大家好,又见面了,我是你们的朋友全栈君。

简单的控制算法,没有用Simulink工具,直接写代码。主要点就是分清楚仿真环境和需要验证的算法。也就是说首先要数学建模,建立一个‘环境’,用来模拟实际环境。然后写自己的控制算法。最后把算法用到‘环境’上,就是在仿真了。

677d4b0e029c

677d4b0e029c

677d4b0e029c

677d4b0e029c

677d4b0e029c

全部代码如下:

%The simulation of the stable pendulum cart

%using PID,poleplacement and LQR

clc;

clear;

%parameter

m = 0.09; % The pendulum mass: m = 0.09kg;

M = 1.52; % The mobile cart mass: M = 1.52kg;

L = 0.24; % The 1/2 length of the pendulum: L = 0.24m;

I = m*(2*L)*(2*L)/12; % The inertia of the pendulum: I = m*(2L)^2/12;

Ts = 0.015; % The sampling time;

g = 9.81; % The gravity accelation: g = 9.81 N/m;

%modeling

temp_den = (m+M)*I+m*M*L*L;

i = m*g*L*(m+M)/temp_den;

j = -m*m*L*L*g/temp_den;

A = [0 1 0 0;

i 0 0 0;

0 0 0 1;

j 0 0 0];

B = [0 -m*L/temp_den 0 (I+m*L*L)/temp_den]’;

C = [1 0 0 0;

0 0 1 0];

D =[0 0]’;

[G H]=c2d(A,B,Ts);

x0=[-0.2 0 0.2 0]’;

t=0:Ts:3;

u=zeros(size(t));

%without control

y0=dlsim(A,B,C,D,u,x0);

subplot(4,1,1);

plot(t,y0);

axis([0 3 -50 50]);

xlabel(‘t’);

ylabel(‘θ&x’);

title(‘未加控制’);

legend(‘θ’,’x’);

%poleplacement

P=[0.9277,-0.9489,0.9632,0.9704];

K=place(G,H,P);

G1=G-H*K;

y1=dlsim(G1,H,C,D,u,x0);

subplot(4,1,2);

plot(t,y1);

xlabel(‘t’);

ylabel(‘x&θ’);

title(‘极点配置’);

legend(‘x’,’θ’);

%LQR

Q=[200 0 0 0;

0 1 0 0;

0 0 200 0;

0 0 0 1];

R=0.1;

K=dlqr(G,H,Q,R)

G2=G-H*K;

y2=dlsim(G2,H,C,D,u,x0);

subplot(4,1,3);

plot(t,y2);

xlabel(‘t’);

ylabel(‘x&θ’);

title(‘LQR’);

legend(‘x’,’θ’);

%PID

y3=zeros(4,size(t,2));

sumx0=[0 0 0 0]’;

u=0;

kp1=150;

ki1=3;

kd1=1000;

kp2=80;

ki2=1;

kd2=1500;

for i=1:size(t,2)

lastx0=x0;

x0=G*x0+H*u;

Dx0=x0-lastx0;

sumx0=sumx0+x0;

u=kp1*x0(1)+ki1*sumx0(1)+kd1*Dx0(1)+kp2*x0(3)+ki2*sumx0(3)+kd2*Dx0(3);

y3(:,i)=x0;

end

y3=[y3(1,:);y3(3,:)];

subplot(4,1,4);

plot(t,y3);

xlabel(‘t’);

ylabel(‘x&θ’);

title(‘PID’);

legend(‘x’,’θ’);

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/128781.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号