기본 콘텐츠로 건너뛰기

벡터와 행렬에 관련된 그림들

벡터와 행렬에 관련된 그림들

다음의 코드들과 그림들은 전자책 파이썬과 함께 하는 선형대수에 수록된 것입니다.

import numpy as np
import matplotlib.pyplot as plt
import seaborn
sns.set_style("darkgrid")
#fig 1.1.1
fig, ax=plt.subplots(figsize=(3,2))
cord=[(0,0), (3,1),(2,3)]
nme=["O","A","B"]
col=['g','b','r']
for i, j in enumerate(cord):
    ax.scatter(j[0], j[1], color="white", edgecolors=col[i])
    ax.text(j[0], j[1]+0.15, nme[i], color=col[i], fontweight="bold")
ax.arrow(0,0, 3, 1, color="b", head_width=0.1)
ax.arrow(0,0, 2, 3, color="r", head_width=0.1)
ax.text(1, 0.5,  r"$\vec{a}$", color="b")
ax.text(1, 1.8, r"$\vec{b}$",color="r")
ax.spines['left'].set_position(("data", 0))
ax.spines['bottom'].set_position(("data", 0))
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.grid(True)
plt.show()
#fig112
a=np.array([10,15]) 
b=np.array([8,2]) 
c=np.array([1,2,3]) 
abSum=a+b
abSub=a-b

f, ax=plt.subplots(figsize=(4,3))
obj=[a, b, -b,  abSum, abSub]
nme=['a', 'b', '-b',  'a+b', 'a-b']
col=['g', 'k', 'gray', 'r', 'b']
for i in range(len(obj)):
    ax.arrow(0, 0, obj[i][0], obj[i][1], color=col[i], head_width=0.5, label=nme[i])
plt.plot([-b[0], abSub[0]], [-b[1], abSub[1]], ls="dashed", color="r") 
plt.plot([abSub[0], a[0]], [abSub[1], a[1]], ls="dashed", color="r") 
plt.plot([a[0], abSum[0]], [a[1], abSum[1]], ls="dashed", color="b") 
plt.plot([abSum[0], b[0]], [abSum[1], b[1]], ls="dashed", color="b") 
ax.spines['left'].set_position(("data", 0))
ax.spines['bottom'].set_position(("data", 0))
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)
plt.legend(loc='best', labelcolor='linecolor')
plt.show()
#fig131
x=np.linspace(0.5, 3, 100)
plt.figure(figsize=(4,3))
plt.arrow(0,0, 2,1, lw=4, color="brown", head_width=0.05)
plt.arrow(0,0, 4,2, color="b", head_width=0.05)
plt.arrow(0,0, 1, 3, lw=2, color="r", head_width=0.05)
plt.plot(x, -2*x+5, ls="--")
plt.text(1.2, 0.9, r"$90^o$", color="g")
plt.text(0.2, 0.4, r"$45^o$", color="g")
plt.axis("equal")
plt.show()
#fig132
plt.figure(figsize=(3,3))
plt.arrow(0,0, 1,0,color="r", lw=2, head_width=0.05)
plt.arrow(0,0, -1,0, color="b", lw=2, head_width=0.05)
plt.arrow(0,0, 0, 1, color="g", lw=2, head_width=0.05)
plt.arrow(-1, 0,  1, 1, ls="-.", color="b",alpha=0.3)
plt.arrow(1, 0,  -1, 1, ls="-.", color="r",alpha=0.3)
plt.xticks([])
plt.yticks([])
plt.text(0.02, 0.02, r"$90^o$", color="r")
plt.text(-0.3, 0.02, r"$90^o$", color="b")
cor=[(-0.5, -0.1), (0.5, -0.1), (0.1, 0.5), (0.6, 0.5), (-1.1, 0.5)]
nme=["-v","v", 'u', "||u-v||", "||u-(-v)||"]
col=["r", 'b', 'g', 'r','b']
for i in range(len(cor)):
    plt.text(cor[i][0], cor[i][1], nme[i], color=col[i], weight="bold")
