# 線代作業 ## 作業一 ```ccs= clear all, close all, clc m = 1; M = 5; L = 2; g = -10; d = 1; s = 1; % pendulum up (s=1) A = [0 1 0 0; 0 -d/M -m*g/M 0; 0 0 0 1; 0 -s*d/(M*L) -s*(m+M)*g/(M*L) 0]; B = [0; 1/M; 0; s*1/(M*L)]; Q = [1 0 0 0; 0 1 0 0; 0 0 10 0; 0 0 0 100]; R = .0001; %% det(ctrb(A,B)) %% K = lqr(A,B,Q,R); tspan = 0:.001:15; if(s==-1) y0 = [0; 0; 0; 0]; [t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[4; 0; 0; 0])),tspan,y0); elseif(s==1) y0 = [-3; 0; pi+.47; 0]; % % [t,y] = ode45(@(t,y)((A-B*K)*(y-[0; 0; pi; 0])),tspan,y0); [t,y] = ode45(@(t,y)cartpend(y,m,M,L,g,d,-K*(y-[1; 0; pi; 0])),tspan,y0); else end for k=1:100:length(t) drawcartpend_bw(y(k,:),m,M,L); end ``` ## 作業二 ![](https://i.imgur.com/wuGDgd1.jpg) ## 作業三 ### 初始角度 ``` y0 = [-3; 0; pi+.47; 0]; ``` ### x距離的最大值(程式碼與最大值) ``` a = 1 ; x_dis_1=-1; for a=1:1:length(t) x = y(a,1); if x < x_dis_1 x_dis_1 = x; end end fprintf('x_dis_1 = %d\n',x_dis_1) ``` ![](https://i.imgur.com/eBvoEj7.jpg) ### dx速度的最大值(程式碼與最大值) ``` b = 1 ; xdot_dis_1=-1; for b=1:1:length(t) xdot = y(b,2); if xdot < xdot_dis_1 xdot_dis_1 = xdot; end end fprintf('xdot_dis_1 = %d\n',xdot_dis_1) ``` ![](https://i.imgur.com/iN5Tc3c.jpg) ### theta角度總偏離角度與平衡時間(程式碼與偏離角度還有時間) ``` %平衡時間 for e=1:1:length(t) a1 = y(e,3); t3 = 0; if a1-pi < 0.001 t3 = t(e,1); break; end end fprintf('balance time = %d\n',t3) %偏離角度 theta_dis_1 = pi+.47; for c=1:1:length(t) theta = y(c,3); if theta_dis_1 < theta theta_dis_1 = theta; end end theta_dis_2=(theta_dis_1-pi)*180/pi; fprintf('angle = %d\n',theta_dis_2) ``` ![](https://i.imgur.com/mO8IfqA.jpg) ![](https://i.imgur.com/WYcRYgh.jpg) ### dtheta角速度的最大值(程式碼與最大值) ``` thetadot_dis_1=0; for d=1:1:length(t) thetadot = y(d,4); if thetadot^2 > thetadot_dis_1^2 thetadot_dis_1 = thetadot; end end fprintf('thetadot_dis_1 = %d\n',thetadot_dis_1) ``` ![](https://i.imgur.com/ZqhFoY3.jpg) ### 總結果 ![](https://i.imgur.com/nHAyuib.jpg) ```