Saturday, August 24, 2013

코막고 만두실신 (고교)

신프신은 두신코...(A)
신마신은 두코신...(B)
코프코는 두코코...(C)
코마코는 마두신신...(D)

갑자기 마두신신이라는 단어가 떠올라 올려 본다. 나는 저걸 외운 적이 없는데, 시험에 나올 때마다 유도해서 풀었기 때문에...;

요새는 마지막 문장은 코막고 만두실신이라고 외우기도 한다고(...)

실신하는 김에 sin+sin=2syncope/씽커피/...(A)

무엇보다 암기법이 별로 의미 없는 이유는, 좌변과 우변의 각이 다르고(A, B 대 \({A+B}\over{2}\), \(\frac{A-B}{2}\) 그나마 암기법으로 기억해 낸 공식이 중간 단계 정도라서 바로 적용할 수 있는 경우는 별로 없기 때문이었던 거 같다.

삼각함수 공식은 어떻게 외워도 거지 같다.

유용한 '감'은 sin은 sin/cos이 교차되는 꼴로 나타나고, cos은 cos/cos 또는 sin/sin 꼴로 나타난다는 것 정도.

유도를 하려면 덧셈정리 (1), (2) 딱 두개만 외우면 된다.
\(\sin\left( A+B \right) = \sin A \cos B + \cos A \sin B\cdots\cdots\left(1\right)\)
\(\cos\left( A+B \right) = \cos A \cos B - \sin A \sin B\cdots\cdots\left(2\right)\)
\(\sin\left( A-B \right) = \sin A \cos B - \cos A \sin B\cdots\cdots\left(3\right)\)
\( \cos \left( A - B \right) = \cos A \cos B + \sin A \sin B \cdots \cdots \left( 4 \right) \)
B 대신 -B를 대입해서 (1)에서 (3)을 얻고, (2)에서 (4)를 얻는다.

그리고 이 네 식을 적절히 더하고 빼서 다음을 얻는다.
\( \sin \left( A + B \right) + \sin \left( A - B \right) = 2 \sin A \cos B \cdots \cdots \left( 5 \right) = (1) + (3) \)
\( \sin \left( A + B \right) - \sin \left( A - B \right) = 2 \cos A \sin B \cdots \cdots \left( 6 \right) = (1) - (3) \)
\( \cos \left( A + B \right) + \cos \left( A - B \right) = 2 \cos A \cos B \cdots \cdots \left( 7 \right) = (2) + (4) \)
\( \cos \left( A + B \right) - \cos \left( A - B \right) = -2 \sin A \sin B \cdots \cdots \left( 8 \right) = (2) - (4) \)
이것이 마두신신의 정체다(...)
애초에 이 공식(5, 6, 7, 8)을 만든 이유는 삼각함수의 곱을 합으로, 합을 곱으로 전환하는 데 있기 때문에, (1) ~ (4)를 더하고 빼는 모든 조합이 필요하지 않다.
곱을 합으로 만드는 목적에 충실하기 위해서는 양변을 2로 나눠야 할 텐데, 그러면 (5) 같은 경우
\( { 1\over 2 } \left( \sin \left( A + B \right) \right) + \sin \left( A - B \right) = \sin A \cos B \)
와 같은 모양이 될 것이다. 나머지는 알아서...

이제 (5)~(8)의 역방향의(!) 공식을 유도해 보자.
\( \alpha = A+B, \beta = A-B \)
이 치환 아이디어는 (1)~(4)에서 (5)~(8)을 얻어낸 것과 본질적으로 같기 때문에 생각해내기가 어렵지는 않을 것 같다(함수를 우함수와 기함수로 분리할 때도 비슷한 트릭이 쓰인다.).

\( \sin \alpha + \sin \beta = 2 \sin {{\alpha + \beta}\over 2} \cos {{\alpha -\beta} \over 2} \cdots \cdots \left( 9 \right) \)
\( \sin \alpha - \sin \beta = 2 \cos {{\alpha + \beta}\over 2} \sin {{\alpha -\beta} \over 2} \cdots \cdots \left( 10 \right) \)
\( \cos \alpha + \cos \beta = 2 \cos {{\alpha + \beta}\over 2} \cos {{\alpha -\beta} \over 2} \cdots \cdots \left( 11 \right) \)
\( \cos \alpha - \cos \beta = -2 \sin {{\alpha + \beta}\over 2} \sin {{\alpha -\beta} \over 2} \cdots \cdots \left( 12 \right) \)

이걸 잘 쓰면 적분하기 어려운 꼴이 치환적분이나 부분적분이 가능하게 되는 신기한 경험을 할 수 있다.

쓰는 김에 좀 더 보충하면,

(배각 공식)
\( \sin 2x = 2\sin x \cos x \cdots \cdots\cdots \cdots\cdots \cdots\cdots \cdots\cdots \cdots\cdots \cdots (13):\) (1)에서 \(A=B=x \)
\( \cos 2x = \cos^2 x - \sin^2x =1-2\sin^2x = 2\cos^2x -1 \cdots \cdots (14):\) (2)에서 \(A=B=x\) 그리고 \(\sin^2x + \cos^2x=1\)
\( \begin{equation} \begin{split}
\tan 2x &= {\sin 2x \over \cos 2x} = {2\sin x \cos x \over \cos^2 x - sin^2 x}
={2\sin x \over \cos x - \sin x \tan x }  \\
&= {2\tan x \over 1- \tan^2 x}  \cdots \cdots (15) \\
&= {1 \over 1-\tan x} - {1 \over 1+ \tan x}
\end{split} \end{equation}\)


(15)까지가 tan의 배각공식이고 그 밑엣줄은 그냥 써 봤다(...)
사실 좀 더 일반적인 형태인 tan의 덧셈정리에다가 그냥 A=B를 대입해도 된다.

\(\cos 2x\)는 cos에 대한 식으로도, sin에 대한 식으로도 변형할 수가 있는데,
아래 3배각 공식은 sin은 sin에 대한 식으로, cos은 cos에 대한 식으로 정리한 것이다.


(3배각 공식)
\( \begin{equation} \begin{split}
\sin 3x&=\sin\left(x+2x\right)=\sin x \cos 2x + \sin 2x \cos x \\
&=\sin x-2\sin^3x+2\sin x(1-\sin^2x) \\
&=3\sin x - 4\sin^3x \cdots\cdots\cdots (16)
\end{split}
\end{equation}
\)
\(
\begin{equation}
\begin{split}
\cos 3x&=\cos\left(2x+x\right)=\cos 2x \cos x -\sin 2x \sin x \\
&= (2\cos^2x-1)\cos x-2\sin^2 x \cos x = 2\cos^3 x - \cos x -2\cos x + 2\cos^3 x\\
&= 4\cos^3 x - 3\cos x \cdots\cdots (17)
\end{split}
\end{equation}
\)

(반각 공식): 배각 공식의 역이 아니라, cos에 대한 배각공식에서 나온다.
\(\sin^2 {x \over 2} = {1-\cos x \over 2}\cdots\cdots (18))\)
\(\cos^2 {x \over 2} = {1+\cos x \over 2}\cdots\cdots (19)\)
\(\tan^2 {x \over 2} = {1-\cos x \over 1+\cos x} \cdots\cdots (20)=(18)/(19)\) 다음 포스트(csc 적분)에 등장한다.


