Search results for '전체'

  1. 2009/10/27 -- Gauss-Seidel Method
  2. 2009/10/09 -- Octave in Vista
  3. 2009/10/09 -- 오렌지색
  4. 2009/09/17 -- 아래아 한글뷰어 2002를 백업하다
  5. 2009/08/31 -- vim modeline 삽질기
  6. 2009/08/31 -- svn set:keyword 삽질기
  7. 2009/08/13 -- 커피와 오렌지주스 (2)
  8. 2009/08/02 -- vim tips : $HOME / ctags / :A
  9. 2009/07/05 -- Sealed Macro
  10. 2009/06/09 -- 분류정리 (2)

Gauss-Seidel Method

2009/10/27 20:46
1. 방정식의 근 : 대수적 방법과 Iterative Method

방정식(Equation) 으로부터 근을 구할때 '근의 공식'등이 존재하는 경우 일반해가 있다고 하는데, 이러한 해를 대수적 해라고 한다. 만일 대수적인 해가 존재할 경우 근을 구하는 방식은 매우 쉽다. - 단지 공식에 넣으면 된다!

Iterative Method는 근을 구하는 또 다른 방법이다. 이 방법은 근에 근접하는 값을 만들어내는 알고리듬이 있고 이 알고리듬을 반복하여 근과의 차이 (tolerrence 혹은 error)가 얼마 이하가 되면 반복을 멈추어 근을 구하는 방법이다. 유명한 Iterative Method 중에는 Newton-Raphson 방법이 있고 Gauss-Seidel Method의 모티브가 되는 Simple Fixed-point Iteration Method가 있다.


2. Simple Fixed-point Iteration Method

Simple Fixed-point Iteration Method는 개념이 사실 단순하다.
f(x) = 0
이라는 방정식의 근을 구한다고 하자. 위의 방정식 양변에 x를 더하여 f(x) + x = x 라는 새로운 식을 만들고 g(x) = f(x) + x 라고 하면 우리가 구하는 식은
g(x) = x
라는 식의 방정식이고 이것은 그래프적으로
y = g(x)라는 그래프와 y = x 라는 그래프의 교점
임을 알수 있다.

simple_fixed

위 그림에서 f(x) = sqrt(x) - x = 0 을 구하는게 원래 목적이었다면 g(x) = sqrt(x)라고 하고 g(x) = x의 해를 구하는것과 f(x) = 0 의 해를 구하는게 같음을 알 수 있다.

이제부터가 이 방법의 재미난 점인데, 그림과 같이 x(i+1) = g( x(i) ) 라고 하고 i를 증가하면 x(i+1)이 y=g(x)와 y=x의 교점에 다가감을 알수 있다. 그리하여 x의 sequence가 Cauchy Criterion을 만족하면 (즉 어떤 i 가 있어서 |x(i+1) - x(i)| < tolerance) 그때의 x(i+1)를 해라고 할수 있게 된다.

위 내용을 Octave(matlab) 코드로 짜보면 다음과 같다.
(Language : perl)
g = inline( 'sqrt(x)', 'x' );
tol = 1.0e-7;

i = 1;
x(i) = 0.2;
while true
    x(i+1) = g( x(i) );
    if( abs(x(i+1) - x(i)) < tol )
        break;
    end
    i = i + 1;
end
i, x(i+1)

그러면, 24번만에 해를 도출해 낸걸 알수 있다
(i=24, ans=1.0000 뭐 이런 비슷한 값을 출력한다.)

물론 항상 해에 접근하는것은 아니고 '수렴조건'이 있는데, 그것은 |g'(x)| < 1 이다.


3. Gauss-Seidel Method

Gauss-Seidel Method는 Simple Fixed-point 방법과 매우 유사하다. 다른 점은 방정식이
1. multicomponent 인 경우
2. linear system 인 경우
인데, 간단히 말하면 '연립 일차방정식'의 경우에 해를 '반복적'으로 구하는 방법이다.

