スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


Scilabで床で跳ねるボール

matlab 衝突のシミュレーションで質問された床ではねるボールのシミュレーションをScilabで行いました。

001_2015012510244301d.png
Fig.1: 跳ねるボールのシミュレーション


この問題は、常微分方程式ソルバodeと非線形方程式ソルバfsolveの二つを組み合わせることによってシミュレーションすることができます。


問題設定


高さx0から初速度v0でボールを投げる。ボールは重力加速度gで下方へ引かれ、床に落下する。落下したボールは、反発係数kで上方へ跳ねるとする。

この問題はmatlab 衝突のシミュレーション跳ねるボールのシミュレーションです。今回のエントリでは、この問題をScilabでシミュレーションします。

常微分方程式ソルバ


まず前半部分の放物運動は、常微分方程式ソルバodeを用いて簡単に計算できます。(参考: 常微分方程式タグ)

解くべき連立常微分方程式は以下のようになります。

\frac{\mathrm{d}x}{\mathrm{d}t} = v
\frac{\mathrm{d}v}{\mathrm{d}t} = -g

非線形方程式ソルバ


次に床で跳ねる計算を行います。
床ではねる直前の速度をv-,直後の速度をv+とすると反発係数kを用いて

v+ = - k v-

となります。

前述の常微分方程式を非線形方程式ソルバfsolveを利用して x=0 となる時刻を計算し、それぞれの跳ねるイベントの間の計算を行えば、この問題を解くことができます。

プログラム


結局Scilabスクリプトはball_sce.txtとなりました。

clear;

// *** 計算条件 ***
g = 9.81; // 重力加速度
k = 0.8; // 反発係数
// 時間
ts = 0; // 開始時刻
te = 10; // 終了時刻
// 初期条件
x0 = 10; // 初期位置
v0 = 15; // 初速度

// *** 常微分方程式の定義 ***
function dx = fall(t,x)
dx(1) = x(2); // dx/dt = v
dx(2) = -g; // dv/dt = -g
endfunction

// *** 解くべき非線形方程式 ***
function x = bound(t)
X = ode([x0; v0], ts, t, fall);
x = X(1);
endfunction

// *** メイン ***
// 初期化
tb = ts; // 衝突時刻
X = []; // プロット用の位置と速度
T = []; // プロット用の時間
// 終了時刻まで繰り返し
while tb < te
// 衝突時刻を計算
tb = fsolve(2 * te, bound);
// プロット用の時間ベクトルを作成
if tb > te then
// 終了時刻まで
time = linspace(ts, te);
else
// 衝突時刻まで
time = linspace(ts, tb);
end
T = [T, time];
// プロット用の位置と速度を計算
X = [X, ode([x0; v0], ts, time, fall)];
// 次の繰返しのための初期条件
x0 = 0; // 初期位置
v0 = -k * X(2,$); // 初速度
ts = tb; // 計算開始時刻
end

// *** グラフのプロット ***
// 位置のプロット
subplot(2,1,1);
plot(T, X(1,:),'g');
xgrid(color("gray"));
xlabel("Time");
ylabel("Position");
// 速度のプロット
subplot(2,1,2);
plot(T, X(2,:),'r');
xgrid(color("gray"));
xlabel("Time");
ylabel("Velocity");


関連エントリ




参考URL




付録


このエントリで使用したScilabのシミュレーション用ファイルを添付します。ファイル名末尾の".txt"を削除して、"_"を"."に変更すれば使えるはずです。(参考:ねがてぃぶろぐの付録)


参考文献/使用機器




フィードバック



にほんブログ村 その他趣味ブログ 電子工作へ

 ↑ 電子工作ブログランキング参加中です。1クリックお願いします。


コメント・トラックバックも歓迎です。 ↓      


 ↓ この記事が面白かった方は「拍手」をお願いします。


tag: Scilab 非線形方程式ソルバ 常微分方程式 

comment

Secret

FC2カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRmachikaneyamaScilabKKRPSoC強磁性CPAPICOPアンプecalj状態密度モンテカルロ解析常微分方程式トランジスタodeDOSインターフェースPDS5022定電流スイッチング回路分散関係半導体シェルスクリプトレベルシフト乱数HP6632A可変抵抗トランジスタ技術R6452AI2C温度解析ブレッドボードバンドギャップ確率論反強磁性セミナーバンド構造数値積分偏微分方程式非線形方程式ソルバ熱設計絶縁三端子レギュレータISO-I2CA/DコンバータシュミットトリガフォトカプラカオスPWscfGW近似LM358LEDマフィンティン半径発振回路USB数値微分TL431PC817Cサーボアナログスイッチ直流動作点解析補間カレントミラー74HC4053bzqltyチョッパアンプFFT2ちゃんねる開発環境量子力学単振り子電子負荷VESTAQuantumESPRESSO標準ロジックパラメトリック解析ブラべ格子イジング模型アセンブラLDA基本並進ベクトルBSchSMPTLP621失敗談六方最密充填構造コバルト位相図QSGWGGAスイッチト・キャパシタewidth状態方程式VCAキュリー温度繰り返し最適化仮想結晶近似不規則合金熱伝導gfortran相対論抵抗FETMaximaQuantum_ESPRESSOcygwinランダムウォークラプラス方程式スピン軌道相互作用スレーターポーリング曲線マントルシュレディンガー方程式ZnO自動計測QNAP固有値問題ダイヤモンドデータロガー井戸型ポテンシャルTLP552CIFxcrysdenゼーベック係数熱力学条件分岐MCU最小値UPS格子比熱最大値ガイガー管平均場近似過渡解析Writer509スーパーセルFXA-7020ZR差し込みグラフ第一原理計算テスタ起電力OpenMP三角波ubuntuLM555NE555ブラウン運動詰め回路ハーフメタルawkfsolveUbuntuフェルミ面TLP521トランスMAS830LPGACK1026OPA2277フィルタトレーナーバトルEAGLEノコギリ波負帰還安定性ナイキスト線図MBEP-10LMC6622SC1815CapSenseAACircuitPIC16F785入出力固定スピンモーメントFSMTeX結晶磁気異方性全エネルギーc/a合金multiplotgnuplot非線型方程式ソルバL10構造正規分布等高線ジバニャン方程式ヒストグラム確率論初期値interp1fcc面心立方構造ウィグナーザイツ胞半金属デバイ模型磁気モーメント電荷密度重積分SIC不純物問題擬ポテンシャル状態図cif2cellPWgui二相共存ウルツ鉱構造edeltquantumESPRESSOフォノンリジッドバンド模型スワップ領域BaO岩塩構造ルチル構造マテリアルデザインspecx.fフラクタルマンデルブロ集合キーボードRealforceクーロン散乱三次元疎行列縮退化学反応関数フィッティング最小二乗法Excel直流解析PCTS-110TS-112日本語パラメータ・モデル等価回路モデル文字列ポケモンGO熱拡散方程式HiLAPW両対数グラフ片対数グラフ陰解法Crank-Nicolson法ifort境界条件連立一次方程式グラフの分割軸ラベルヒストグラム不規則局所モーメントスーパーリーグ円周率Gimp凡例線種シンボルトラックボール

最新コメント
リンク

にほんブログ村 その他趣味ブログ 電子工作へ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。