投射のシミュレーションをC言語でプログラミングするのですが、全くわかりません;;
どなたか教えてくださいm(_ _)m よろしくお願いします。
二次元直交座標系(x, y) において、質量m[kg] の質点の運動方程式はニュートンの運動の第二法則より、
m*d^2*x/(dt^2)=fx
m*d^2*y/(dt^2)=fy
ここで(fx, fy)は質点に作用する力[N]のx成分、y 成分である。
上式は2階線形常微分方程式であるが、それぞれ1階連立線形常微分方程式にできる。
m*du/dt=fx
dx/dt= u
m*dv/dt= fy
dy/dt= v
ここで(u, v)は質点の速度[m/s]のx成分、y成分である。初期条件は時刻t = 0における質点の座標(x(0), y(0))と速度(u(0), v(0))が与えられればよい。
具体例として、地上での質点の投射問題を考える。水平方向をx軸、鉛直上向きをy 軸とする。空気抵抗が無視できる場合には質点に作用する力は重力のみで運動方程式は
m*du/dt= 0
dx/dt= u
m*dv/dt= −mg
dy/dt= v
ここで重力加速度g = 9.80665[m/s2] である。
オイラー陽解法によって離散化する。時間の離散化をあらわす添え字は上付き添え字のnを用いている。
m*(u^(n+1) − u^n)/Δt= 0
(x^(n+1) − x^n)/Δt= u^n
m*(v^(n+1) − v^n)/Δt= −mg
(y^(n+1) − y^n)/Δt= v^n
よって差分式は、
u^(n+1) = u^n
x^(n+1) = x^n + Δt*u^n
v^(n+1) = v^n − Δt*g
y^(n+1) = y^n + Δt*v^n
シミュレーションプログラムを作成し、シミュレーションを実行せよ。
初期条件として、時刻t=0における質点の座標(x0, y0)と速度 (u0, v0) を自分で決める。ただし速度の大きさは1m/s程度。時間間隔はdt=0.1。出力データファイル名を付け、プログラムを実行し計算結果を出力する。
MS Visual C++ 2010 Express を使っています。 C++ではなくCでプログラミングしています。
C言語は初心者です>< 具体的なプログラムを教えてください よろしくお願いします。
課題がわかりません><
Re: 課題がわかりません><
具体的に何がわからないのでしょうか?
シンプルなオイラー法でしょうから
>よって差分式は、
>u^(n+1) = u^n
>x^(n+1) = x^n + Δt*u^n
>v^(n+1) = v^n − Δt*g
>y^(n+1) = y^n + Δt*v^n
で得られている4つの更新式を実装してループさせるだけだと思います.
(ループ終了条件は知りませんが)
シンプルなオイラー法でしょうから
>よって差分式は、
>u^(n+1) = u^n
>x^(n+1) = x^n + Δt*u^n
>v^(n+1) = v^n − Δt*g
>y^(n+1) = y^n + Δt*v^n
で得られている4つの更新式を実装してループさせるだけだと思います.
(ループ終了条件は知りませんが)
Re: 課題がわかりません><
プログラムの流れが、どのように作っていけばいいのかわかりません。
差分式4つをfor文で計算するんだろーなーって感じで、どのように組み込んでいくかとか、
なにをどう定義していくのか、もうどうすればいいのかわかりません。
数学、物理は苦手です><
提出が25日なので、こんな感じのプログラムになるよーとか、穴埋めみたいな感じでもいいのでお願いしますm(_ _)m
差分式4つをfor文で計算するんだろーなーって感じで、どのように組み込んでいくかとか、
なにをどう定義していくのか、もうどうすればいいのかわかりません。
数学、物理は苦手です><
提出が25日なので、こんな感じのプログラムになるよーとか、穴埋めみたいな感じでもいいのでお願いしますm(_ _)m
Re: 課題がわかりません><
>初期条件として、時刻t=0における質点の座標(x0, y0)と速度 (u0, v0) を自分で決める。ただし速度の大きさは1m/s程度。
>時間間隔はdt=0.1。出力データファイル名を付け、プログラムを実行し計算結果を出力する。
まぁこの文章を読んだ感じでは以下のような雰囲気じゃないかと思います.
この課題やるだけならば数学の知識も物理の知識も全く関係無いし,
C言語に関しては,課題として出されている以上,どうすればよいのかという最低限の情報は
与えられていると思うので,まずは手元の情報(教科書なり何なり)を一から確認されてみては?
>時間間隔はdt=0.1。出力データファイル名を付け、プログラムを実行し計算結果を出力する。
まぁこの文章を読んだ感じでは以下のような雰囲気じゃないかと思います.
この課題やるだけならば数学の知識も物理の知識も全く関係無いし,
C言語に関しては,課題として出されている以上,どうすればよいのかという最低限の情報は
与えられていると思うので,まずは手元の情報(教科書なり何なり)を一から確認されてみては?
Re: 課題がわかりません><
オフトピック
>提出が25日なので
ということは実質24日中には完成していないとダメなのかな? 頑張ってください.
取り組む時間に余裕があるなら(?),一気に全部やるよりは
主要なロジック部分をつくる→ファイル保存処理を追加 という段階を経るといいかもしれない.
(1)シミュレーションロジックの部分のみをまずは動くように仕上げる
(結果はデータファイルに出力するのではなく,とりあえずprintf()などで表示する)
初期状態は自分で決めろという指定があるが,その方法は明確に定められていない(?)ので
コードにてきとーな初期値を直に書くだけでいいのかも.
(2)データファイルにも結果を出力するように変える
みたく.
(初心者ということだれば,
一度に考えなきゃいけないことをできる限り減らして 一個ずつ潰していく方がいいだろう,という意味で.)
ということは実質24日中には完成していないとダメなのかな? 頑張ってください.
取り組む時間に余裕があるなら(?),一気に全部やるよりは
主要なロジック部分をつくる→ファイル保存処理を追加 という段階を経るといいかもしれない.
(1)シミュレーションロジックの部分のみをまずは動くように仕上げる
(結果はデータファイルに出力するのではなく,とりあえずprintf()などで表示する)
初期状態は自分で決めろという指定があるが,その方法は明確に定められていない(?)ので
コードにてきとーな初期値を直に書くだけでいいのかも.
(2)データファイルにも結果を出力するように変える
みたく.
(初心者ということだれば,
一度に考えなきゃいけないことをできる限り減らして 一個ずつ潰していく方がいいだろう,という意味で.)
Re: 課題がわかりません><
無事できました。
ありがとうございましたm(_ _)m
また、わからいことで質問することがあるかもしれませんが、その時はよろしくお願いします。
本当に助かりました^^
ありがとうございましたm(_ _)m
また、わからいことで質問することがあるかもしれませんが、その時はよろしくお願いします。
本当に助かりました^^