Applied Numerical Methods with MATLAB 이라는 책에 있는 예제인
3x - 0.1y - 0.2z = 7.85
0.1x - 7y - 0.3z = -19.3
0.3x - 0.2y + 10z = 71.4
의 해를 Gauss-Seidel Method로 구하는 matlab 코드를 보면,
(Language : perl)
% from 3x - 0.1y - 0.2z = 7.85
% x = (7.85 + 0.1y + 0.2z)/3
f = inline('(7.85 + 0.1*y + 0.2*z)/3', 'y', 'z');

% from 0.1x - 7y - 0.3z = -19.3
% y = (-19.3 - 0.1x + 0.3z)/7
g = inline('(-19.3 - 0.1*x + 0.3*z)/7', 'x', 'z');

% from 0.3x - 0.2y + 10z = 71.4
% z = (71.4 - 0.3x + 0.2y)/10
h = inline('(71.4 - 0.3*x + 0.2*y)/10', 'x', 'y');

i = 1;
tol = 1.0e-7;
x(i)=0; y(i)=0; z(i)=0;
while true
    x(i+1) = f( y(i), z(i) );
    y(i+1) = g( x(i+1), z(i) );
    z(i+1) = h( x(i+1), y(i+1) );

    if( abs(max( [x(i+1)-x(i) y(i+1)-y(i) z(i+1)-z(i)] )) < tol )
        break;
    end
    i = i + 1;
end
i, x=x(i+1), y=y(i+1), z=z(i+1)

만일
x(i+1) = f( y(i), z(i) );
y(i+1) = g( x(i+1), z(i) );
z(i+1) = h( x(i+1), y(i+1) );
부분이
x(i+1) = f( y(i), z(i) );
y(i+1) = g( x(i), z(i) );
z(i+1) = h( x(i), y(i) );
가 되면, 즉 현재 루프에서 적용된것값을 적용되자마자 써먹는게 아니고 루프를 다 돌고 사용한다면, 그 방법을
Jacobi iterative method 라고 한다.

Simple fixed-point iterative method처럼 Gauss-Seidel도 수렴조건이 있는데, 연립일차 방정식을 matrix로 나타냈을때 그 matrix가 'diagonal dominant' 하면 된다.

수학 이야기 Octave, 수학

Octave in Vista

2009/10/09 22:48
Octave(이하 옥타브)는 Matlab에 대응하는 오픈소스 프로그램이다.

최근 학교에서 Matlab을 이용한 수치해석이나 확률과정 개론을 배운다.
그런데 Matlab은 고가의 소프트웨어라서 집에서는 오픈소스 프로그램인 옥타브를 사용한다.

이 글은 3.2 버전에 맞춰 작성되었다.
옥타브 3.0버전에서 고민하던 문제들이 3.2버전에서 단박에 풀려서 3.2버전을 사용하기를 강력히 추천한다.

먼저 옥타브는 커맨드라인 프로그램이다. 그래서 옥타브가 아쉽다기보다는 윈도용 커맨드라인 환경이 아쉬운 경우가 종종있다. 가장 아쉬웠던것은 글꼴이었고, 옥타브 3.0버전에서는 '삐'거리던 스피커음도 불만이었다.

먼저 커맨드라인 글꼴바꾸기
http://smallvoid.com/article/winnt-cmd-add-font.html

내경우에는 HKEY_LOCAL_MACHINE \SOFTWARE \Microsoft \Windows NT \CurrentVersion \Console \TrueTypeFont 에서 나눔코딩고딕을 콘솔 폰트로 설정해서 사용하고 있다.
cmd_font


그리고 커맨드라인에서 PC스피커 (bell service) 끄는 방법.
http://superuser.com/questions/10575/turning-off-the-cmd-window-beep-sound
커맨드라인에서 벨을 끄는 방법은 여러가지 있는데 내가 사용했던 방법은 아래와 같다.
net start beep
그런데 이것은 재부팅때마다 재설정을 해야했고, 다음은 재부팅마다 재설정을 할 필요가 없게 만드는 커맨드다.
sc config beep start= disabled

