본문 바로가기
공부/파이썬 Python

선형대수 Python 과제3 풀이

by 혼밥맨 2022. 5. 4.
반응형

선형대수 Python 과제3 풀이

 

벡터 u,v 가 span하는 영역 그려보기.
세 번째 과제는 벡터 u, v가 span하는 영역을 파이썬을 이용하여 이미지를 그려보는(플라팅) 것입니다.

 

1번

이번 과제에 필요한 라이브러리를 import 하세요.
 a) numpy 라이브러리
 b) matplotlib의 pyplot 라이브러리

1
2
3
4
5
6
7
# 01 
import numpy as np
from mpl_toolkits import mplot3d
%matplotlib inline
import random
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
cs

 

 

2번

이어서 u, v row 벡터(3x1)를 정의하세요.

1
2
3
# 02 
= [2,6,5]
= [6,3,1]
cs

3번

이어서 fig와 ax를 정의하고 3차원 공간을 plot를 하세요. 이 때 아무것도 없는 빈 공간 (empty space)이 출력됩니다.

파이썬 스크립트 (Python Script) 를 사용하여 plot하려면 코드 마지막에 plt.show() 를 추가해주세요.

1
2
3
# 03
fig = plt.figure()
ax = plt.axes(projection='3d')
cs

4번

이어서 자신의 학번과 영어이름으로 제목을 달고 각 축(axis)의 범위(range)를 0~8로 지정하고 각 축에 X, Y, Z 이름을 붙이세요.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 04
fig = plt.figure()
ax = plt.axes(projection='3d')
plt.title('12345678 Lee Park Choi')
 
# Labelling X-Axis
ax.set_xlabel('X')
ax.set_xlim([0,8])
 
ax.set_ylabel('Y')
ax.set_ylim([0,8])
 
ax.set_zlabel('Z')
ax.set_zlim([0,8])
 
plt.show()
cs

 

 

5번

이어서 아래 조건에 맞게 두 벡터를 그리고 이름을 붙여주세요.
u벡터의 화살표는 빨갛게 (red)
v벡터의 화살표는 파랗게 (blue)
arrow_length_ratio는 0.1 (=.1)
글자 크기 (font size)는 15으로

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 05 
fig = plt.figure()
ax = plt.axes(projection='3d')
plt.title('12345678 Mayweather')
 
ax.set_xlabel('X');ax.set_xlim([0,8]);ax.set_ylabel('Y');
ax.set_ylim([0,8]);ax.set_zlabel('Z');ax.set_zlim([0,8])
 
start = [0,0,0]
 
ax.quiver(start[0], start[1], start[2], v[0], v[1], v[2], arrow_length_ratio=.1, color='blue')
ax.quiver(start[0], start[1], start[2], u[0], u[1], u[2], arrow_length_ratio=.1, color='red')
 
ax.text(v[0], v[1], v[2], "v", zdir=None, size=15)
ax.text(u[0], u[1], u[2], "u", zdir=None, size=15)
 
plt.show()
cs

 

6번

x, y, z에 대해 x, y는 미지수입니다. 외적을 이용하여 벡터 u, v가 span하는 평면의 법선벡터를 구하고 이를 바탕으로 원점을 지나고 법선벡터에 수직인 평면의 방정식을 z에 대해 표현하세요.

이어서, 아래 코드를 이용하여 표현한 식을 코드에 그대로 대입하세요.

1
2
3
4
5
x, y = np.meshgrid(np.arange(9), np.arange(9)) # x, y는 미지수라고 생각하세요. (0~8 범위의 정수)
# ======= u, v의 법선벡터를 찾으세요. (np.cross를 찾아보고, 사용하세요) ========
= # ======== 법선 벡터의 성분과, x, y를 이용하여 평면의 방정식을 적으세요. =========
ax.plot_surface(x, y, z, alpha=0.5# 평면을 plot합니다. alpha는 불투명도
ax.view_init(elev=15., azim=-120# 보이는 각도를 조절합니다.
cs

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 06
fig = plt.figure()
ax = plt.axes(projection='3d')
plt.title('12345678 Word Master Choi')
 
ax.set_xlabel('X');ax.set_xlim([0,8]);ax.set_ylabel('Y');ax.set_ylim([0,8]);ax.set_zlabel('Z');ax.set_zlim([0,8])
 
= [2,6,5]
= [6,3,1]
 
start = [0,0,0]
 
ax.quiver(start[0], start[1], start[2], v[0], v[1], v[2], arrow_length_ratio=.1, color='blue')
ax.quiver(start[0], start[1], start[2], u[0], u[1], u[2], arrow_length_ratio=.1, color='red')
 
ax.text(v[0], v[1], v[2], "v", zdir=None, size=15)
ax.text(u[0], u[1], u[2], "u", zdir=None, size=15)
 
 
point  = np.array([265])
normal = np.cross(u,v)
 
# a plane is a*x+b*y+c*z+d=0
# [a,b,c] is the normal. Thus, we have to calculate
# d and we're set
= -point.dot(normal)
 
# create x,y
xx, yy = np.meshgrid(range(9), range(9))
 
# calculate corresponding z
= (-normal[0* xx - normal[1* yy - d) * 1. /normal[2]
 
# plot the surface
fig.gca(projection='3d').plot_surface(xx, yy, z, alpha=0.5)
 
ax.plot_surface(xx, yy, z, alpha=0.5# 평면을 plot합니다. alpha는 불투명도
ax.view_init(elev=15., azim=-120# 보이는 각도를 조절합니다.
plt.show()
cs
반응형

댓글