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強磁性OPアンプPICCPAecaljモンテカルロ解析常微分方程式odeトランジスタ状態密度DOSインターフェース定電流PDS5022スイッチング回路半導体シェルスクリプト乱数レベルシフト分散関係HP6632AI2C可変抵抗トランジスタ技術ブレッドボード温度解析R6452A反強磁性確率論バンドギャップセミナー数値積分熱設計非線形方程式ソルババンド構造絶縁偏微分方程式ISO-I2CLM358マフィンティン半径フォトカプラシュミットトリガカオスLED三端子レギュレータGW近似A/Dコンバータ発振回路PC817C直流動作点解析USBTL431数値微分アナログスイッチカレントミラー74HC4053サーボ量子力学単振り子チョッパアンプ補間2ちゃんねる開発環境bzqltyFFT電子負荷LDAイジング模型BSch基本並進ベクトルブラべ格子パラメトリック解析標準ロジックアセンブラ繰り返し六方最密充填構造SMPコバルトewidthFET仮想結晶近似QSGW不規則合金VCAMaximaGGA熱伝導cygwinスレーターポーリング曲線キュリー温度スイッチト・キャパシタ失敗談ランダムウォークgfortran抵抗相対論位相図スピン軌道相互作用VESTA状態方程式TLP621ラプラス方程式TLP552条件分岐NE555LM555TLP521マントル詰め回路MCUテスタFXA-7020ZR三角波過渡解析ガイガー管自動計測QNAPUPSWriter509ダイヤモンドデータロガー格子比熱熱力学起電力awkブラウン運動スーパーセルUbuntu差し込みグラフ第一原理計算フェルミ面fsolveCIFxcrysden最大値最小値ubuntu最適化平均場近似OpenMP井戸型ポテンシャル固有値問題シュレディンガー方程式TeX2SC1815結晶磁気異方性OPA2277フラクタルFSM固定スピンモーメントc/a非線型方程式ソルバgnuplot全エネルギーfcc初期値マンデルブロ集合縮退正規分布interp1ウィグナーザイツ胞L10構造multiplotフィルタ面心立方構造PGAハーフメタル二相共存ZnOウルツ鉱構造BaOSIC重積分磁気モーメント電荷密度化学反応クーロン散乱岩塩構造CapSenseノコギリ波デバイ模型キーボード半金属フォノンquantumESPRESSOルチル構造スワップ領域リジッドバンド模型edelt合金Realforce軸ラベルグラフの分割凡例線種シンボルMAS830LCK1026LMC662PIC16F785トランス関数フィッティングトラックボールPC等価回路モデルヒストグラムパラメータ・モデル不規則局所モーメント最小二乗法TS-112TS-110直流解析ExcelGimp円周率片対数グラフ両対数グラフspecx.f疎行列三次元ifort文字列不純物問題P-10等高線ジバニャン方程式ヒストグラム確率論マテリアルデザイン入出力境界条件陰解法AACircuit熱拡散方程式HiLAPWMBEEAGLE連立一次方程式ナイキスト線図負帰還安定性Crank-Nicolson法日本語

最新コメント
リンク

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