ode45で(1)式のような2階の微分方程式を解くには、連立した1階微分方程式に置き換えて計算します。
つまり、
を下記のように書き換えます。
後は、(3)式と(4)式で示すθとφについての連立微分方程式を解けば、求める解が得られます。
では、g=9.8、L=1、初期条件をt=0で、
さらに解析区間がt=0〜10として、FreeMatで解いてみます。
始めに無名関数で連立微分方程式を定義します。
--> dydt=@(t,y) [y(2);-9.8*sin(y(1))];
ここでy(2)がφ、y(1)がθになります。次に、ode45にdydtと解析区間、初期条件を渡すと、配列yの1列目にθが、2列目にφが返ってくるので、y(:,1)として1列目のデータを指定してプロットすると、図2の結果が得られます。
--> [t,y]=ode45(dydt,[0,10],[pi/4;0]); --> plot(t,y(:,1));grid('on');
カクカクした結果になっていますが、一定の周期となっています。これは、FreeMatのOde45が分割幅を比較的大きめにとるためです。参考までにMATLABで計算した結果を図3に示します。
カクカクした結果では見かけがあまりよくないので、解析区間を小さくして、区間の最後の結果を次の区間の初期条件として計算するようにしたのが、ex405.mです。図4に示す計算結果を見ると、滑らかになっているのが分かります。
dydt=@(t,th) [th(2);-9.8*sin(th(1))]; ts=[0,10];n=20; tspan=linspace(ts(1),ts(2),n); t0=[pi/4;0]; tt=[];theta=[]; for k=1:n-1 [t,th]=ode45(dydt,[tspan(k),tspan(k+1)],t0); t0=th(length(th),:); if(k<n-1) t(length(t))=[];th(length(th),:)=[]; end tt=[tt,t]; theta=[theta;th]; end plot(tt,theta(:,1));grid('on');
Copyright © ITmedia, Inc. All Rights Reserved.