Matlabで衝突のシミュレーションが上手くいかない

このQ&Aのポイント
  • Matlabで簡単な衝突のシミュレーションを行っているが、うまくいかず、解決方法を教えてほしい。
  • Simulinkではなく、自分で作成したmfileからボールの自由落下と地面との衝突のシミュレーションを実現させたい。
  • 現在のプログラムではodeの計算が終わらず、どのようにすればいいのかわからない。
回答を見る
  • ベストアンサー

matlab 衝突のシミュレーション

現在、Matlabで簡単な衝突のシミュレーションを行っていますが、うまくいかず、どなたがご教授ください。 【やりたいこと】 ボールを自由落下させた時の地面との衝突のシミュレーションを、 Simulinkではなく、自分で作成したmfileから実現させたい。 【質問】 以下のプログラムでodeの計算が終わらず、どのようにすればいいのか ご教授ください。 ======================= 【diff_freefall.m】 function dx = diff_freefall(t,x0) g = 9.81; % 重力 k = 1; % 反発係数 A = [0 1; 0 0]; B = [ 0; -g]; % 衝突判定 if x0(1)<=0 && x0(2)<0 x0(1) = 0; x0(2) = -k*x0(2); end dx = A * x0 + B; ======================= ======================= 【simu.m】 Ts = 0; %シミュレーション開始時間 Te = 10; %シミュレーション終了時間 y0 = [10; 15;]; %初期位置、初期速度 [T,Y] = ode45('diff_freefall',[Ts:0.1:Te],y0); subplot(2,1,1); plot(T,Y(:,1),'g'); subplot(2,1,2); plot(T,Y(:,2),'r'); ======================= 【補足】 ・以下のmathworksのサイトのサンプル(simulink版)を、mfileで記述したいです。 <http://jp.mathworks.com/help/simulink/examples/simulation-of-a-bouncing-ball_ja_JP.html> ・すべてのodeのタイプを試しましたが、ずっと終わらない、  もしくは途中でシミュレーションが止まります。 ・衝突した時に、odeの積分の累積値がクリアできていないことが原因だと思うのですが、  クリアする方法がわからず困っています。

質問者が選んだベストアンサー

  • ベストアンサー
  • jjorz
  • ベストアンサー率66% (2/3)
回答No.2

Scilabでやってみました。 Matlabに書き直すのはそんなに難しくないはずです。 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");

dankichi1218
質問者

お礼

理解することができました! コードまで作成していただき、ありがとうございます。

その他の回答 (1)

  • jjorz
  • ベストアンサー率66% (2/3)
回答No.1

衝突ごとに別々にodeを計算してはどうですか? 1. 微分方程式は衝突判定を含めない 2. odeとfsolveを組み合わせて衝突までの計算をする 3. 反発後の速度を初速度として、次の衝突までode+fsolve 4. 2と3を終了時刻まで繰り返し

dankichi1218
質問者

お礼

回答ありがとうございます。 ========================================== >> 衝突ごとに別々にodeを計算してはどうですか? → やりたいことはまさにこれです。 >>1. 微分方程式は衝突判定を含めない  → 理解しました。 >> 2. odeとfsolveを組み合わせて衝突までの計算をする  → "fsolve"、知りませんでした。 >> 3. 反発後の速度を初速度として、次の衝突までode+fsolve  → ”次の衝突までode+fsolve”が理解できていません。 >> 4. 2と3を終了時刻まで繰り返し  → 理解しました。 ========================================== これからfsolveを調べてみますが、odeで微分方程式を計算中、 時間以外の条件で終了させることができるということですよね? 引き続き、がんばります。

