国产aaaa级全身裸体精油片_337p人体粉嫩久久久红粉影视_一区中文字幕在线观看_国产亚洲精品一区二区_欧美裸体男粗大1609_午夜亚洲激情电影av_黄色小说入口_日本精品久久久久中文字幕_少妇思春三a级_亚洲视频自拍偷拍

首頁 > 化工知識 > MATLAB非線性可視化(引3)多擺模型

MATLAB非線性可視化(引3)多擺模型

時間:2021-10-13 來源: 瀏覽:

MATLAB非線性可視化(引3)多擺模型

原創(chuàng) hyhhyh21 matlab愛好者
matlab愛好者

matlabaihaozhe

學(xué)matlab編程就關(guān)注matlab愛好者!

收錄于話題

接著前面的Mandelbrot集和牛頓迭代繼續(xù)介紹一個非線性模型:多擺。如果只看到前面的兩個引子,肯定會有疑問:非線性只是一種通過迭代產(chǎn)生的數(shù)學(xué)游戲嗎?
事實上,非線性存在于物理與工程中的各個領(lǐng)域。在機械中,就存在著大量的非線性現(xiàn)象。通過雙擺和三擺的例子,來感受到一個小的擾動,隨著時間的推移,到最終會帶來多大的變化。
這里不涉及到計算多體動力學(xué)和SimMechanics,只采用簡單的拉格朗日方法建立運動模型。詳細可見參考資料[1]。

雙擺方程可以用兩個擺的角度進行描述,其運動的角速度可以用角動量來描述。這樣,我們就有了雙擺的4個方程:

這個方程組為一個4階的常微分方程,利用經(jīng)典的龍格庫塔RK方法,就可以進行求解。

隨著時間的推移,雙擺的運動越來越無序,變得難以琢磨。
如果把很多雙擺在不同角度同時釋放,可以得到如下的圖像:

可以看到越靠上的雙擺運動越混亂,靠近下方的雙擺運動幾乎像單擺一樣。
對于三擺來說,方程也可以通過拉格朗日方法建立,但是結(jié)果會復(fù)雜一些。同樣,我們還是定義變量為三個角度和三個角動量。這里方程比較繁瑣,就直接放在程序里了。
最終的效果圖如下:

同樣,將多個三擺在不同角度同時釋放的結(jié)果如下圖:

當(dāng)然,根據(jù)方程還可以求得更多階的擺,然而計算量會越來越大。所以對于更高階的擺,就不適用于直接求解出方程的方法了。
下面是雙擺的代碼。用到了自己編寫的龍格庫塔方法。

%雙擺 %4階RK求解 clear clc close all %輸入 N=2;%雙擺 m=1; l=1; g=9.8; Input=[N,m,l,g]; %初始條件和時間設(shè)置 y0=[pi/2;pi/2;0;0];%這里全部是弧度值。分別代表[擺1與垂面夾角,擺2與垂面夾角,擺1角動量,擺2角動量] h=1e-2; x0=0:h:20; %代入到ODE求解器中 [y1,Output]=ODE_RK4_hyh(x0,h,y0,Input); %提取出角度 tN=size(y1,2); th1=y1(1,:); th2=y1(2,:); %計算出關(guān)節(jié)坐標 CX1_A=zeros(1,tN); CX1_B=CX1_A+l*sin(th1); CY1_A=zeros(1,tN); CY1_B=CY1_A-l*cos(th1); CX2_A=CX1_B; CX2_B=CX2_A+l*sin(th2); CY2_A=CY1_B; CY2_B=CY2_A-l*cos(th2); %繪圖 n=1; figure() set(gcf,’position’,[488 342 400 300]) for k=1:4:1160 clf xlim([-2,2]) ylim([-2,2]) hold on %繪制擺 plot([CX1_A(k),CX1_B(k)],[CY1_A(k),CY1_B(k)],’color’,’k’,’LineWidth’,1.5) plot([CX2_A(k),CX2_B(k)],[CY2_A(k),CY2_B(k)],’color’,’k’,’LineWidth’,1.5) %繪制軌線 if k>200 n=n+1; end Nm=k-n+1; %軌跡1 F_color=[1,0,0]; F_color=F_color*0.6+[1,1,1]*0.4*0.999; cdata=[linspace(1,F_color(1),Nm+1)’,linspace(1,F_color(2),Nm+1)’,linspace(1,F_color(3),Nm+1)’]; cdata=reshape(cdata,Nm+1,1,3); if k>3 patch([CX1_B(n:k),NaN],[CY1_B(n:k),NaN],1:Nm+1,’EdgeColor’,’interp’,’Marker’,’none’,... ’MarkerFaceColor’,’flat’,’CData’,cdata,’LineWidth’,1.5); end %軌跡2 F_color=[0,0,1]; F_color=F_color*0.6+[1,1,1]*0.4*0.999; cdata=[linspace(1,F_color(1),Nm+1)’,linspace(1,F_color(2),Nm+1)’,linspace(1,F_color(3),Nm+1)’]; cdata=reshape(cdata,Nm+1,1,3); if k>3 patch([CX2_B(n:k),NaN],[CY2_B(n:k),NaN],1:Nm+1,’EdgeColor’,’interp’,’Marker’,’none’,... ’MarkerFaceColor’,’flat’,’CData’,cdata,’LineWidth’,1.5); end hold off pause(0.05) F=getframe(gca); I=frame2im(F);     [I,map]=rgb2ind(I,20); end function [y,Output]=ODE_RK4_hyh(x,h,y0,Input) %4階RK方法 %h間隔為常數(shù)的算法 y=zeros(size(y0,1),size(x,2)); y(:,1)=y0; for ii=1:length(x)-1 yn=y(:,ii); xn=x(ii); K1=Fdydx(xn ,yn ,Input); K2=Fdydx(xn+h/2,yn+h/2*K1,Input); K3=Fdydx(xn+h/2,yn+h/2*K2,Input); K4=Fdydx(xn+h ,yn+h*K3 ,Input); y(:,ii+1)=yn+h/6*(K1+2*K2+2*K3+K4); end Output=[]; end function dydx=Fdydx(x,y,Input) %將原方程整理為dy/dx=F(y,x)的形式 %輸入Input整理 m=Input(2); l=Input(3); g=Input(4); %輸入 th1=y(1);%角度1 th2=y(2);%角度2 pth1=y(3);%角動量1 pth2=y(4);%角動量2 %利用拉格朗日法得到的方程 M=l^2*m*(-16 + 9*cos(th1 - th2)^2); dth1 = -6*(2*pth1 - 3*pth2*cos(th1 - th2))/M; dth2 = -6*(8*pth2 - 3*pth1*cos(th1 - th2))/M; dpth1=-0.5*l*m*(3*g*sin(th1)+dth1*dth2*l*sin(th1-th2)); dpth2=0.5*l*m*(dth1*dth2*l*sin(th1-th2)-g*sin(th2)); %整理輸出 dydx=zeros(4,1); dydx(1)=dth1; dydx(2)=dth2; dydx(3)=dpth1; dydx(4)=dpth2; end