plt.show()
#fig221
x=np.linspace(-8, 8, 100)
y1=2-x
y2=(-3-2*x)/4
y3=(5-3*x)/6
plt.figure(figsize=(4, 3))
plt.plot(x, y1, color="g", label="y=2-x")
plt.plot(x, y2, color="r", label=r"$y=\frac{-3-2x}{4}$")
plt.plot(x, y3, color="b", label=r"$y=\frac{5-3x}{6}$")
plt.legend(loc="best", labelcolor="linecolor", frameon=False)
plt.show()
#fig222
plt.figure(figsize=(3,3))
plt.plot([0, 0] , [0, 3], alpha=0.7, color="brown")
plt.plot([0, 3] , [0, 0], alpha=0.7, color="brown")
plt.plot([3,3] , [0, 3], alpha=0.7, color="brown")
plt.plot([0, 3] , [3, 3], alpha=0.7, color="brown")
plt.arrow(0,0, 3, 2, head_width=0.07, color="g")
plt.arrow(0,0, 0, 1, head_width=0.07,  color="g")
plt.arrow(0,1, 3, 2, ls="dashed",  lw=0.3, color="g")
plt.arrow(3, 2, 0, 1,  ls="dashed",  color="g")
plt.fill_between([0, 3], [0, 2], [1,3], alpha=0.5)
nme=["O", "D", 'E', 'C']
cor=[(-0.2, -0.1),(-0.2, 1), (3.1, 3), (3.1, 2)]
for i,j in zip(nme, cor):
    plt.text(j[0], j[1], i, weight="bold", color="g")
plt.xticks([0, 1,2,3])
plt.yticks([0,1,2,3])
plt.show()
#fig311
x=np.linspace(-0.5, 6, 100)
y1=(7-x)/2
y2=(4+2*x)/5
y3=(-3+5*x)/6
plt.figure(figsize=(4,3))
plt.plot(x,y1, color="g", label=r"$\frac{7-x}{2}$")
plt.plot(x, y2, color="b", label=r"$\frac{4+2x}{5}$")
plt.plot(x, y3, color="r", label=r"$\frac{-3+5x}{6}$")
plt.scatter(3, 2, s=50, c="k")
plt.legend(loc="upper center", labelcolor=['g', 'b', 'r'], frameon=False)
plt.xticks(np.arange(-0, 6))
plt.yticks(np.arange(-1, 8))
plt.show()
#fig321
O=np.array([0,0])
A1=np.array([1, -1,])
A2=np.array([-2, -1,])
A3=np.array([5, 1])
A4=np.array([-1, 0])

plt.figure(figsize=(3,3))
cor=[A1, A2, A3, A4]
nme=['A1', 'A2', 'A3', 'A4']
col=['brown','r','g','orange']
for i in range(len(cor)):
    plt.arrow(0, 0, cor[i][0], cor[i][1], head_width=0.05, color=col[i], label=nme[i])
plt.plot([0, -0.33*A1[0]], [0,-0.33*A1[1]], color="gray", lw=2, ls="dotted", label="-0.33A1")
plt.plot([0, 0.33*A2[0]], [0,0.33*A2[1]], color="k", lw=2, ls="dotted",  label="0.33A2")
plt.plot([0, -2*A2[0]], [0,-2*A2[1]], color="b",  ls="dotted",  label="-2A2")
plt.plot([0.33*A2[0], A4[0]], [0.33*A2[1], A4[1]], color="gray", ls="dotted", alpha=0.7)
plt.plot([-0.33*A1[0], A4[0]], [-0.33*A1[1], A4[1]], color="k", ls="dotted", alpha=0.7)
plt.plot([A1[0], A3[0]], [A1[1], A3[1]], color="b", alpha=0.5, ls="dotted")
plt.plot([-2*A2[0], A3[0]], [-2*A2[1], A3[1]], color="brown", alpha=0.5, ls="dotted")
plt.legend(labelcolor="linecolor", bbox_to_anchor=(1, 1))
plt.show()
#fig341
u, u_sol, Au=[-1,1], [1,2], [-5,-1]
v,v_sol, Av=[2,1], [1, 0.5], [4,2]
cord=[u, u_sol, Au,  v,  v_sol, Av]
nme=['u', 'u_sol', 'Au',  'v',  'v_sol' , 'Av']
col=['b', 'g', 'skyblue', 'r', 'brown', 'orange']
liw=[1,1,1,2, 3,1]
plt.figure(figsize=(3,3))
for  i in  range(len(cord)):
    plt.arrow(0,0, cord[i][0], cord[i][1], color=col[i], head_width=0.15, lw=liw[i], label=nme[i])
