【レポート課題(7)解答例】

 

1

<プログラム>

A=[0 1; -2 -1];

b=[0;2];

x0=[0; 1];

dt1=0.1;

dt2=0.01;

tf=20;

i=0;

x=x0;

xx1=[];

for t=0:dt1:tf

    i=i+1;

    xx1(:,i)=x;

    u=sin(t);

    dx=(A*x+b*u)*dt1;

    x=x+dx;

end

i=0;

x=x0;

xx2=[];

for t=0:dt2:tf

    i=i+1;

    xx2(:,i)=x;

    u=sin(t);

    dx=(A*x+b*u)*dt2;

    x=x+dx;

end

t1=0:dt1:tf;

t2=0:dt2:tf;

plot(t1,xx1,t2,xx2)

grid('on')

axis([0,20,-2,2]);

legend('x,dt=0.1','dot(x),dt=0.1','x,dt=0.01','dot(x),dt=0.01','location','northwest')

 

<実行結果>

 

2

<プログラム>

f.m

function xdot=f(x)

% xdot = f(x)

global A b u

xdot=A*x+b*u;

ex7_2.m

global A b u

A=[0 1; -2 -1];

b=[0; 2];

x0=[0; 1];

dt1=0.1;

dt2=0.01;

tf=20;

i=0;

x=x0;

xx1=[ ];

for t=0:dt1:tf

    i=i+1;

    xx1(:,i)=x;

    u=sin(t);

    x=runge('f',x,dt1);

end

i=0;

x=x0;

xx2=[ ];

for t=0:dt2:tf

    i=i+1;

    xx2(:,i)=x;

    u=sin(t);

    x=runge('f',x,dt2);

end

t1=0:dt1:tf;

t2=0:dt2:tf;

plot(t1,xx1,t2,xx2)

grid('on')

axis([0,20,-2,2]);

legend('x,dt=0.1','dot(x),dt=0.1','x,dt=0.01','dot(x),dt=0.01','location','northwest')

 

<実行結果>

 

<考察>

オイラー法では,時間刻みが0.1では誤差が大きいが,ルンゲクッタ法では,時間刻みが0.1でも十分な精度で正しい結果が得られた.このことより,ルンゲクッタ法の方が短い計算時間で高精度の解を得ることができると言える.