2007年4月25日 星期三

作業七

我本週有上課。

1.
角加速度alpha(t)=alpha (rad/s^2)
角速度omega(t)=omega(0)+alpha*t (rad/s)
角度theta(t)=theta(0)+omega(0)*t+(1/2)*alpha*t^2 (rad)
桿長rho=[19 24 14] (cm) (b94202029,9+10=19)

由上列方程式可知當t=[1 2 3 4 5]秒時:
tdd=[ [0 0.1 0.2] [0 0.1 0.2] [0 0.1 0.2] [0 0.1 0.2] [0 0.1 0.2] ]
td=[ [0.2 0.6 0.5] [0.2 0.7 0.7] [0.2 0.8 0.9] [0.2 0.9 1.1] [0.2 1.0 1.3] ]
theta=[ [0.2 0.55 0.4] [0.4 1.2 1] [0.6 1.95 1.8] [0.8 2.8 2.8] [1.0 3.75 4] ] * (180/pi)
(warning:程式要求theta為角度、td與tdd為弳度量)

輸入至dyad程式後可得:vec(1,1)為端桿頂端位置向量的長度,vec(2,1)為端桿頂端位置向量的角度。由位置向量的長度角度可決定端桿頂端的位置。

以下為程式碼:
-------------------------------------------------------------------------------------------------
% 為製作包含從t=1到t=5的資料的tdd、td、theta矩陣,必須製造暫時的矩陣
rho=[19 24 14];
alpha=[0, 0.1, 0.2];
omega=[0.2, 0.5, 0.3];
t=[1; 2; 3; 4; 5];
x=[1; 1; 1; 1; 1];

% 利用column*row可以變成大矩陣的性質,做出包含從t=1到t=5的資料的tdd、td、theta矩陣
tdd=[alpha;alpha;alpha;alpha;alpha];
td=x*omega+t*alpha;
theta=t*omega+0.5*(t.*t)*alpha;

% theta必須要用角度表示
theta=theta*(180/pi);

% 執行dyad,找出各時間的vec(1,1)和vec(2,1)
[vecAt1sec,dyadataAt1sec]=dyad(rho,theta(1,:),td(1,:),tdd(1,:))
[vecAt2sec,dyadataAt2sec]=dyad(rho,theta(2,:),td(2,:),tdd(2,:))
[vecAt3sec,dyadataAt3sec]=dyad(rho,theta(3,:),td(3,:),tdd(3,:))
[vecAt4sec,dyadataAt4sec]=dyad(rho,theta(4,:),td(4,:),tdd(4,:))
[vecAt5sec,dyadataAt5sec]=dyad(rho,theta(5,:),td(5,:),tdd(5,:))
-------------------------------------------------------------------------------------------------
執行結果:

vecAt1sec =

56.3521 25.0016 13.7512
22.7270 116.1214 -174.1359


dyadataAt1sec =

18.6213 + 3.7747i -0.7549 + 3.7243i -0.7449 - 0.1510i
20.4606 +12.5445i -7.5267 +12.2764i -8.6203 - 2.4700i
12.8949 + 5.4519i -2.7259 + 6.4474i -4.3141 + 1.2160i


vecAt2sec =

53.5358 29.4255 19.7579
50.9038 149.6174 -132.1570


dyadataAt2sec =

17.5002 + 7.3989i -1.4798 + 3.5000i -0.7000 - 0.2960i
8.6966 +22.3689i -15.6583 + 6.0876i -6.4982 -10.0911i
7.5642 +11.7806i -8.2464 + 5.2950i -6.0626 - 4.2596i


vecAt3sec =

46.7970 32.9682 27.3973
85.5681 -168.0365 -84.3886


dyadataAt3sec =

15.6814 +10.7282i -2.1456 + 3.1363i -0.6273 - 0.4291i
-8.8843 +22.2950i -17.8360 - 7.1075i 3.4565 -15.1573i
-3.1808 +13.6339i -12.2705 - 2.8627i -0.1503 -11.6796i


vecAt4sec =

34.6999 35.5868 36.5417
130.5678 -115.1438 -28.8492


dyadataAt4sec =

13.2374 +13.6298i -2.7260 + 2.6475i -0.5295 - 0.5452i
-22.6133 + 8.0397i -7.2357 -20.3520i 17.5128 - 8.7735i
-13.1911 + 4.6898i -5.1588 -14.5102i 15.0233 - 8.3129i


vecAt5sec =

20.3585 38.2439 46.9169
-155.8638 -50.5629 35.4094


