「シミュレーション」の版間の差分

500行目: 500行目:
以下のような常微分方程式の数値解をlsode関数で求めるための基本的な手順は次のようになります.
以下のような常微分方程式の数値解をlsode関数で求めるための基本的な手順は次のようになります.


#math(\frac{d \boldsymbol{x}(t)}{dt} = \boldsymbol{f}(\boldsymbol{x}(t), t) \quad , \ \boldsymbol{x}(0) = \boldsymbol{x}_0)
<math>(\frac{d \boldsymbol{x}(t)}{dt} = \boldsymbol{f}(\boldsymbol{x}(t), t) \quad , \ \boldsymbol{x}(0) = \boldsymbol{x}_0</math>


*1. まず,微分方程式を適当な関数名(例えばfnc)でOctaveのユーザ関数として定義します.もし解きたい微分方程式が2階以上なら,関数の引数xと戻り値xdotはそれぞれベクトルになります.
*1. まず,微分方程式を適当な関数名(例えばfnc)でOctaveのユーザ関数として定義します.もし解きたい微分方程式が2階以上なら,関数の引数xと戻り値xdotはそれぞれベクトルになります.
545行目: 545行目:
  ylabel('theta ');
  ylabel('theta ');


なお,このスクリプト例では関数定義の中で質量&math(m);などの定数を定義しています.これらの定数は関数の外側で定義できた方が便利な場合が多いです.通常,関数内部で宣言した変数はローカル変数となり,外部とは名前が同じでも内容は異なるということになってしまうので,グローバルな変数として宣言する必要があります.それにはglobal命令を使います.その際に,関数内部と外部の両方で宣言する必要があるので注意が必要です.
なお,このスクリプト例では関数定義の中で質量<math>m</math>などの定数を定義しています.これらの定数は関数の外側で定義できた方が便利な場合が多いです.通常,関数内部で宣言した変数はローカル変数となり,外部とは名前が同じでも内容は異なるということになってしまうので,グローバルな変数として宣言する必要があります.それにはglobal命令を使います.その際に,関数内部と外部の両方で宣言する必要があるので注意が必要です.


*lsode関数を使った単振り子のシミュレーション2
*lsode関数を使った単振り子のシミュレーション2
572行目: 572行目:
  xlabel('time (s)');
  xlabel('time (s)');
  ylabel('theta ');
  ylabel('theta ');


=== lsode関数による線形システムのシミュレーション ===
=== lsode関数による線形システムのシミュレーション ===