関連するQ&A

  • 衝突

    野球のボールを2.5mの高さから床に落としたら、ボールは40cmの高さまではねかえった。 1、このボールの反発係数はいくらか。 2、ボールが床に衝突するとき、ボールは床からいくらの力積を受けたか。ボールの質量145g、重力加速度9.8m/s^2とする。 3、ボールを落としてから最初に床に衝突するまでの時間をt1、ボールを落としてから床に3回衝突するまでの時間をt3とすると、t3/t1はいくらか。 1…0.4 2…1.42N/s 3…2.12 やり方教えてください。

  • 物体の衝突

    大学受験問題です。よろしくお願いします。 水平な地面上のP地点から質量Mの小物体Aを鉛直に打ち上げ、同時にQ地点から質量mの小球Bを打ち上げる。小球Bの打ち上げ角度αとPQ間の距離lは変化させることができる。小物体Aの打ち上げの初速度の大きさをV、小球Bの初速度の大きさをvとする。また、重力加速度の大きさをgとし、空気による抵抗は無視する。 BをAに衝突させるには、角度αをいくらにしなければならないか。sinαを求めよ。 私は、 Aのt秒後のx座標=Bのt秒後のx Aのt秒後のy座標=Bのt秒後のy なので、 (x軸方向) l=v(cosα)t cosα=l/vt-----☆ (y軸方向) Aについて・・・y=Vt-(1/2)gt^2 Bについて・・・y'=vsinαt-(1/2)gt^2 A=Bより V=vsinα sinα=V/v-----★ ☆と★より、 tanα=tV/l sinα=tV/lcosα、としました。 ですが、解答では、 AとBが衝突する場合、A、Bは同じ座標に同じ時刻に到達しなければならない。その場合、鉛直方向について考えれば、同時に投げ出すため、鉛直方向の初速度が同じでなくてはならない。ここで、それぞれの初速度のy成分より、 vsinα=V とあります。 ですが、これだとx軸方向が考慮されていないことになりませんか? 高さは同じでも、x座標が違うかもしれず、それだと衝突しないと思います。 また、答えには、「鉛直方向の初速度が同じでなくてはならない」とありますが、どうしてでしょうか。 以上、よろしくお願い致します。

  • 十進BASICでの衝突プログラミング

    十進ベーシック超初心者です。二次元の箱の中に円を置き、そこで衝突を繰り返すプログラムをつくりたいのですが行き詰っています。 箱の中だけでの衝突は、以下のようにプログラムできたのですが、円にぶつかるときどのようにプログラムをくんで跳ね返させればいいかわかりません。どなたか教えて下さい。 SET WINDOW -20,20,-20,20 DRAW GRID(2,2) PLOT LINES: -10,-10 ;10,-10;10,10;-10,10;-10,-10 DRAW CIRCLE WITH SCALE (2) LET X=-10 LET Y=-10 LET T=0 LET V=4.53574748 LET A=56.654968 LET VX=COS(A) LET VY=SIN(A) 100 PLOT LINES:X,Y ; IF VX>0 THEN LET LX=20-(10+X) END IF IF VX<0 THEN LET LX=20-(10-X) END IF IF VY>0 THEN LET LY=20-(10+Y) END IF IF VY<0 THEN LET LY=20-(10-Y) END IF LET T=MIN(LX/ABS(VX),LY/ABS(VY)) LET X=VX*T+X LET Y=VY*T+Y IF T=LX/ABS(VX) THEN LET VX=-VX END IF IF T=LY/ABS(VY) THEN LET VY=-VY END IF GOTO 100 END

  • 二次元の完全弾性衝突

    二次元での完全弾性衝突について 今、二次元空間内に半径rの剛体円盤1、2があります。 時刻t=0でのそれぞれの位置が(X1,Y1)、(X2,Y2)、速度が(Vx1,Vy1)、(Vx2,Vy2) で与えられています。 この二つが衝突する条件を求めよという問題で衝突直前t=t0の値として (X1',Y1')、(X2',Y2')、(Vx1,Vy1)、(Vx2,Vy2)という値も与えられているのですが どうしたらいいのでしょうか。 また衝突するとき、衝突後の速度V1'、V2'を衝突時の座標(X1,Y1)、(X2,Y2)、 速度V1、V2を使ってあらわすにはどうすればいいのでしょうか。 よろしくお願いします。

  • MATLABで円の投影データの作成

    単位円をx軸に投影するプログラムを作るのですが。 ラジアンをt=(0:100)*2*pi/100で設定し、x=cos(t),y=sin(t)をplot(x,y)で円をプロットするところまではできたのですが。 この後、radonというコマンドを使って投影をするそうなのですが、そっから先に進みません。いろいろなサイトを調べたのですが、radonの使い方が分からないのです。すいません、よろしくいお願いします。

  • simulinkで自由落下をシュミュレーションしたいのですが・・・

    simulinkでボールを自由落下させ,床に衝突し,反発させる運動をシミュレーションしたいのですが,うまくいきません.下向きを負としているので,重力加速度は’-g’とします.床に衝突する直前の速度は’-gt' 反発直後の速度は’gte'(eは反発係数)です.床で反発した際,速度が正になります.速度が正になるとき,’ゼロクロッシング’が検知されシミュレーションができません.またゼロクロッシングの検知を無効にすると,衝突後,床の座標を’0’だととすれば,0付近で細かく振動するグラフになってしまいます. 式は dx/dt=-gt+C1(C1は初速)     x=C1t-1/2gt2+C2(C2は初めの位置) としてやりました.C1は0とし.C2は10と考えました. 1.429秒で床にあたるようで,その時間でゼロクロッシングが検知されてしまいます. アドバイスいただける方,宜しくお願いいたします・

  • 物体の衝突の問題です。

    大学受験問題です。よろしくお願いします。 水平な地面上のP地点から質量Mの小物体Aを鉛直に打ち上げ、同時にQ地点から質量mの小球Bを打ち上げる。小球Bの打ち上げ角度αとPQ間の距離lは変化させることができる。小物体Aの打ち上げの初速度の大きさをV、小球Bの初速度の大きさをvとする。また、重力加速度の大きさをgとし、空気による抵抗は無視する。 BをAに衝突させるには、角度αをいくらにしなければならないか。sinαを求めよ。 私は、 Aのt秒後のx座標=Bのt秒後のx Aのt秒後のy座標=Bのt秒後のy とし式を立てました。 ですが、解答では、 AとBが衝突する場合、A、Bは同じ座標に同じ時刻に到達しなければならない。その場合、鉛直方向について考えれば、同時に投げ出すため、鉛直方向の初速度が同じでなくてはならない。ここで、それぞれの初速度のy成分より、 vsinα=V とあります。 ですが、鉛直方向だけで、どうしてx軸方向は考えないのでしょうか。 高さは同じでも、x座標が違うかもしれず、それだと衝突しないと思います。 また、答えには、「鉛直方向の初速度が同じでなくてはならない」とありますが、どうしてでしょうか。 以上、よろしくお願い致します。

  • MATLABによるラグランジェ補間

    下記1~2行目の8点が与えられていて、ラグランジェ補間を行う問題です。 下記のプログラムを自分で組んだものの、おかしな値が返ってきます。 どこが間違っているのか全く検討がつかないのでわかる方がいらっしゃったらどうかご教授お願いします。 x=[0,1.2,2.1,3.5,4.8,6.7,8.5,9.7]; y=[0.4,1.3,2.0,3.1,4.0,5.2,6.0,6.1]; x0=(0:0.001:15); h=0.0001; a=0; j=1; while a<=15 f(j)=0; for i=1:8 b=(lag(x(i)+h)-lag(x(i)))/h; f(j)=f(j)+lag(a)*y(i)/(b*(a-x(i))); end a=a+0.001; j=j+1; end plot(x0,f) [lag.m] function f=lag(x) g=1; z=[0,1.2,2.1,3.5,4.8,6.7,8.5,9.7]; for i=1:1:8 if x ~= z(i) g = g*(x-z(i)); end end f=g;

  • 物理(衝突) 教えてください

    ばね(自然長l、ばね定数k)でつながれた質量m1の質点Bと質量m2の質点Cがなめらかで水平な床の上に静止している。床上を速度v0で滑ってきた質量m0の質点Aが質点Bに衝突(弾性衝突)した。 (1)質点B,Cの重心の座標Xとばねの伸びYは? (2)XとYを満たす方程式は? (3)初期条件はt=0のときx1=0、x2=およびx1''=v1,x2''=0 X(t),Y(t)は? (4)質点B、Cを質量m1+m2の1つの物体とみなしたとき、質点Aとこの物体との跳ね返り係数eは?この値は1より小さくなる。 質点Aが持っていた運動エネルギーの一部が質点B、Cからなる質点系の(  )の運動のエネルギーに使われるからである。(  )に当てはまる言葉は? 質点B、Cについての運動方程式は、 mx1''=k(x2-x1-l) mx2''=-k(x2-x1-l)と求めました。 (3)はX=(x1+x2)/2,Y=(x1+x2-l)/2と考えましたが、間違っている場合ご指摘お願します。

  • MATLABについての質問です。

    大学の研究していてMATLABでわからないところがあるのでぜひ教えて頂けたらと思っています。 よろしくお願い致します。 現在任意の多角形障害物を設置し,それらを回避する折れ線経路を全部求めるプログラムを作っているのですがどのように作ればいいかわかりません。 今は始点と終点を決めてクリックした所をつないでいくプログラムができたのですが問題文に沿ってできていません。 このプログラム後はダイクストラの方法で最短折れ線経路を求めるので それを含めてよろしくお願い致します。 clear all; close all; clc; init=1; final=1000; figure(1) for loop=init:final [x,y] = ginput A=[x,y] if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 B{loop} =A else break end end figure(2) for C=init:loop-1 B{C} fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); end [x,y] = ginput pb=[x,y] figure(3) for C=init:loop-1 fill(B{C}(:,1),B{C}(:,2),'g');hold on axis([0,1,0,1]); plot(pb(:,1),pb(:,2),'o');hold on end for D=init:final [x,y] = ginput if 0<=x(:,:)&x(:,:)<=1&0<=y(:,:)&y(:,:)<=1 plot([pb(1,1),x',pb(2,1)],[pb(1,2),y',pb(2,2)],'-*');hold on node{D}=[[pb(1,1),x',pb(2,1)],[pb(1,2),y',pb(2,2)]] B{D} = sum(node{D}) else break end end for E=init:D-1 B{E} end