dyadataAt5sec =

10.2657 +15.9879i -3.1976 + 2.0531i -0.4106 - 0.6395i
-19.6934 -13.7175i 13.7175 -19.6934i 21.0652 +11.7481i
-9.1510 -10.5952i 13.7738 -11.8963i 17.5843 +16.0757i
-------------------------------------------------------------------------------------------------
在原程式碼後面再執行dyad_draw程式,以得到各時刻桿件圖形:

dyad_draw(rho,theta(1,:),td(1,:),tdd(1,:))

dyad_draw(rho,theta(2,:),td(2,:),tdd(2,:))

dyad_draw(rho,theta(3,:),td(3,:),tdd(3,:))

dyad_draw(rho,theta(4,:),td(4,:),tdd(4,:))

dyad_draw(rho,theta(5,:),td(5,:),tdd(5,:))
------------------------------------------------------------------------------------------------
2.
以下為程式碼:

% 角加速度alpha(t)=alpha (rad/s^2)
% 角速度omega(t)=omega(0)+alpha*t (rad/s)
% 桿長r1=19;r2=24;r3=14; (cm) (b94202029,9+10=19)
% 速度v(t)=r*omega(t)
% 加速度a(t)=( r*(alpha(t))^2 + (r*omega(t)^2)^2 )^0.5
% 以上所有物理量都是在該桿的joint上所看到的
% 若站在地面看整個桿件的運動,則:(該桿頂端的某物理量)=(sigma)(該桿之前所有joint的物理量)

% 將0~5秒劃分成100等分
t=0:0.05:5;
% 角速度與角加速度
alpha1=0*t;
alpha2=0.1*t;
alpha3=0.2*t;
omega1=0.2+0*t;
omega2=0.5+0.1*t;
omega3=0.3+0.2*t;
% 桿長
r1=19;r2=24;r3=14;


% 第二旋轉結的速度加速度
v2=r1.*omega1;
a2=( r1.*(alpha1).^2 + (r1.*omega1.^2).^2 ).^0.5;
% 第三旋轉結的速度加速度
v3=v2+r2.*omega2;
a3=a2+( r2.*(alpha2).^2 + (r2.*omega2.^2).^2 ).^0.5;
% 端桿頂端的速度加速度
v4=v3+r3.*omega3;
a4=a1+( r3.*(alpha3).^2 + (r3.*omega3.^2).^2 ).^0.5;

% 繪圖
line(t,v2,'color','k'); % v2為黑線
line(t,a2,'color','B'); % a2為藍線
line(t,v3,'color','C'); % v3為藍綠線
line(t,a3,'color','G'); % a3為綠線
line(t,v4,'color','M'); % v4為紫紅線
line(t,a4,'color','R'); % a4為紅線

% 標註
xlabel('time(sec)');
ylabel('velocity(cm/sec) or acceleration(cm/sec^2)');
-------------------------------------------------------------------------------------------------
3.
以下為程式碼:


function animationOfDyad

% alpha=[0, 0.1, 0.2];
% omega=[0.2, 0.5, 0.3];

rho=[19 24 14];

% 將0~5秒劃分成100等分
for t=0:0.05:5

% 設定角加速度、角速度、角度函數
tdd=[0, 0.1, 0.2];
td=[0.2, 0.5, 0.3]+[0*t, 0.1*t, 0.2*t];
theta=[0.2*t, 0.5*t, 0.3*t]+0.5*[0*(t^2), 0.1*(t^2), 0.2*(t^2)];
% theta必須要用角度表示
theta=theta*(180/pi);

% 繪圖
dyad_draw(rho,theta,td,tdd);
pause(0.05);

end



-------------------------------------------------------------------------------------------------
此題之所以能在短短幾行內就結束,是因為老師的dyad_draw檔案裡面用了一個叫做clf的指令。clf可以將figure上的所有圖案全部清除,故每次執行dyad_draw的時候,前一瞬間的圖案就被抹除,然後被新圖案取代。這樣一來,只要隔一小段時間就執行一次dyad_draw,就可以達到動畫效果。

2 則留言:

不留白老人 提到...

做得很好,只是動畫好像不順暢,時間區段應設更小一些

張哲輔 提到...

To老師:
我的動畫時間區段是設定成跟程式碼內敘述的一樣。原本動畫應該更快一些,但因為電腦配備不佳,跑動畫的速度比設定的還要慢,所以用camstudio抓下來的動畫就比較慢,請老師見諒!