力学の入門 : 5 「ばね系」

アバター
GRAM
記事: 164
登録日時: 14年前
住所: 大阪

力学の入門 : 5 「ばね系」

投稿記事 by GRAM » 12年前

久しぶりに書く

[1]フックの法則

 力学をやるうえでばね系を考えることは非常によくあることです。
 とくにそのもっとも基本になるのが「線形ばね」というもので、より専門的には「線形弾性体」とよばれるばねです。
 次のフックの法則は有名です。線形弾性体とはフックの法則にのっとるようなばねのことです


   F=kx

 この式で、kのことをばね定数といい、xは変位ベクトル、Fは力のベクトルです。
 この式が言っていることは、ばねの力の大きさFは、ばねの自然長からの伸びxに比例する ということです。
 xは自然長からの伸びなので、縮む方は正の、伸びる方は負の値をベクトルを考えてやればよいでしょう。(そうすると力の向きが加速度の向きと一致する)
 もちろんばねの伸びに限りがあり、またばねのちぢみ量にも限りがあるのでフックの法則が成り立つような系ばかりではありません。しかし微小な変位に対して
 線形性(つまりばねの伸びと力の大きさに比例関係があるということ)を仮定することはよくあることですし、実際多くの場合でうまくいきます。

[2]プログラム
 プログラムは簡単です。次の部分がすべてを語っています

CODE:

			Vector d = p2->S() - p1->S();
			//質点間の距離を算出
			double dist = sqrt(double(d*d));

			//相対位置ベクトルの単位ベクトルを計算
			Vector de = d / dist;

			//与える力は大きさk*(dist-l)、向きde
			Vector f = de * k_*(dist-l_);
			p1->AddForce( f );
			p2->AddForce( -f );
まずは、ばねの先端にいる2質点間の距離を求めます。(1~2行目)
ここからばねの自然長lを引いた値が、ばねの力の大きさになります。
力の向きは上で述べたようにばねの縮む方向を正として考えればいいので、方向ベクトルdを正規化して(3行目)
力のベクトルを求めます(4行目)
あとは作用反作用の法則を踏まえて、2つの質点にそれぞれ逆向きに力を加えてやります。


実際のプログラムの全文は次のようなものになります。(Vector.hは前回と同じ)
► スポイラーを表示
抽象インターフェースEntityを用いて、Environmentで一括管理するように変更しましたがそれ以外はほぼ前回と変わりません。
3つのばね系を同時に表示していますが、うまく動くことが分かると思います。

1つ目はふつうの単振動、よく見るばねの運動です。

2つ目は質点が回転しながら振動します。フィギュアスケートで腕を曲げると回転が速くなるということは有名ですが、
この場合でも同様に2質点間の距離が短くなると、回転速度が上がることが見て取れます。

3つ目は、シミュレーションでなければ計算で動きを予測することが難しいのが特徴的です。
3つのばねと、4つの質点を用いて運動させています。
(精度の都合上途中から少しづつ狂ってくるが・・・)
無題.png
無題.png (47.29 KiB) 閲覧数: 104 回

コメントはまだありません。