plt.legend(loc="best", labelcolor="linecolor", frameon=False)
plt.show()
#fig411
plt.figure(figsize=(4,3))
x=[(0,3), (0, 5), (0, 7)]
y=[(2, 1), (2, 3), (2, 5), (2, 7)]
xnme=['x1', 'x2', 'x3']
ynme=['y1', 'y2', 'y3', 'y4']
plt.scatter([0,0,0], [3, 5, 7], s=50, c="b")
plt.scatter([2, 2,2,2], [1, 3, 5, 7], s=50, c="orange")
plt.scatter([2,2,2], [3, 5, 7], s=50, c="brown")

for i in range(3):
    plt.arrow(x[i][0], x[i][1], 1.8, 0, head_width=0.1, color="g") 
    plt.text(x[i][0], x[i][1]+0.3, xnme[i], color="b", weight="bold")
    plt.text(y[i+1][0], y[i+1][1]+0.3, ynme[i], color="brown", weight="bold")
plt.text(y[0][0], y[0][1]+0.3, ynme[3], color="orange", weight="bold")
plt.text(0.7, 7.3, "T(=Function)", weight="bold", color="g")
plt.xlim(-0.5, 3)
plt.ylim(-0.5, 9)
plt.text(-0.3, 0, "(x1,x2,x3): Domain\n(y1, y2, y3, y4): Codomain\n(y1, y2, y3): Range")
plt.xticks([])
plt.yticks([])
plt.show()
#fig412
x=[(0, 1), (0,3), (0, 5), (0, 7), (0, 9)]
y=[(2, 1), (2, 3), (2, 5), (2, 7)]
xnme=['x1', 'x2', 'x3', 'x4', 'x5']
ynme=['y1', 'y2', 'y3', 'y4']

f, ax=plt.subplots(1, 3, figsize=(10,3))
ax[0].scatter([0,0,0], [3, 5, 7], s=50, c="b")
ax[0].scatter([2, 2,2,2], [1, 3, 5, 7], s=50, c="brown")
for i in range(1,4):
    ax[0].arrow(x[i][0], x[i][1], 1.8, 0, head_width=0.1, color="g") 
ax[0].set_xticks([])
ax[0].set_yticks([])
ax[0].set_xlim(-0.5, 2.5)
ax[0].set_ylim(-0.5, 8)
ax[0].set_xlabel("(a)", weight="bold", size=12)

ax[1].scatter([0,0,0,0,0], [1, 3, 5, 7, 9], s=50, c="b")
ax[1].scatter([2, 2,2,2], [1, 3, 5, 7], s=50, c="brown")
for i in range(4):
    ax[1].arrow(x[i][0], x[i][1], 1.8, 0, head_width=0.1, color="g") 
ax[1].arrow(x[4][0], x[4][1], 1.8, -1.8, head_width=0.1, color="g") 
ax[1].arrow(x[1][0], x[1][1], 1.8, 1.8, head_width=0.1, color="g") 
ax[1].set_xticks([])
ax[1].set_yticks([])
ax[1].set_xlim(-0.5, 2.5)
ax[1].set_ylim(-0.5, 9.5)
ax[1].set_xlabel("(b)", weight="bold", size=12)

ax[2].scatter([0,0,0,0], [1, 3, 5, 7], s=50, c="b")
ax[2].scatter([2, 2,2,2], [1, 3, 5, 7], s=50, c="brown")
for i in range(4):
    ax[2].arrow(x[i][0], x[i][1], 1.8, 0, head_width=0.1, color="g") 
ax[2].set_xticks([])
ax[2].set_yticks([])
ax[2].set_xlim(-0.5, 2.5)
ax[2].set_ylim(-0.5, 7.5)
ax[2].set_xlabel("(c)", weight="bold", size=12)
plt.show()
#fig431
u, v=np.array([3,0]), np.array([0, 3])
plt.figure(figsize=(3,3))
cord=[u, v, -u, v-u, v-(-u)]
nme=['u', 'v', '-u', 'v-u', 'v-(-u)']
col=['b', 'r', 'navy', 'brown', 'orange']
for i in range(len(nme)):
    plt.arrow(0,0, cord[i][0], cord[i][1], color=col[i], head_width=0.1, label=nme[i])
    plt.text(cord[i][0]+0.1, cord[i][1]+0.1, nme[i], weight="bold", size=12, color=col[i])
