---
title: "균일한 반원판의 질량중심"
url: https://agwo2.dev/center-of-mass-of-semicircle
author: "채은우 (Eunwoo Chae)"
date: 2024-01-27
tags: ["물리", "질량중심", "Python"]
summary: "균일한 반원판의 질량중심을 구하는 문제를 풀어보고 이를 파이썬으로 구현해보자."
---

# 균일한 반원판의 질량중심

- 오늘은 이전 포스팅에서 예고한 대로 균일한 반원판의 질량중심을 구해보고
- 이를 파이썬으로도 풀어볼 예정이다.

**다음 그림과 같은 균일한 반원판의 질량중심은?**

![](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F342e3572-6698-498c-b69e-db1b812e83c7%2Ffc1c604c-a9ba-4f42-877d-ed80a4891fd0%2FUntitled.png?table=block&id=6186df8f-caf3-4cc0-91ff-be388b197dc4)

이전 포스팅에서 시간이 늦어 풀지 못했던 문제를 다시 가져왔다.

위 문제는 어떻게 접근하여 풀어야 할까?

먼저 우리에게 주어진 조건에 대해 알아보자.

우리는 문제에서 저 반원판이 밀도가 균일한 2차원 반원판이라는 것을 알 수 있다.

그리고 이는 우리가 [이전 포스팅](https://agwo2.dev/center-of-continuous-mass)에서 정리해두었던 공식 중 2번째 공식을 적용할 수 있음을 의미한다.

바로 적용시켜 보자.

$$
y_{cm}=\frac {\int ydm} {\int dm} = \frac {\int \sigma y dA} {\int \sigma  dA}= \frac {\int y dA} {\int  dA}
$$

문제에 위 공식을 적용시키면 미소면적($dA$)은 반원판을 무수히 작게 쪼갠 한 조각을 의미하는 것이 된다.

이제 아래 그림을 봐보자.

아래 첫 번째 그림은 그 미소면적을 표현한 것인데 반원판에서 $d\theta$를 

중심각으로 하는 부채꼴에서 윗 부분의 넓이를 말하는 것이다.

그리고 우리는 공식에 의해 저 미소면적($dA$)의 합을 구하게 될 것이다.

![](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F342e3572-6698-498c-b69e-db1b812e83c7%2F7d0562bf-50bd-4dca-80f7-c2008c9de3b3%2FUntitled.png?table=block&id=fb39b83e-2c38-431b-b1c4-3b32dcfc0d07)

즉, 두 번째 그림에 그려 놓은 것처럼 매우 작은 넓이를 다 합쳐서 구하는 것이라고 생각하면 편하다.

![](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F342e3572-6698-498c-b69e-db1b812e83c7%2F84ae8938-3c5d-4cec-8061-4848af5d15b8%2FUntitled.png?table=block&id=b5bcc934-7256-48ed-82a9-0db3b956ae92)

아래는 위 내용을 통해 최종적으로 질량중심을 구하는 풀이이다.

![](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F342e3572-6698-498c-b69e-db1b812e83c7%2Fda4111c1-bdf2-4d23-b061-9dda85043d0d%2FUntitled.png?table=block&id=de361d1a-ad16-4803-abd9-03696711126c)

이제 파이썬으로 이를 구현해보자. 내가 작성한 코드는 다음과 같다.

먼저 파이썬에서 그래프를 그리기 위해 matplotlib을 이용하였고,

반원판을 그리기 위해 `linspace()` 함수를 이용하여 θ값을 0도부터 180도까지 200개로 쪼개 저장하였다.

그리고 $\theta$값과 삼각함수를 통해 반원을 그려 좌표평면 상에 표현하였다.

```python
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.family'] ='AppleGothic'
plt.rcParams['axes.unicode_minus'] = False

radius = 2

theta = np.linspace(0, np.pi, 200)

x = radius * np.cos(theta)
y = radius * np.sin(theta)

plt.plot(x, y, color='blue')
plt.fill_between(x, 0, y, color='blue', alpha=0.2)
```

이제 이중 적분을 통해 질량 중심을 구하는 부분인데

파이썬에서 이중 적분을 하기 위해서 SciPy(싸이파이)의 `dblquad()` 함수를 사용했다.

up과 down은 질량중심을 구하는 공식에서 각각 분모와 분자를 말하는 것이다.

```python
from scipy.integrate import dblquad

def integrand_up(r, theta):
    return r * np.sin(theta) * r

result_up, _ = dblquad(integrand_up, 0, np.pi, lambda theta: 0, lambda theta: radius)
print(result_up)

def integrand_down(r, theta):
    return r

result_down, _ = dblquad(integrand_down, 0, np.pi, lambda theta: 0, lambda theta: radius)
print(result_down)

print(f"질량중심 좌표: (0, {result_up/result_down:.4f})")
```

이제 반원판도 좌표 평면 상에 다 그려줬고, 질량중심의 좌표로 이를 기준으로 도출하였다.

밑에 코드는 이를 모니터에 표시하기 위한 코드이다.

질량중심과 원점은 따로 `scatter`를 찍어주었고, 원점을 기준으로 축이 없으니까

뭔가 불편해서 따로 축도 그어주었다.

마지막으로 중요한 게 `plt.axis('equal')`인데 이걸 넣어주지 않으면

그래프의 x축 y축의 눈금 스케일이 달라져서 반원판이 찌그러져 보일 수 있다.

```python
plt.scatter(0, result_up/result_down, color='red', marker='x', label='질량 중심')
plt.scatter(0, 0, color='blue', marker='o', label='원점')
plt.text(0.1, result_up/result_down, f'(0, {result_up/result_down:.4f})', fontsize=10, color='black')

plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)

plt.xlabel('X축')
plt.ylabel('Y축')
plt.title('반원판의 질량 중심')
plt.legend()
plt.axis('equal')
plt.grid(True)
plt.show()
```

다음은 위 코드를 통해 얻은 결과물이다.

위 코드에서 실제값 도출을 위해 반원판의 반지름을 2로 설정하였으므로

값이 질량중심의 좌표가 $(0, 0.8488)$이 나오는 것을 확인할 수 있다.

그리고 이는 일반화된 공식을 통해 구한 결과와 같은 결과이다.

![](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F342e3572-6698-498c-b69e-db1b812e83c7%2F61a3ab47-3902-4ee2-b570-f4a4e4491d96%2F8dc8895f-41f5-45cc-800e-843eec09d9cc.png?table=block&id=ef5f2f03-ae3b-44af-a91b-073b5c33b171)

![](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F342e3572-6698-498c-b69e-db1b812e83c7%2Fb82bda55-f7a1-4512-a70d-039e57684e28%2FIMG_3831.jpg?table=block&id=354c8a47-14f4-42af-9e79-6ff07a3a9bf0)

솔직히 그렇게 의미가 없는 활동이긴 하지만 Python 연습을 했다는 것에 그 의의를 둔다.

---
출처: https://agwo2.dev/center-of-mass-of-semicircle