이 방법 말고도 '장치관리자'를 통해 beep 을 제거하는 방법이 있다. 제어판의 장치관리자를 실행한후에 보기 - 숨김 장치 표시 를 해서 beep 장치를 '사용안함'으로 설정하는 방식이다.
hide_device
stop_beep
다행히도 옥타브 3.2버전의 less는 '삐'거리는 소리 대신에 윈도 효과음을 사용하고 그것도 똑똑히 사용해서 더이상 저 설정이 필요없게 되었다.

나는 cygwin의 bin 디렉토리에 path가 걸려있어서 자주사용하는 프로그램들은 그곳에 배치스크립트를 작성해 넣어둔다. 옥타브의 경우는 cygwin/bin/octave.bat 파일로 넣어두어사용하며 그 내용은 다음과 같다.
cd C:\Users\pok\Documents\workspace\Octave
"C:\Octave\3.2.2_gcc-4.3.0\bin\octave-3.2.2.exe"
rem start C:\Users\pok\Documents\Utils\Console2\Console.exe -c C:\Users\pok\Documents\Utils\Console2\console_octave.xml
저렇게 하면 내 'workspace'가 pwd(present working directory, current working directory라 하여 cwd라고도 한다)로 설정되어 .m 파일등을 작성할때 편리하다.

아래 주석(rem) 되어 있는것은 cosole2라는 꽤 훌륭한 cmd 대체 프로그램을 이용할때인데, 이놈이 한글입력이 되지 않아 현재는 사용하지 않는다.

3.0버전에서는 사용자 디렉토리 밑에 무조건 'octave'라는 폴더를 만들어버려서 프로그램실행 창에서 'octave'라고 치면 그 디렉토리가 열렸다. 3.2버전에서는 그런만행을 하지 않아 꼭 octave.bat이라고 칠 필요없이 octave라고만 쳐도 되서 편리하다.

다음은 내 local home directory에 있는 .octaverc 파일의 내용.
addpath('C:\Users\pok\Documents\workspace\Octave');
edit("EDITOR", "C:\\Users\\pok\\Documents\\Utils\\Vim\\vim72\\gvim.exe %s -c cd C:\\Users\\pok\\Documents\\workspace\\Octave -c \"30vs .\" -c \"wincmd w\"");
edit("HOME", "C:\\Users\\pok\\Documents\\workspace\\Octave");
edit("LICENSE", "BSD");
#set(0,'defaulttextfontname', 'Malgun Gothic');
path에 내가 '.m'파일들을 모아놓고 있는 C:\Users\pok\Documents\workspace\Octave 를 추가했고
"EDITOR"에는 주로 사용하는 에디터인 vim 을 .m 파일들을 나열하여 열리게 설정하였다. "LICENSE"는 새로 만드는 .m 함수의 라이센스를 어떤걸로 할건지 여부를 정하는것은 기본은 GPL이고 나는 BSD로 라이센스를 변경했다.

3.0 버전에 plot의 기본글꼴 설정이 구리구리하여 set을 이용하여 기본글꼴을 설정했는데, 3.2버전에서는 wgnuplot에서 설정하고 저장할수 있게 바뀌었다.

멀티플랫폼/실행환경 Octave, 수학

오렌지색

2009/10/09 22:34
난 오렌지 색이 참 좋다.
그 색은 흰색에도 잘 어울리고 조금 어두운 회색까지도 잘 어울릴줄 아는 색(?) 이다.

블로그 테마를 바꿨는데, 이 테마가 상당히 인기 있는 테마인지, 여러 블로그에서도 많이 사용된다.
뭔가 좀 그래서 header와 wordpress 로고를 오렌지 색으로 바꿔봤다.

역시 오렌지색은 좋다.

일상 이야기 주저리

아래아 한글뷰어 2002를 백업하다

2009/09/17 01:32
한컴이 하는짓으로 봐서 언젠가 '한글뷰어 2002 배포를 전면 금합니다!' 할지도 모를것 같아서 백업받았다.
정말 이게 뭐하는 짓인지....

MS처럼 부자가 아니라서 뷰어를 통해서라도 돈을 벌어야해서, 광고를 달았다고 치자.
그런데 인쇄하는데 '당신은 뷰어를 사용하는 사람이에요~' 라는 메시지를 남기는거나, 뷰어이니까 내용을 클립보드에 복사하지 못하게 하는것은 도대체가 납득이 가질 않는다. 그리고 그러한 뷰어를 배포하는 회사의 제품을 정부표준문서 포멧으로 정한것도 납득이 가질 않는다.

