매틀랩입문 2 차시 매틀랩내장함수 내장은창자 (intestines) 가아니다. 내장된 built-in 뜻이다. 내장함수의반대짝은외장함수가아니라사용자-정의함수 (user defined function) 이다. 매틀랩내장함수는이진수 ( 기계어 ) 로되어소스코드가보이지않는것과매틀랩스크립트로작성된함수 (function_name.m) 형태가있다. 예를들어 type min 하면내장함수라고나오며스크립트를보여주기못한다. >> type min 'min' 은 ( 는 ) 내장함수입니다. 반면 type fzero 로하면길고도복잡한 fzero.m 함수파일을보여준다. >> type fzero function [b,fval,exitflag,output] = fzero(funfcnin,x,options,varargin) %FZERO Single-variable nonlinear zero finding. % X = FZERO(FUN,X0) tries to find a zero of the function FUN near X0, ( 이하생략 ) 도움말기능사용하기 매틀랩에서필요한여러내장함수를알아보기전에매틀랩에서중요한도움말기능을살펴본다. 명령창에서 help 찾는말하면된다. 그러나이보다는당연히위에있는 'help' 메뉴를여는것이당연히할것이다. 영어를조금만하면 ( 사실이런영문은영어가아니라각자의전공언어이다. 여기선매틀랩이나프로그래밍, 누구는전기, 전자, 생화학등,,,,) 도움말을찾자보고어떤일이든지성공적으로수행할수있다. 여유와느긋함과할수있다는자신감이있으면...
가장중요한덕목이다 ( 프로그래밍에서또다른전공에서또인생에서... 인생에도도움말기능이 있으나이를사용하지않는다. 사용할줄도모르고...) 수학함수는프로그램언어마다다르므로사용하기전에꼭확인해보고써야한다. 다음은매틀랩내장함수를구분하여간단한설명을붙인다. 1. 기본수학함수 abs(x) sqrt(x) 이는모르면 x^0.5 x^(1/2) 로해도되지만... rem(x) 이는 remain 의줄인말로 remarks 의약어인 rem( 주석 ) 과는다르다. 주석처리는프로그래밍에서가장중요하다. 주석처리하는습관을가져야한다. 주석처리도프로그램언어마다다른데매틀랩에선 % 이다. exp(x) e( 자연대수의밑 ) 의누승 ( 거듭제곱 ) 함수. exp(3) = e^3 과같다. 매틀랩에서 e 는 pi 처럼정의되지않았으나 e=exp(1) 하여정의하면사용할수있다. log(x), log10(x) 프로그램언어마다로그사용이다르다. 꼭확인하고사용하도록... 확인예 ) >> log(10) 2.3026 >> log10(10) 1 자연대수가 log() 이고상용대수가 log10() 임을알수있다.
2. 근사함수 round(x) 엑셀에선소수점자리수를지정해야한다 (=round(b4, 0). fix(x) 와 floor(x) 는양수에선같으나음수에선다르다. ceil(x) 반올림, 버림, 올림 3. 이산수학함수 factor(x) gcd(x, y) Great Common Divisor 최대공약수 lcm(x, y) Least Common Multiple 최대공배수 factorial(x) CNBLUE 노래외톨이야가팩토리아 (r) 로들림, 테란의투팩이생각나는팩토리 ( 알 ) primes(x) 이수밑에있는모든소수 (Prime number) 를출력 isprime(x) 소수인지확인 예 ) >> isprime(111) 0 % 잉! 소수가아님그럼 >> factor(111) 3 37 % 3 x 37 로인수분해됨 4. 삼각함수 넘어감. 각 (angle) 은 rad(ian) 을쓴다는것은당근. π 는매틀랩에선 pi 이다.
5. 최대최소값 쓰임새가많다. 일단기본적인내용만알라보고다음에응용할기회를갖도록한다. max(x) ( 행또는열 ) 벡터이면최대값을 2 차원 (2x2) 이상의행렬이면열마다최대값을구한다. 예 ) x = 3 4 5 2 8 6 6 5 4 >> max(x) 6 8 6 행별로최대값을구하려면전치행렬을사용한다. >> max(x') % 행벡터로 5 8 6 >> max(x')' % 열벡터로 5 8 6 [a, b]=max(x) 최대값과그위치를돌려준다. >> [a,b]=max(x)
a = 6 8 6 % 최대값 b = 3 2 2 % 그위치 ( 각열에서의행 ) max(x, y) 같은크기의행렬의원소끼리비교하여큰값만취한다. 행렬크기가다르면오류 x = 3 4 5 2 8 6 6 5 4 y = 2 2 2 3 4 6 3 5 7 위와같은행렬이면 >> max(x,y) 3 4 5 3 8 6 6 5 7 min(x), [a,b]=min(x), min(x,y) 는최소값을구한다. 연습문제 (1) 각도 0~pi/2 사이에서최대수평비행거리가되는각도를구하는문제인데 t=0:pi/128/pi/2; d=v0^2/g*sin(2*t); % 각도 theta 대신에간단히 t 로표기, time 아님
[max_d, max_d_index]=max(d); % 여기서최대비거리가되는 index 를찾는다. max_d_t=t(max_d_index) % 이러면최대비거리가되는각도 (t) 를구할수있다. 6. 통계 mean(x) 벡터는평균, 행렬이면열별평균값. median(x) 벡터는중앙값, 행렬이면열별중앙값. std(x) 표준편차 (Standard Deviation), sqrt(var(x)) var(x) 분산 (Variation), std(x).^2 sum(x) 백터는전체합, 행렬은열별합계 x = 3 4 5 2 8 6 6 5 4 >> sum(x) 11 17 15 평균을 sum() 과 size() 로구하려면 >> [a,b]=size(x); % 뒤의행렬-크기-알기참조 >> ave_col=sum(x)/a % 행숫자로나눠야함 ave_col = 3.6667 5.6667 5.0000 >> mean(x) % 확인해보면맞다
3.6667 5.6667 5.0000 prod(x) 백터는전체곱, 행렬은열별곱 7. 정렬 sort() 는행렬을열별로정렬하고 ( 기본은올림차 ), sortrows() 는첫열을기준으로정렬하고다른 열은첫열을따라간다 ( 즉, 행단위로정렬한다. 각행은같이움직인다 ). sortrows(a, n) 은 A 행렬을 n 렬기준으로행단위로정렬한다. A 행렬에서 1 열이학번, 2 열이 수학점수, 3 열이영어점수, 4 열리수학과영어합계점수라면, sortrows(a, 4) 는합계점수 순으로정렬한다. 이행렬에서행단위로묶여있고행단위로정렬된다. sort(x, ('ascend')) 오름차순정렬, 2x2 이상의행렬은열별로정렬 sort(x, 'descend') 내림차순정렬 sortrows(x) 첫번열원소를기준으로행전체를정렬 ( 오름차순 ) sortrows(x) n 번열원소를기준으로행전체를정렬 ( 오름차순 ) >> sortrows(x,1) 2 8 6 3 4 5 6 5 4 8. 행렬의크기를알려면 length(x) 행과열의수중큰수를반환
size(x) 행과열의수를행벡터로반환 [a,b]=size(x) 행수는 a, 열수는 b 로반환 9. 난수 ( 발생 ) rand(n) n x n 정방행렬을만들며 0~1 사이의난수를발생시킨다. rand(m, n) m x n 행렬난수를발생 randn(n) n x n 정방행렬의가우시안분포난수를발생시킨다. 가우시안분포는표준정규분포이다. randn(m, n) m x n 정방행렬의가우시안분포난수를발생시킨다. (1) 난수는게임만들때필수적이다. 주사위게임을하려면 1~6 의정수를발생시켜야한다. 난수는 ( 별안간삼국지게임의난사가생각난다 ) 1 보다작은수로 6을곱하여 6을만들려고하나소수이하버림을하면 6이되지못하므로여기에다시 1을더하여최대 6을만든다. 즉, >> dice=floor(rand(1)*6+1) dice = 2 주사위두개던지기는 >> dice=[floor(rand(1)*6+1) floor(rand(1)*6+1)] dice = 5 6 >> dice=[floor(rand(1)*6+1) floor(rand(1)*6+1)] dice = 5 2
>> dice=[floor(rand(1)*6+1) floor(rand(1)*6+1)] dice = 3 6 (2) 가우시안분포난수는 151 페이지연습문제 3.18을풀어보면서보도록한다. 학생시험점수분포는정규분포난수로모의실험하는것이맞다. 평균이 80이고표준편차가 23.5이고전체학생수가만명이학교의점수를모의하면만명이므로 (100 x 100) 행렬이면되므로가우시안난수에 23.5를곱하면이수만큼점수가퍼지게된다. 여기세 80을더하면평균이 80이된다. 표준정규분포의평균은 '0' 이고표준편차는 '1' 이다. 평균을구하고표준편차를구해보면 '80' 과 '23.5' 에가까운것을알수있다. >> scores=randn(100)*23.5 + 80; >> m=mean(mean(scores)) m = 80.1559 >> s=std(scores(:)) s = 23.5854 연습문제 (2) 로그 ( 대수 ) 는밑이보통 e( 자연대수 ) 나 10( 상용대수 ) 입니다. 여기선밑이 1 서부터 10 까지일때의 대수값을알아보도록합니다.
먼저명령문을차례대로나열하여문제에접근합니다. 처음에는 ';' 를빼서값이출력되는것이편합니다. 그러나최종적으로답을얻었으면다음엔명령문끝에 ';' 을넣어출력하지않도록하는것이여러명령문을한눈에볼수있어편합니다. 또이는뒤에프로그래밍 ( 편집창을이용한 ) 할때유용합니다. >> x=12; >> b=1:10; >> log_b_x=log(x)./log(b); Warning: Divide by zero. >> ans_3_2=[b' log_b_x'] % 여기까지는풀이과정으로앞으로는소스코드로복사... ans_3_2 = % 여기부턴결과물로화면을캡쳐하여붙여넣는다. 1.0000 Inf % 풀이과정이간단하면결과와같이캡쳐해도좋다. 2.0000 3.5850 3.0000 2.2619 4.0000 1.7925 5.0000 1.5440 6.0000 1.3869 7.0000 1.2770 8.0000 1.1950 9.0000 1.1309 10.0000 1.0792 log 1 12 = y, 1^( ) = 12 즉, '1' 을몇번거듭제곱해야 '12' 가되는가? 실제로는불능이나수치해석 적접근법으로는무한대이다 2015-06-26, 곽노태