0. 오늘의 문제
오늘도 2학년 과목인 고체역학 과제를 하다가 그래프 그릴 일이 생겼습니다. 문제는 아래와 같습니다.
트러스 구조인데, 각도에 따라서 AC의 길이와 두께가 바뀝니다. 그럼 부피가 바뀌고, 무게가 바뀝니다. 허용응력은 안전계수를 제외하고 생각한다면, 물질의 Property 가 됩니다. 파단강도가 Property이니까요.
AC에는 Tension, BC에는 Compression 이 작용하니까 이를 토대로 식을 세워보면 아래와 같이 됩니다.
여기서 감마, P, L, 허용응력은 모두 Fixed 이므로, 뒤에 있는 삼각함수 식에서 최소 값을 찾으면 되겠죠? 사실 울프램 써도 되지만... 공부도 할 겸 파이썬!
넘파이(Numpy)는 벡터, 행렬 등 수치 연산을 수행하는 선형대수 (Linear Algebra) 라이브러리이며,
Matplotlib 는 데이터 시각화를 위해 사용하는 라이브러리입니다.
한 가닥 씩 하는 라이브러리답게 로고도 있습니다. 좀 멋있네요.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(np.pi/6,np.pi/2.5,100) # (시작값, 종료값, 두 값 사이를 몇개로 나누냐)
y = 1/(np.sin(x)*np.cos(x)) + 1/np.tan(x)
plt.plot(x,y)
plt.xlabel('30 degree to 72.5 degree')
x 축을 각도로 표시하는 법을 찾아봤는데, 없었습니다... 또, 원래는 0부터 180도를 했었는데요, x가 0 과 90도 주변에서 값이 너무 커져 자꾸 에러가 나와서 범위를 줄였습니다. ZeroDivisionError 를 Except 하는 방법이 있었으나, 0 나누기를 생략해도 값이 너무 커서인지 에러가 나오덥니다.
어찌됐건, 0.9와 1 라디안 사이에서 최저값이 나오는 것 같습니다. y값이 최저가 나오는 x값을 찾아봅시다.
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(np.pi/6,np.pi/2.5,100)
y = 1/(np.sin(x)*np.cos(x)) + 1/np.tan(x)
data = {}
for i in range (len(x)) :
data[x[i]] = y[i]
print(min(data, key=data.get))
데이터를 모조리 딕셔너리에 넣고, Key 와 Value를 이용해 찾았습니다. 저 데이터를 모조리 CSV로 뽑은 다음에 판다스로 하는 방법도 생각했는데, 간단하게 했습니다.
최대 Value가 나오는 Key 찾는 방법은 위처럼 max(dic,key=dic.get) 입니다. (스택오버플로우에서 따봉만 2000개)
저 코드로 나온 값은 0.9530555491193278이며, 셋째자리에서 끊으면 0.953이 됩니다.180을 곱하고 파이를 나눠주면...
54.603도가 나옵니다. 답이 54.7도이니 맞혔네요.
복잡한 계산하기 싫어서 컴퓨터를 써봤습니다. 공부도 할 겸.