한 회사에 대해 이토록 짜증내본적은 별로 없었는데 이쯤 되면 육두문자가 튀어나올법하다.

일상 이야기 망하든가, 뭐하자는건지, 주저리, 찌질대마왕

vim modeline 삽질기

2009/08/31 01:23
코딩컨벤션 삽질기 2탄은 vim의 modeline 삽질기다.

제일 삽질했던것이 // vim 과 /* vim */ 의 설정 포멧이 다르다는것을 모르고 안된다고 이것저것해봤던것.
그것에 대한 차이점을 자세히 설명해놓은곳이 이곳이다.

두번째 삽질은, // vim 위치의 문제. 이 mode line 주석이 있을곳은 소스의 맨 처음이거나 맨 마지막이어야한다!
이걸 몰라서 우엉삽질을 했다.

참고로, modeline을 사용하려면 set modeline(혹은 set ml)이 설정되어 있어야한다. 일반적인 배포판에서 이것이 설정되어있는지는 모르겠으나, win32 gvim은 기본으로 설정되어 있더라.

결론적으로, 나는 소스의 맨 마지막줄에
// vim: ts=4:sw=4:nowrap
같은 modeline을 설정한다.

멀티플랫폼/개발환경 vim

svn set:keyword 삽질기

2009/08/31 01:08
svn에는 property라는것이 있다. 그중에서 set:keyword property가 있는데 이것을 이용하면 커밋에 대한 정보를 소스파일에 심을 수 있다. 이에 대한 정보들은 상당히 많다.


간단하게 Id keyword만 설정해놓고 $Id$라고 치면, 왠만한 정보는 다 실리는데... 문제는 여기에 나오는 날짜가 Z(Zulu Time - UTC zero time을 기준, 위키페디아참조)라서... 영 못읽어 먹겠더라.

그런데 특이하게도 $LastChangedDate$는 또 local zone을 기준으로 시간을 기록해준다. 여기에 대한 분분한 의견들이 있는데, 어쨌든, $Id$ 시간과 $LastChagnedDate$가 다른 시간을 기록해준다는것은 사실이다.

그래서 그냥 $Id$ 안쓰고 다음과 같이 쪼개 쓰기로 했다.
// $LastChangedBy$
// $LastChangedDate$
// $Rev$

이것때문에 svn 커밋을 10번가까이 반복했다는...-_-

멀티플랫폼/개발환경 svn, UTC

커피와 오렌지주스

2009/08/13 22:32
나는 커피를 참 좋아한다.

나에게 있어서 커피를 먹기 시작한다는 행위는 어떤일을 정리한다는 의미와 거의 동일하다. 그러니까, 담배를 피우는 사람이 담배를 한까치 피우는 이유와 비슷하다.

많이 먹을때는 하루에 10잔가까이 먹었다.

커피를 많이 먹으니까, 치아가 좋지 않아졌다. 그리고 왠지 건강해지지 않은것 같은 느낌...
그래서 커피를 줄이기 위해 커피를 마시는 동안 다른 음료를 같이 마시는것을 시도했다.

오렌지주스는 별로 좋아하지 않은 음료였다. 그런데 이걸 커피와 같이 먹으니까, 의외로 좋다. 오렌지주스를 한모금 마시고 커피를 조금 홀짝거리면, 시큼한 뒤끝이 깨끗해지는것 같다.

따뜻한 커피하나 들고 음악 한곡 들으면서 정리하는 즐거움은 시큼한 오렌지주스와 그 뒷맛을 거두어주는 커피 한모금으로 계속 유지할수 있게 되었고 커피 마시는 량도 하루에 2잔정도 줄였으니, 대성공한 시도다. 뿌듯하다.

일상 이야기 여유, 커피

vim tips : $HOME / ctags / :A

2009/08/02 02:57
vim의 환경변수중에 자주사용하는 환경변수로 $VIMRUNTIME과 $HOME 이 있다. 만일 $HOME이 정해지면 재미있는것들을 많이 할 수 있는데, 예를들면 ctags 파일이나 session 파일들을 한곳에 몰아둘 수 있다.

