기본 콘텐츠로 건너뛰기

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

turtle로 정사각형 그리기

정사각형 그리기  

turtle로 그림 그리기준비
사각형의 각 꼭지점의 각이 90도라는 것을 사용하여 다음 순서로 그립니다. 
1) 시작점에서 앞으로 이동
2) 1)의 끝점에서 펜을 오른쪽으로 90도 회전
3) 다시 앞으로 이동
4) 3)의 끝점에서 펜을 오른쪽으로 90도 회전
위의 과정은 모서리 한개를 기준으로 양쪽의 선을 만든것으로 “ㄱ”와 같은 모양입니다. 사각형이 완성이 되기 위해서는 위의 과정을 한번더 반복해야 겠지요.

>>> t=Turtle()
>>> t.fd(100)
>>> t.right(90)
>>> t.fd(100)
>>> t.right(90)
>>> t.fd(100)
>>> t.right(90)
>>> t.fd(100)
>>> t.right(90)
>>> t.hideturtle()

위 코드는 같은 명령이 반복되지요. 즉, 앞으로 이동하고 터틀을 90도 회전하는 명령이 4번 반복합니다. 번거롭지요.
동일한 명령을 여러번 반복하는 것은 컴퓨터가 매우 빠르고 정확하게 처리할 수 있는 일들 중의 하나입니다. 그러나 컴퓨터에 그러한 명령을 전달하기 위해서는 컴퓨터가 인식할 수 있게 전달해야 하지요. 뭐 특별한 방법이 아니라 일정한 형식을 맞추기 만하면 됩니다. 이러한 형식을 반복문 (looping)이라고 해요. 또는 회돌이라는 용어로 언급되기도 하죠.  반복문의 형식은 몇가지가 있는데 우선은 위 코드에 적합한 for 문에 대해 살펴보지요.
위 코드를 for 문으로 작성해 보면 다음과 같습니다.

for i in range(4): #(1)
    t.fd(100) #(2)
    t.right(90) #(3)

코드를 작성할 경우 각 명령에 설명을 적을 경우 '#' 기호를 사용합니다. 일반적으로 이 기호 뒤에 첨부되는 설명을 주석이라고 하는데 실제로 컴퓨터는 이 주석문은 그냥 무시합니다. 단지 그 코드 작성자나 실행자만이 알 수 있는 부분이지요. 그럼 위 코드의 (1)번 부터 알아볼까요?
(1)에 range(4)는 새로 접하는 명령이지요. 이 명령은 반복문에서 매우 자주 사용되는 명령입니다. 사실 for --는 다음과 같은 의미를 나타내지요.
 for  이름 in  범위:
범위에 포함된 어떠한 이름을 차례대로 호출합니다. 예를들어
for i in [0,1,2,3]:
의 경우 i는 0이 되고 다음으로 1 이되며 이런 순으로 3까지 됩니다.
>>> for i in [0,1,2,3]:
...:     print(i) #"i를 프린트하세요"라는 함수입니다.
0
1
2
3
위에 따르면 range(4)는 [0,1,2,3]과 같은 의미이지요. 즉, 0부터 3까지를 간단히 나타내기 위해 사용하는 함수입니다.
range(숫자) : 0부터 "숫자-1"까지의 정수를 나타냅니다.
>>> list(range(4)) #list()는 ()내의 있는 결과를 리스트형 즉'[ ]'의 형식으로 나타내는 명령으로 후에 자료형 부분에서 자세히 소개할 것입니다.
 [0, 1, 2, 3]
파이썬에서 숫자는 0부터 출발하지요.
그러므로 위의 코드는 for 문에 포함된 명령들 (2)과 (3)번을 4번 시행하는 명령입니다.
위 코드와 같이 for 문은 명령 코드를 가지고 있어야 완성됩니다. 즉, 다음과 같은 형식을 가지지요.
for 번호 in 범위:
(4칸 들여쓰기)명령(들)
이와같이 for 문과 명령들은 한 세트로 움직입니다. 이렇게 여러명령들이 한세트로 움직이는 부분을 블럭(block)이라고 합니다.
마지막으로 위 코드의 형태는 for의 끝에는 콜론(:)으로 끝나고 줄을 옮겨 앞에 스페이스 4칸을 옯긴다음 다른 명령을 작성하지요. 이것은 다른 줄에 작성된 명령들은 오직 for 문 내에서만 사용된다는 것을 의미합니다. 이것은 파이썬의 코딩을 작성하는 규칙입니다. 즉,
명령 1 :
....명령1에 속하는 명령들

위 코드들 속에는 많은 함수들이 포함되어 있습니다. 즉, 여러개의 함수들을 모아 또 다른 함수들을 만들 수 있지요. 함수를 만들면 같은 명령을 매번 작성할 필요가 없겠지요. 이것이 함수를 만드는 중요한 목적입니다.
파이썬에서 함수를 만들기 위해 'def'라는 단어를 사용합니다. 즉, def라고 입력하면 'def 다음은 함수이다' 라는 것을  알려주는 것입니다.

derf  함수이름(함수에 전달할 것들):
.... 내용

이 경우 역시 def 다음에 한줄 바꿈을 하고 4칸 들여쓰기로 다른 명령들을 작성하죠. 그러면 이 명령들은 함수에만 포함되는 것입니다.
위 정사각형을 그리는 SquareS라는 이름의 함수를 작성해 보면 다음과 같습니다.
def EquisquareS(t, dis):
    for i in range(4):
        t.fd(dis)
        t.right(90)
위 함수에서 t는 도화지이고 dis 사각형 한변의 길이이지요.
이 함수에 의해 다음 명령을 실행해봅시다.
>>> EquisquareS(t, 100) #(1)
>>> t.up() #(2)
>>> t.goto(110, 0) # (3)
>>> t.down() # (4)
>>> for i in range(100): (5)
...:     EquisquareS(t, i) (6)
위 코드중
(1)은 이미 작성한 SquareS함수를 적용하여 변의 길이 100인 정사각형을 그립니다.
(2), (3), (4) 번은 도화지에 그림을 그리는 경우와 같습니다. 즉, 한지점에서 다른 지점으로 흔적없이 이동하기 위해서는 붓을 도화지에서 올리고 다시 그림을 그리는 지점에 붓을 도화지에 다시 내려놓지요. 이러한 절차입니다. 즉,
t.up(): 캔버스(도화지)에서 펜(터틀)을 올럽니다. 
t.goto(x, y):이동할 지점의 좌표,
그림 2.6과 같이 도화지를 모눈종이와 같이 수평(x)과 수직(y)으로 구분하여 보면 이동할 좌표를 할당할 수 있습니다.
t.down(): 올렸던 터틀을 다시 내려놓습니다. 이 명령 후에는 다시 도화지에 그림이 그려지기 시작합니다.
(5)와 (6)은 정사각형의 변의 길이 0 부터 99까지의 정사각형을 반복적으로 그리는 명령으로 turtle에서 생성하는 캔버스를 그림 2.6과 같이 모눈종이로 표현하면 x,y의 모든 간격이 1입니다. 그러므로 이 코드에 의하면 모든 간격이 선으로 겹쳐지기 때문에 색칠된 정사각형으로 나타납니다.

댓글

이 블로그의 인기 게시물

[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$$ 실수...