while True:

問題19

n 原子からなる平面分子を構成する各原子の質量 𝑚𝑖 と座標 (𝑥𝑖′,𝑦𝑖′) を読み込み,主慣性モーメントを計算するプログラムを作れ. [ヒント]まず質量中心の位置を計算し,これを原点とする座標系に平行移動する. 移動後の座標を(𝑥𝑖,𝑦𝑖)とする.𝐼𝑥𝑥 = ∑𝑚𝑖𝑦𝑖²𝐼𝑦𝑦 = ∑𝑚𝑖𝑥𝑖²𝐼𝑥𝑦 = ∑𝑚𝑖𝑥𝑖𝑦𝑖とおくと,主慣性モーメントの値は, 2 次方程式(𝐼𝑥𝑥 − 𝜆)(𝐼𝑦𝑦 − 𝜆) − 𝐼𝑥𝑦2 = 0の 2 つの解,および,(𝐼𝑥𝑥 + 𝐼𝑦𝑦)である.

難易度 ★★★☆☆

標準的な問題です。まず、重心を探します。重心に関しては問題10を参考にしてください。 あとは、それぞれの原子の質量と移動後の座標から慣性モーメントを算出すれば終わりです。
program question19
	implicit none
	integer :: n, i
	real :: msum, posx, posy, Ixx, Ixy, Iyy, lamb1, lamb2
	real, allocatable :: m(:), x(:), y(:)

	print *, "input n :"
	read *, n

	allocate(m(n), x(n), y(n))

	posx = 0
	posy = 0
	msum = 0

	do i = 1, n
		print *, "input m, x, y :"
		read *, m(i), x(i), y(i)
		posx = posx + m(i) * x(i)
		posy = posy + m(i) * y(i)
		msum = msum + m(i)
	end do

	posx = posx / msum
	posy = posy / msum

	Ixx = 0
	Ixy = 0
	Iyy = 0

	do i = 1, n
		x(i) = x(i) - posx
		y(i) = y(i) - posy
		Ixx = Ixx + m(i) * y(i) * y(i)
		Ixy = Ixy + m(i) * y(i) * x(i)
		Iyy = Iyy + m(i) * x(i) * x(i)
	end do

	lamb1 = (Ixx + Iyy + ((Ixx + Iyy) ** 2 - 4 * Ixy ** 2) ** 0.5) / 2
	lamb1 = (Ixx + Iyy - ((Ixx + Iyy) ** 2 - 4 * Ixy ** 2) ** 0.5) / 2

	print *, lamb1, lamb2, Ixx + Iyy

end program question19
ページのトップへ戻る