cygwin 터미널용 vim과 gvim win32 버전을 동시에 사용하고, vimrc파일을 공유할경우 - 내 경우는 win32 vimrc를 ~/.vimrc 파일로 심볼릭링크를 걸어서 공유한다 - $HOME 변수를 설정하는것이 조금 곤란하다. 왜냐하면 시그윈과 윈도우즈가 디렉토리를 다루는 방식이 상이하기 때문이다. 내 경우는 그래서 꼼수로 $VIMRUNTIME 변수를 이용해서 아예 그곳에 set_home.vim 파일을 따로 두어 각각읽어들이게 했다. 그래서 시그인용 vim은 /usr/share/vim/vim72/set_home.vim 을 읽고 (그곳에서 let $HOME="/cygdrive/c/Users/pok/Documents") gvim win32는 다른 set_home.vim을 읽어들인다.

(Language : perl)
source $VIMRUNTIME/set_home.vim
function MakeTags()
    let current_dir = getcwd()
    let filename = substitute( substitute(current_dir, "[*:*|*' '*]", "_", "g"), "[*\/*|*\\*]", "_", "g" )
    let filename = $HOME . '/workspace/ctags_cscope/' . filename . '.ctags'
    execute '!ctags -R -f ' . filename . ' "' . current_dir . '"'
    execute 'set tags+=' . filename
endfunction
function AddTags()
    let ctags_files = substitute(glob($HOME . '/workspace/ctags_cscope/*ctags'), "\n", ",", "g")
    execute 'set tags+=' . ctags_files
endfunction
call AddTags()
au VimEnter * :cd $HOME
let g:alternateSearchPath = 'sfr:../source,sfr:../src,sfr:../include,sfr:../inc,sfr:../,sfr:./include'

MakeTags라는 함수는 현재 작업하는 곳의 ctags 파일을 작업디렉토리에서 공백이나 :, /, \ 등의 문자를 _로 바꾸어 $HOME/workspace/ctags_cscope 디렉토리에 만들어저장하는 역할을 한다. AddTags라는 파일은, 처음에 vim을 로딩할때 만들어둔 ctags 파일들을 읽는 역할을 한다. 소스를 분석할 디렉토리에서 :call MakeTags()만 호출하면, ctrl+]등을 자유롭게 이용할수 있다.

소스분석에서 매우 자주사용하는 플러그인이 a.vim이라는 플러그인인데, ./include/a.h , ./a.cpp 이렇게 파일들이있다면 :A 커맨드가 원하는데로 되지 않는다. cpp와 h 파일이 a.vim이 기본으로 지원하는 SearchPath에 없어서 생긴 문제인데, g:alternateSearchPath를 변경하면 원하는 SearchPath를 추가할수 있다. 마지막에 있는 sfr:../,sfr:./include 가 위의 문제를 해결하기위해 기본 SearchPath에서 추가한 설정이다.

마지막으로, 현재 vim의 view나 설정들(열어놓은 파일들이나 버퍼의 현재 커서 줄)을 저장하는 방법이 있는데, session을 저장하는 방법이다. :mks 원하는이름.vim 이라고 하면 세션이 저장되고 부르려면 :source 원하는이름.vim, 덮어저장하련 :mks! 원하는이름.vim 이라고 하면 된다. 내경우에는 $HOME 디렉토리에 세션들을 모두 저장해놓고 있으며, vim을 시작하면 자동으로 cwd를 $HOME으로 변경시켜놓아서( au VimEnter * :cd $HOME ) :source 이름.vim을 하면 바로 저장해놓은 세션들을 읽어들인다.

멀티플랫폼/개발환경 vim

Sealed Macro

2009/07/05 06:50
모던 C++ 디자인이라는 책은 봐도봐도 새로운 내용이 나온다.
그책에서 건진내용중에 하나인데, 클래스가 상속을 받을때 virtual table이 그냥 생기는것이 아니라 virtual 함수가 있을때만 생긴다는것 - '단위전략'은 CRTP를 쓰기위해 다중상속을 활용하는데, 부모클래스에 virtual 함수가 있으면 부모마다 vtable이 생겨 오버헤드라는 이야기 - 이다.