#plt.legend( labelcolor="linecolor", bbox_to_anchor=(1,1))
plt.text(0.3, 0.1, r"$90^o$", color="b")
plt.text(-1, 0.1, r"$90^o$",  color="navy")
plt.show()
#fig433
x=np.linspace(0.5, 3, 100)
plt.figure(figsize=(4,3))
plt.arrow(0,0, 4,2, color="r", head_width=0.1)
plt.arrow(0,0, 2,1, lw=4, color="b",alpha=0.5, head_width=0.1)
plt.arrow(0,0, 1, 3, lw=2, color="b", head_width=0.1)
plt.plot(x, -2*x+5, ls="--")
plt.text(1.2, 0.9, r"$90^o$", color="b")
plt.text(0.2, 0.4, r"$\theta$", color="g")
cord=[(1, 0.2), (1,3.2), (3.2, 1.8)]
nme=[r'$b_{proj}$', 'b', 'a']
col=['b', 'b', 'r']
for i in range(3):
    plt.text(cord[i][0], cord[i][1], nme[i], color=col[i], weight='bold', size=11)
plt.axhline(y=0, color='k')
plt.axvline(x=0, color='k')
plt.xticks([])
plt.yticks([])
plt.axis("equal")
plt.show()
#fig434
a,b=np.array([1,0]), np.array([2,1])
b_proj=np.array([2,0])
cord=[a, b, b_proj]
nme=['a', 'b', 'b_proj']
col=['r','b','gray']
llw=[2, 1, 1]
plt.figure(figsize=(3,3))
for i in range(len(nme)):
    plt.arrow(0, 0, cord[i][0], cord[i][1], head_width=0.05, lw=llw[i],color=col[i])
    plt.text(cord[i][0]+0.05, cord[i][1]+0.05, nme[i], color=col[i], weight="bold", size=11)
plt.vlines(2, 0, b[1], ls="dotted", color="b", alpha=0.5)
plt.text(1.7, 0.03, r"$90^o$", color="b")
plt.show()
#fig435
u, v, z, au=np.array([1,0]),np.array([0,2]), np.array([2,2]), np.array([2,0])
cord=[u, v, z, au]
nme=['u', r'v = z-$\alpha$u', r'z = v+$\alpha$u', r'$\alpha$u']
col=['r','b', 'g', 'brown']
llw=[2, 1, 1, 1]
plt.figure(figsize=(3,3))
for i in range(len(nme)):
    plt.arrow(0, 0, cord[i][0], cord[i][1], head_width=0.05, lw=llw[i],color=col[i])
    plt.text(cord[i][0]+0.05, cord[i][1]+0.05, nme[i], color=col[i], weight="bold", size=11)
plt.vlines(2, 0, z[1], ls="dashed", color="b", alpha=0.5)
plt.hlines(2, 0, au[0], ls="dashed", color="brown", alpha=0.5)
plt.text(1.7, 0.03, r"$90^o$", color="b")
plt.show()
#fig436
z, u, v=np.array([7,6]), np.array([4, 2]), np.array([-1,2])
u_proj=2*u
cord=[z,u,v, u_proj]
nme=['z','u','v', 'u_proj']
col=['r','b', 'g', 'gray']
llw=[1, 3, 1, 1]
plt.figure(figsize=(3,3))
for i in range(len(nme)):
    plt.arrow(0, 0, cord[i][0], cord[i][1], head_width=0.1, lw=llw[i],color=col[i])
    plt.text(cord[i][0]+0.3, cord[i][1]+0.3, nme[i], color=col[i], weight="bold", size=11)
plt.plot([v[0], z[0]], [v[1], z[1]], ls="dashed", color="gray", alpha=0.7)
plt.plot([z[0], u_proj[0]], [z[1], u_proj[1]], ls="dashed", color="g", alpha=0.7)
plt.text(0.1, 0.5, r"$90^o$", color="b")
plt.axis("equal")
plt.show()
#fig437
y,u, y_p, y_pOrtho=np.array([-5,3]), np.array([3,3]), np.array([-1,-1]), np.array([-4,4])
cord=[y,u, y_p, y_pOrtho]
nme=['y','u', 'y_p', 'y_pOrtho']
col=['r','b', 'g', 'gray']
plt.figure(figsize=(3,3))
for i in range(len(nme)):
    plt.arrow(0, 0, cord[i][0], cord[i][1], head_width=0.1,color=col[i], label=nme[i])
plt.plot([y[0], y_p[0]], [y[1], y_p[1]], ls="dashed", color="gray", alpha=0.7)
plt.plot([y[0], y_pOrtho[0]], [y[1], y_pOrtho[1]], ls="dashed", color="g", alpha=0.7)
plt.text(-1.2, -0.3, r"$90^o$", color="b")
plt.legend(labelcolor="linecolor", loc=(0.4, 0.6), frameon=False)
plt.axis("equal")
plt.show()

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...