// "vec3diffeqn.mm"
// Simulation of the following system:
// \dot x = A x
Func void main()
{
Real t0,t1;
Real h,dtsav;
Matrix x0,TC,XC,UC;
void diff_eqs(),link_eqs();
t0 = 0.0; //シミュレーションの開始時刻を t=0 にする
t1 = 10.0; //シミュレーションの終了時刻を t=10 にする
//変更(1)
//初期状態を x(0)=[1.0,0.0,0.0]' にする
x0 = [1.0,0.0,0.0]';
h = 1.0e-3; // シミュレーションの刻を1msecにする
dtsav = 1.0e-2;// データは10msecおきに保存する
print "Now simulating\n";
// Ode()によってシミュレーションを行う
{TC, XC, UC} = Ode(t0,t1,x0,diff_eqs,link_eqs,h,dtsav);
// diff_eqs() は微分方程式を記述する関数
// link_eqs() は複数の微分方程式の関係を記述する関数
// TC: 時間の時系列
// XC: 状態x(t)の時系列
// UC: 入出力ベクトルの時系列
//数値解を表示する.横軸 t, 縦軸 x(t)
mgplot(1,TC,XC);
print TC >> "TC.ode";
print XC >> "XC.ode";
print UC >> "UC.ode";
}
|
|
// diff_eqs() は微分方程式を記述する関数
Func void diff_eqs(DX,t,X,UY)
Real t;
Matrix X,DX,UY;
{
Matrix xp,up,dxp;
//変更(2)
Matrix A;
A = [[0,1,0][0,0,1][-2,-3,-2]];
xp = X; // X はx(t)を表している.
up = UY; //UYは使用しない
dxp = A * xp; //微分方程式
DX = [dxp]; //最後に速度をDXに渡す
}
// link_eqs() は複数の微分方程式の関係を記述する関数
Func void link_eqs(UY,t,X)
Real t;
Matrix UY,X;
{
Matrix xp,up;
xp = X; // X はx(t)を表している.
// 最後にUYに時刻tの値を渡す.
// とりあえずx(t)をいれておく.
UY = [xp];
}
|