課題がわかりません><

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
おうよ

課題がわかりません><

#1

投稿記事 by おうよ » 11年前

投射のシミュレーションを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言語は初心者です>< 具体的なプログラムを教えてください よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 課題がわかりません><

#2

投稿記事 by みけCAT » 11年前

フォーラムルールをお読みください。
課題の丸投げは禁止です。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 課題がわかりません><

#3

投稿記事 by usao » 11年前

具体的に何がわからないのでしょうか?
シンプルなオイラー法でしょうから

>よって差分式は、
>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

投稿記事 by おうよ » 11年前

プログラムの流れが、どのように作っていけばいいのかわかりません。 
差分式4つをfor文で計算するんだろーなーって感じで、どのように組み込んでいくかとか、
なにをどう定義していくのか、もうどうすればいいのかわかりません。
数学、物理は苦手です><
提出が25日なので、こんな感じのプログラムになるよーとか、穴埋めみたいな感じでもいいのでお願いしますm(_ _)m

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 課題がわかりません><

#5

投稿記事 by usao » 11年前

>初期条件として、時刻t=0における質点の座標(x0, y0)と速度 (u0, v0) を自分で決める。ただし速度の大きさは1m/s程度。
>時間間隔はdt=0.1。出力データファイル名を付け、プログラムを実行し計算結果を出力する。

まぁこの文章を読んだ感じでは以下のような雰囲気じゃないかと思います.

この課題やるだけならば数学の知識も物理の知識も全く関係無いし,
C言語に関しては,課題として出されている以上,どうすればよいのかという最低限の情報は
与えられていると思うので,まずは手元の情報(教科書なり何なり)を一から確認されてみては?

コード:

//定数
const double g = 9.80665;
const double dt = 0.1;

int main()
{
  //初期状態の準備
  double t=0;
  doble x,y,u,v;
  x,y,u,vに初期値を設定する

  //出力準備
  結果出力用ファイルを開く

  //シミュレーション計算処理
  while( 終了条件を満たすまで )
  {
    4つの差分式でx,y,u,vを更新
    t += dt;
    ファイルに結果(x,yだけでいいのかu,vも要るのか等不明だが)を書き出す
  }

  //後始末
  結果出力用ファイルを閉じる
  return 0;
}

おうよ

Re: 課題がわかりません><

#6

投稿記事 by おうよ » 11年前

ありがとうございます^^
参考に頑張ってみます。
うまくいかなかったり、わからないところがでたら、また質問させていただきます。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 課題がわかりません><

#7

投稿記事 by usao » 11年前

オフトピック
>提出が25日なので
ということは実質24日中には完成していないとダメなのかな? 頑張ってください.
取り組む時間に余裕があるなら(?),一気に全部やるよりは
主要なロジック部分をつくる→ファイル保存処理を追加 という段階を経るといいかもしれない.

(1)シミュレーションロジックの部分のみをまずは動くように仕上げる
 (結果はデータファイルに出力するのではなく,とりあえずprintf()などで表示する)
 初期状態は自分で決めろという指定があるが,その方法は明確に定められていない(?)ので
 コードにてきとーな初期値を直に書くだけでいいのかも.
(2)データファイルにも結果を出力するように変える

みたく.
(初心者ということだれば,
 一度に考えなきゃいけないことをできる限り減らして 一個ずつ潰していく方がいいだろう,という意味で.)

おうよ

Re: 課題がわかりません><

#8

投稿記事 by おうよ » 11年前

無事できました。
ありがとうございましたm(_ _)m
また、わからいことで質問することがあるかもしれませんが、その時はよろしくお願いします。
本当に助かりました^^

閉鎖

“C言語何でも質問掲示板” へ戻る