再下面是三擺的程序。方程和雙擺類似,但是由于增加了一個擺導(dǎo)致代碼更長。

%三擺 %4階RK求解 clear clc close all %輸入 N=3;%雙擺 m=1; l=1; g=9.8; Input=[N,m,l,g]; %初始條件和時間設(shè)置 y0=[1/2*pi;1/2*pi;1/2*pi;0;0;0];%這里全部是弧度值。分別代表[擺1與垂面夾角,擺2與垂面夾角,擺1角動量,擺2角動量] h=1e-2; x0=0:h:20; %代入到ODE求解器中 [y1,Output]=ODE_RK4_hyh(x0,h,y0,Input); %提取出角度 tN=size(y1,2); th1=y1(1,:); th2=y1(2,:); th3=y1(3,:); %計算出關(guān)節(jié)坐標 CX1_A=zeros(1,tN); CX1_B=CX1_A+l*sin(th1); CY1_A=zeros(1,tN); CY1_B=CY1_A-l*cos(th1); CX2_A=CX1_B; CX2_B=CX2_A+l*sin(th2); CY2_A=CY1_B; CY2_B=CY2_A-l*cos(th2); CX3_A=CX2_B; CX3_B=CX3_A+l*sin(th3); CY3_A=CY2_B; CY3_B=CY3_A-l*cos(th3); %繪圖 n=1; figure() set(gcf,’position’,[488 342 400 300]) for k=1:4:1100 clf xlim([-3,3]) ylim([-3,3]) hold on plot([CX1_A(k),CX1_B(k)],[CY1_A(k),CY1_B(k)],’color’,’k’,’linewidth’,1) plot([CX2_A(k),CX2_B(k)],[CY2_A(k),CY2_B(k)],’color’,’k’,’linewidth’,1) plot([CX3_A(k),CX3_B(k)],[CY3_A(k),CY3_B(k)],’color’,’k’,’linewidth’,1) hold off %繪制軌線 if k>200 n=n+1; end Nm=k-n+1; %軌跡1 F_color=[1,0,0]; F_color=F_color*0.6+[1,1,1]*0.4*0.999; cdata=[linspace(1,F_color(1),Nm+1)’,linspace(1,F_color(2),Nm+1)’,linspace(1,F_color(3),Nm+1)’]; cdata=reshape(cdata,Nm+1,1,3); if k>3 patch([CX1_B(n:k),NaN],[CY1_B(n:k),NaN],1:Nm+1,’EdgeColor’,’interp’,’Marker’,’none’,... ’MarkerFaceColor’,’flat’,’CData’,cdata,’LineWidth’,1); end %軌跡2 F_color=[0,0,1]; F_color=F_color*0.6+[1,1,1]*0.4*0.999; cdata=[linspace(1,F_color(1),Nm+1)’,linspace(1,F_color(2),Nm+1)’,linspace(1,F_color(3),Nm+1)’]; cdata=reshape(cdata,Nm+1,1,3); if k>3 patch([CX2_B(n:k),NaN],[CY2_B(n:k),NaN],1:Nm+1,’EdgeColor’,’interp’,’Marker’,’none’,... ’MarkerFaceColor’,’flat’,’CData’,cdata,’LineWidth’,1); end %軌跡3 F_color=[0,1,0]; F_color=F_color*0.6+[1,1,1]*0.4*0.999; cdata=[linspace(1,F_color(1),Nm+1)’,linspace(1,F_color(2),Nm+1)’,linspace(1,F_color(3),Nm+1)’]; cdata=reshape(cdata,Nm+1,1,3); if k>3 patch([CX3_B(n:k),NaN],[CY3_B(n:k),NaN],1:Nm+1,’EdgeColor’,’interp’,’Marker’,’none’,... ’MarkerFaceColor’,’flat’,’CData’,cdata,’LineWidth’,1); end     pause(0.02) end function [y,Output]=ODE_RK4_hyh(x,h,y0,Input) %4階RK方法 %h間隔為常數(shù)的算法 y=zeros(size(y0,1),size(x,2)); y(:,1)=y0; for ii=1:length(x)-1 yn=y(:,ii); xn=x(ii); K1=Fdydx(xn ,yn ,Input); K2=Fdydx(xn+h/2,yn+h/2*K1,Input); K3=Fdydx(xn+h/2,yn+h/2*K2,Input); K4=Fdydx(xn+h ,yn+h*K3 ,Input); y(:,ii+1)=yn+h/6*(K1+2*K2+2*K3+K4); end Output=[]; end function dydx=Fdydx(x,y,Input) %將原方程整理為dy/dx=F(y,x)的形式 %三擺方程 %輸入Input整理 m=Input(2); l=Input(3); g=Input(4); %輸入 th=y(1:3);%角度1 pth=y(4:6);%角動量1 %利用拉格朗日法得到的方程 M=l^2*m*(-169+81*cos(2*(th(1)-th(2)))-9*cos(2*(th(1)-th(3)))+45*cos(2*(th(2)-th(3)))); dth1=(6*(-23*pth(1)+9*cos(2*(th(2)-th(3)))*pth(1)+27*cos(th(1)-th(2))*pth(2)-9*cos(th(1)+th(2)-2*th(3))*pth(2)+21*cos(th(1)-th(3))*pth(3)-27*cos(th(1)-2*th(2)+th(3))*pth(3)))/M; dth2=(6*(27*cos(th(1)-th(2))*pth(1)-9*cos(th(1)+th(2)-2*th(3))*pth(1)-47*pth(2)+9*cos(2*(th(1)-th(3)))*pth(2)-27*cos(2*th(1)-th(2)-th(3))*pth(3)+57*cos(th(2)-th(3))*pth(3)))/M; dth3=(6*(21*cos(th(1)-th(3))*pth(1)-27*cos(th(1)-2*th(2)+th(3))*pth(1)-27*cos(2*th(1)-th(2)-th(3))*pth(2)+57*cos(th(2)-th(3))*pth(2)-143*pth(3)+81*cos(2*(th(1)-th(2)))*pth(3)))/M; dth=[dth1;dth2;dth3]; dpth1=-0.5*l*m*(5*g*sin(th(1))+l*dth(1)*(3*dth(2)*sin(th(1)-th(2))+dth(3)*sin(th(1)-th(3)))); dpth2=-0.5*l*m*(-3*l*dth(1)*dth(2)*sin(th(1)-th(2))+3*g*sin(th(2))+l*dth(2)*dth(3)*sin(th(2)-th(3))); dpth3=0.5*l*m*(l*dth(1)*dth(3)*sin(th(1)-th(3))+l*dth(2)*dth(3)*sin(th(2)-th(3))-g*sin(th(3))); %整理輸出 dydx=zeros(6,1); dydx(1)=dth1; dydx(2)=dth2; dydx(3)=dth3; dydx(4)=dpth1; dydx(5)=dpth2; dydx(6)=dpth3; end

參考資料:

[1]https://en.wikipedia.org/wiki/Double_pendulum 

圖片來源:由  在Pixabay上發(fā)布

版權(quán):如無特殊注明,文章轉(zhuǎn)載自網(wǎng)絡(luò),侵權(quán)請聯(lián)系cnmhg168#163.com刪除!文件均為網(wǎng)友上傳,僅供研究和學(xué)習(xí)使用,務(wù)必24小時內(nèi)刪除。
相關(guān)推薦