728x90

4. 10 파이썬 공부

오늘도 과제 공부

2. 한 직육면체의 가로, 세로, 높이를 측정한 결과 𝑥𝑥=5.4±0.4cm, 𝑦𝑦=3.7±0.3cm, 𝑧𝑧= 2.5 ±0.2cm이다. 주어진 오차가 정규분포의 표준편차라고 가정하고 아래 물음에 답하시오. 
(1) 몬테카를로 방법을 사용하여 체적과 그것의 오차를 추정하라. 최소 1000개 이상의 샘플을 사용하라. 
(2) 직육면체 모든 모서리 선들의 길이 합과 그것의 오차를 추정하라. 위 (1)과 같은 방법을 사용하라.

import numpy as np

# 각 변의 길이와 오차
x, dx = 5.4, 0.4
y, dy = 3.7, 0.3
z, dz = 2.5, 0.2

# 100000의 크기로 표준편차가 1인 x,y,z 난수 생성
N = 100000
samples_x = np.random.normal(loc=x, scale=dx, size=N)
samples_y = np.random.normal(loc=y, scale=dy, size=N)
samples_z = np.random.normal(loc=z, scale=dz, size=N)

# Monte Carlo 방법으로 체적과 체적의 오차 추정
volumes = samples_x * samples_y * samples_z
v = np.mean(volumes)
dv = np.std(volumes)

#결과 출력1
print("체적: %0.3f ± %0.3f (cm^3)" %(v,dv))

# Monte Carlo 방법으로 각 모서리 선들의 길이 합과 오차 추정
edges = 4*(samples_x + samples_y + samples_z)
e = np.mean(edges)
de = np.std(edges)

#결과 출력2
print("모서리 선들의 길이 합: %0.3f ± %0.3f (cm)" %(e, de))

1) 몬테 카를로 방법이란?
유효 범위에 포함되는 수많은 난수들을 이용하여 나온 함수값의 평균으로 그 값을 추정하는 방법

>>> 1000이상의 난수를 이용해서 체적과 모서리들의 길이 합을 구하고 그것의 평균을 구하자

2) 정규분포 난수 생성: 
np.random.normal(평균, 표준편자, 난수 개수)
== np.random.normal(loc= 평균, scale= 표준편차, size= 난수개수)

3) 평균과 표준편차 구하기
평균: np.mean()
표준편차: np.std()


3. 
(1) 장반경이 1이고 이심율이 0.7인 타원을 xy평면에서 그리라. 원점이 타원의 초점 중의 하나가 되게 하라. 
(2) 이 타원이 xy평면과 45도 기울어진 평면에 존재하는 경우 이 것을 3D 그래프로 나타내라. 

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

# 타원방정식: (x/a)^2 + (y/b)^2 = 1
# 이심률: c(초점거리)/a(장축)
a = 1
e = 0.7

# 타원 단축 계산
b = a * np.sqrt(1 - e**2)

# 타원의 초점
f1 = [0,0]
f2 = [1.4, 0]

# 타원 그리기, 초점 표시
t = np.linspace(0, 2*np.pi, 1000)
x = a * np.cos(t) + 0.7
y = b * np.sin(t)
plt.plot(x, y)
plt.plot(f1[0], f1[1], 'ro')
plt.plot(f2[0], f2[1], 'ro')

# x, y축 이름 표기
plt.xlabel('x')
plt.ylabel('y')
plt.show()

# xy평면에 평행한 타원의 z값 설정
z = np.zeros_like(x)

# xy평면에 대해 기울어진 각도(45도) 설정
p = np.pi * 0.25

# 회전 변환 행렬(원점을 기준으로 회전 하는 것이기에 초점(0,0,0)도 유지)
R = np.array([[np.cos(p), 0, -np.sin(p)],
              [0, 1, 0],
              [np.sin(p), 0, np.cos(p)]])

# 평면의 타원 좌표를 행렬 형태로 변환
X = np.vstack((x, y, z))

# 타원 회전 행렬 곱
X = R @ X

# 3D 그래프 그리기
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(X[0], X[1], X[2])

# x, y,z축 이름 표기
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')

plt.show()


1) from mpl_toolkits.mplot3d import Axes3D
matplotlib 에서 3차원 그래프를 그릴 수 있도록 만들어준다

보통 이렇게 선언하고 시작
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111,projection='3d')

2) from mpl_toolkits.mplot3d import Axes3D 선언 이후 3차원 그래프 그리기

-3차원 그래프 생성
ax.plot(x좌표, y좌표, z좌표)

-x,y,z축 이름 붙이기
ax.set_xlabel('x축 이름')
ax.set_ylabel('y축 이름')
ax.set_zlabel('z축 이름')

3) np.zeros_like(array)
()안의 array 와 같은 크기의 0으로만 이루어진 array 생성

4) np.vstack(): array(배열)을 세로로 결합 (행렬 생성 가능)

ex)
x = ([1, 2, 3, 4, 5])
y = ([5, 4, 3, 2, 1])

np.vstack(x,y)
>>> [[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]]

5) np.hstack(): array(배열)을 가로로 결합
ex)
x = ([[1, 2, 3, 4, 5],
[6, 7, 8, 9, 10]])
y = ([[5, 4, 3, 2, 1],
[10, 9, 8, 7, 6]])

np.hstack(x,y)
>>> [[1, 2, 3, 4, 5, 5, 4, 3, 2, 1]
[6, 7, 8, 9, 10, 10, 9, 8, 7, 6]]

6) 행렬 곱 @

ex)
a = ([[1, 2],
[3, 4]])
b = ([[4, 3],
[2, 1]])

a @ b
>>> ([[8, 5],
[20, 13]])

728x90

+ Recent posts