3배각 공식에서 \(F(x)=\sin x, G(x)=\cos x\)라 하면
\(F(3x)=3F(x)-4{F(x)}^3, G(3x)=4{G(x)}^3-3G(x)\)
\(y=e^{ax}\)꼴이면 뭔가 쓸모 있어 보이지 않는지...?

Friday, August 23, 2013

엑셀 연번 매기기 (자동으로 입력되는 일련번호)

요약

=IF(ROW()=1, [시작번호], OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())), -1,0)+1)


재료

  • if: if(조건, then절, else절)
  • offset: offset(기준 셀, y_offset, x_offset)
  • indirect: indirect("$A$27 같은 절대주소 문자열")
  • address
  • row: 현재 셀의 행번호를 얻는다.
  • column: 현재 셀의 열번호에 대응되는 수를 얻는다. 예를 들어 C열은 3이다.

설명

간단히는 상대주소를 써서 다음과 같이 쓸 수도 있다(현재 주소가 B6인 경우를 예로 듦).
=if(isblank(b5
또는 isblank 대신 숫자인지 여부를 이용해서
=if(isnumber(

Note

ADDRESS()로 얻는 값은 절대주소(절대참조)를 나타내는 문자열이다.

한계

없음. 

Graphics 초기화 오류 시

지난 번 포스트 후 몇 달(?)이 지났다.

이제는 이벤트 핸들러 없이 일일이 redraw해주기가 불가능하게 되었으므로
(규모로도 그렇고 로직으로도 그렇고)

지난 번 포스트의 문제점을 해결해야만 하게 되었다.

해결책은 간단하다.

이벤트핸들러를 등록해 주는만큼 해제도 해 줘야 한다.

창을 닫고 나서도 계속 등록된 상태라면 Graphics 객체 초기화에 오류가 발생한다.

Closed나 Closing 이벤트에 핸들러를 등록하고, 그리기 핸들러를 -= 연산자로 해제해주는 코드를 작성하면 된다.

Referer를 만들 때 +=, 없앨 때 -=,

편집창을 열 때 +=, 닫을 때 -=

이렇게 쌍을 유지하는지 감시(?)해야 한다.

Tuesday, August 6, 2013

Scheme의 define 키워드

SICP (structure and interpretation of computer programs)를 다시 읽어보고 있는데 define이란 키워드에 문제가 좀 있는 것 같다. 또 C류에 익숙한 사람에게는 이 책이 설명하는 방식(또는 순서)이 오해를 부를 수 있을 것 같다.
(define x 1)
이건 C로 따지면
int x=1;
이라 할 수 있을 것 같은데,
(define (square x)
    (* x x))
와 같이 함수프로시저 선언을 하는 경우 define의 기능이 너무 다양한 게 아닌가 생각하게 된다. 하나는 인스턴스화된 객체고 다른 하나는 그냥 선언인데 말이지...
물론 이라 할 수도 있고
(define x 1)을
   int x() { return 1; }
에 가깝다고 해석할 여지도 있긴 하지만 그런 경우 lambda를 쓰는 게 더 정확한 거 아닌지.
책에서, substitution model에서 environment model로 evaluation model을 바꿀 때가 되어서야 (필요에 의해서) formal parameter가 포함된 define은 syntactic sugar일뿐이라는 것을 밝히는데, 처음부터 그런 syntactic sugar를 자제했으면 앞부분에 나오는 make-xxx류의 이해가 더 쉬웠을 것이다.
예를 들어
(define make-withdraw
    (lambda (balance)
        (lambda (amount)
            (set! balance (- balance amount))
            balance)))
이렇게 쓰는 것이 lambda가 두 번 등장하기 때문에 아래처럼 쓰는 것보다 의도가 더 명확해진다.
(define (make-withdraw balance)
    (lambda (amount)
        (set! balance (- balance amount))
    balance))

프로시저, 묶인다(binding), referentially transparent 등 좋은 개념들이 많이 나오지만 스크립트 언어를 자작하지 않는 한 대부분의 사람에게 읽고자 하는 의욕이 안 생기게 하는 책일 것 같다. ㅋ

지금 알고 있는 걸 그때도 알았더라면...

창 핸들을 만드는 동안 오류가 발생했습니다

System.ComponentModel.Win32Exception was unhandled   MyForm w = new MyForm IntPtr handle = wnd.Handle;   // Exception occurs here class MyFo...