나는 소멸자를 virtual로 만들지 않고 상속받을때의 무시무시함을 겪은적이 있다. 그래서 소멸자는 항상 virtual - 이것이 상속받을이유가 없는 클래스라도 - 로 하곤 했었는데, 그럴때마다 vtable을 만들거라 생각하니 찝찝했다. 그렇다고 상속을 허용하면서 소멸자를 virtual로 안하는것은 정말 귀신피하려다 호랑이 만나는꼴 당할수 있는일이라, 상속을 못받게 하는방법을 찾아보았다.

몇가지 좋은정보들을 찾았는데, 전부 비얀할아버지가 작성한것을 기반으로 하고 있고 응용버전으로 birdkr님의 템플렛버전이 있었다. 그런데 gcc에서는 friend T는 안된다. - 사실, friend T는 표준 C++  문법이 아니다.

좀더 찾아보니 Boost Mailing List 에도 비슷한 주제가 올라왔었고 friend T 문제를 어느정도 해결한 방법을사용한 최종버전도 있더라 - 저것이 표준 Boost Library로 승인되었는지는 잘 모르겠다.

하늘은 뒤지는자의 편이라 했던가. (음?)
써먹기에는 영 마음에 들지 않아서 더 뒤져보니 그럭저럭 마음에 드는 버전을 찾을수 있었다. 옮겨보면,

(Language : cpp)
#define SEALED(className) \
    className ## Sealer \
        { \
            private: className ## Sealer(){}; \
            friend class className; \
        }; \
        class className : virtual private className ## Sealer \

class SEALED(MyClass) {};

무엇보다 비록 매크로지만 - 아니, 매크로라서 - 사용에 있어서 훨씬 직관적인 장점이 있다.

프로그래밍 C++, 프로그래밍

분류정리

2009/06/09 03:46
뭔가 글을 써 놓고 그것이 보존되고 활용되는걸 지켜보는건 재미있고 흐뭇하다.
특히 시험기간처럼 막막한 기간에는 옛날글들이 작은 웃음을 띄게 해주는 고마운 존재다.

오랫만에 블로그 분류를 정리했다.
이 블로그를 운영한지 벌써 3년 가까이 지난걸 보면, 세월은 잘도 흐른다.

윈도우 / 리눅스 분류 이외에 멀티플랫폼이라는 분류를 추가했다.
오픈소스 프로그램 덕분에 플랫폼에 덜 구애받게 된것은 정말 개발자나 유저로써 행운이다.

영화나 드라마, 만화등을 문화산업이라는 분류로 정리했다.
문화산업이라는게 부정적인 어감이 많은 단어이긴 하지만, 내가 접하는 많은 '컨텐츠'가 역시 대량 생산된 산업의 생산물이라는것도 받아들이는게 맞는것 같다.

컴퓨터 공학이나 그런것들은 프로그래밍으로 통합해버렸다.
컴퓨터에 관련된 잡담이나 그런것도 그냥 다 프로그래밍으로 밀어넣으려고 생각중이다.
예전보다 훨씬 컴퓨터에 대한 낭만이 사라진건 사실이지만, 요거이가 또 재미있는것도 사실이다.

30이 되기전에 좀더 여유를 가지고, 내가 해왔던것들을 다듬고 돌이켜보고 싶은데 현실속 나는 내일의 기말고사를 걱정하는 대학생이다. 예전의 내 고민들을 부정하는것은 아니지만, 좀더 치열하고 밀도높게 살지못한것이 후회되는건 어쩔수 없는것 같다.

여유라는게 마음먹기 나름이라, 이런식의 마음가짐이면 평생 쫓기듯이 살것이 뻔하지만, 여하튼 빵점은 면해야하지 않겠는가? (-_-털썩..)

여하튼, 시험공부중에 예전글들을 읽으며 여유한번 부려봤다.
(근데, 이글 바로 전 '일상이야기'가 시험기간 이라는 글이네...-_-)

일상 이야기 기말고사, 주저리