スポンサーサイト

上記の広告は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カウンター
カテゴリ
ユーザータグ

LTspiceAkaiKKRScilabmachikaneyamaKKRPSoCCPAOPアンプPIC強磁性モンテカルロ解析常微分方程式トランジスタodeインターフェース状態密度DOSecalj定電流PDS5022スイッチング回路半導体シェルスクリプト乱数レベルシフトHP6632A温度解析ブレッドボードI2CR6452A分散関係トランジスタ技術可変抵抗確率論数値積分反強磁性セミナー非線形方程式ソルバ絶縁バンドギャップ熱設計偏微分方程式バンド構造GW近似カオス三端子レギュレータLEDフォトカプラシュミットトリガISO-I2CA/DコンバータLM358USBカレントミラーTL431マフィンティン半径PC817C数値微分アナログスイッチ発振回路サーボ直流動作点解析74HC40532ちゃんねる標準ロジックチョッパアンプLDAアセンブラFFTbzqltyイジング模型ブラべ格子開発環境補間量子力学電子負荷BSchパラメトリック解析単振り子基本並進ベクトル熱伝導繰り返しGGAMaximaTLP621ewidthSMP相対論抵抗位相図ランダムウォークスピン軌道相互作用六方最密充填構造不規則合金FETコバルト失敗談QSGWcygwinスレーターポーリング曲線スイッチト・キャパシタラプラス方程式gfortranキュリー温度状態方程式条件分岐格子比熱TLP552LM555TLP521三角波NE555過渡解析FXA-7020ZRWriter509テスタ詰め回路MCUマントルダイヤモンドQNAPデータロガーガイガー管自動計測UPS井戸型ポテンシャルawk第一原理計算仮想結晶近似ブラウン運動差し込みグラフ平均場近似fsolve起電力熱力学OpenMPスーパーセル固有値問題最適化最小値VCAシュレディンガー方程式VESTAubuntu最大値面心立方構造PGAOPA2277L10構造非線型方程式ソルバ2SC1815fccフェルミ面等高線ジバニャン方程式ヒストグラム確率論マテリアルデザイン正規分布結晶磁気異方性interp1フィルタ初期値ウィグナーザイツ胞c/aルチル構造岩塩構造スワップ領域リジッドバンド模型edeltBaOウルツ鉱構造重積分SIC二相共存ZnOquantumESPRESSOCapSensegnuplotmultiplot全エネルギー固定スピンモーメントFSM合金ノコギリ波フォノンデバイ模型ハーフメタル半金属TeXifortTS-110不規則局所モーメントTS-112等価回路モデルパラメータ・モデルヒストグラムExcel円周率GimpトラックボールPC直流解析入出力文字列マンデルブロ集合キーボードフラクタル化学反応三次元Realforce縮退日本語最小二乗法関数フィッティング疎行列シンボル線種ナイキスト線図陰解法負帰還安定性熱拡散方程式EAGLECrank-Nicolson法連立一次方程式P-10クーロン散乱Ubuntu境界条件MBEHiLAPW軸ラベルトランスCK1026MAS830L凡例PIC16F785LMC662AACircuit両対数グラフ片対数グラフグラフの分割specx.f

最新コメント
リンク

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