제 9 장 함수 -...

36
9 함수

Upload: others

Post on 26-Oct-2019

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

제 9 장

함수

Page 2: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

익명함수

• MATLAB 7에서 도입된 익명함수(anonymous function)를 이용하면 M-파일을 작성하지 않고

“한 줄” 함수를 생성 가능

>> f = @(x) exp(x)-1 f =

@(x) exp(x)-1 >> f(2) ans =

6.3891

• 위에서 f는 익명함수에 대한 함수 핸들

• 함수 핸들을 구성하는 @ 기호 다음에는 괄호 안에 함수에 대한 입력인수들이 위치하며 다음

에 하나의 MATLAB 표현이 이어짐

• 함수 핸들이므로 익명함수는 다른 함수들에 전달 가능

• 익명함수를 계산하는 문장은 인수 목록에는 없는 변수들을 포함 가능

• 함수가 생성될 때 그러한 변수들의 값이 취하여지며 다음의 3-인수 함수에 대한 예에서 알

수 있듯이 이 값들은 함수의 수명동안 일정하게 유지

Page 3: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

>> alpha = 1; >> g = @(x,y,z) x^2+y^2-alpha*z^2; >> g(1,2,3) ans =

-4 >> alpha = 0; >> g(1,2,3) ans =

-4

• alpha의 달라진 값이 g에 반영되기 위해서는 익명함수가 재구성되어야 함

• 명령어 eval은 문자열로 저장된 명령어를 마치 명령어 라인에서 그 문자열을 입력한 것처럼

수행가능

• 예를 들어 eval('cos(1)')을 입력하면 cos(1)을 입력한 경우와 동일한 결과

• 수행하고자 하는 전체 명령어가 문자열 str에 포함되어 있다면 eval(str)에 의하여 이를 수행

가능

• eval은 익명함수에 대한 입력들의 수에 약간의 유연성을 허용

Page 4: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

>> add = @(x, y, z) eval('x+y+z', 'x+y')

• 명령어 deal을 이용하여 다수의 출력을 갖는 익명함수 생성 가능

>> rectangular = @(r,theta) deal(r.*cos(theta), r.*sin(theta))

• 위와같이 입력하면 한 쌍의 극좌표를 한 쌍의 직교좌표로 전환시켜 주는 함수가 생성

• 다음과 같은 명령어는 두 개나 세 개의 입력인수들을 더하여 주는 익명함수를 생성

Page 5: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

함수 핸들

• MATLAB을 이용하는 많은 문제들에서는 하나의 함수가 다른 함수에 인수로 제공되는 것이

필요

• 통상적인 방법은 함수 핸들을 사용

• 함수 핸들은 하나의 MATLAB 데이터 형식으로서 함수를 계산하는 데에 필요한 모든 정보를

포함

• 함수 핸들은 함수이름 앞에 @ 기호를 넣어 생성

• 범위 [ ]에서 함수 f(x)의 그래프를 그리는 ezplot를 이용한 함수 핸들의 사용을

예시

• 만일 fun이 ezplot에서 필요로 하는 형태의 함수 M-파일이라면 다음과 같이 사용 가능

ezplot(@fun)

• fun은 M-파일은 물론 내장함수의 이름일 수도 있음

ezplot(@sin)

Page 6: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 다른 함수를 인수로 받아들이는 함수는 전달된 함수를 계산할 필요가 있으므로 함수 핸들을

단순히 함수 이름으로 간주하고 여기에 인수 목록을 붙여 줌으로써 간단히 계산함

• 호출되는 함수가 입력인수를 필요로 하지 않으면 함수 핸들 이름 다음에 빈 괄호를 넣어줌

함수 M-파일 fd.m은 첫 번째 인수로 제공된 함수에 대한 유한차분 근사를 계산

% fd.m : 미분에 대한 유한차분 근사. function y = fd(f,x,h) if nargin < 3, h = sqrt(eps); end y = (f(x+h) - f(x))/h;

• 이 함수의 수행 예시

>> fd(@sqrt,0.1) ans =

1.5811

Page 7: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 함수 핸들은 어떤 함수를 다른 함수로의 입력인수로 지정하는 데 있어서 선호되는 방법

• M-파일 iterate.m은 함수 핸들(혹은 인라인 함수)과 초기값을 입력하여 지정된 횟수만큼 그

함수를 반복 계산

• 내장함수나 함수 M-파일의 이름 앞에 @ 기호를 두는 것은 그 함수에 대한 핸들 생성

• iterate(@cos, 1, 2)는 cos(cos(1))의 수치값을 계산하며 iterate(@cos, 1, 100)은 cos(x)=x인 실

수 x에 대한 근사를 제시

function v = iterate(func, init, num) v = init; for k = 1:num v = func(v); end

>> iterate(@cos, 1, 2) ans =

0.8576 >> iterate(@cos, 1, 100) ans =

0.7391

Page 8: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

인라인 객체

• 수학적 함수를 MATLAB 함수에 전달하는 방법으로서 인라인 객체를 이용

• 인라인 객체들은 MATLAB 6에서 처음 도입되었으며 MATLAB 7에서 도입된 보다 다양하고

효율적인 익명함수들에 의하여 대체

• 인라인 객체는 사실상 문자열로 정의되는 “한 줄” 함수로서 변수에 할당된 다음에 다른 함수

로 전달 가능

• f는 함수 핸들이 아님을 유의

>> f = inline('exp(x)-1') f =

Inline function: f(x) = exp(x)-1

>> f(2) ans =

6.3891

• MATLAB은 인라인 함수에 대한 인수들을 자동적으로 결정하고 순서를 정함

Page 9: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

•그 선택이 적절하지 않으면 inline에 대한 추가의 인수들을 통하여 인수들이 구체적으로 정의

되고 순서가 정해짐

• 때로는 인라인 객체나 문자열 표현을 벡터화하는 것이 필요 (vectorize 함수에 의하여 생성)

>> f = inline('log(a*x)/(1+y^2)') f =

Inline function: f(a,x,y) = log(a*x)/(1+y^2)

>> f = inline('log(a*x)/(1+y^2)','x','y','a') f =

Inline function: f(x,y,a) = log(a*x)/(1+y^2)

>> f = inline('log(a*x)/(1+y^2)'); >> f = vectorize(f) f =

Inline function: f(a,x,y) = log(a.*x)./(1+y.^2)

Page 10: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

부함수

• 함수 M-파일의 첫 번째 줄에 나타나는 것 외에 명령어 function은 추가로 M-파일의 뒷부분

에서 보조함수, 혹은 부함수의 정의에 사용

• 부함수는 M-파일 내의 어느 곳에서도 사용될 수 있지만 명령어 라인에서 직접 접근 불가

• 부함수들은 대체적으로 주함수와 분리될 필요가 있지만 다른 M-파일들에서는 필요할 것 같

지 않은 기능을 수행하며 혹은 동일한 이름을 갖는 기존 함수들에 겹쳐질 수도 있음

• 함수 M-파일 sumcubr.m은 실수벡터 x의 세제곱근을 합하고 있음

function y = sumcubr(x) y = sum(cuberoot(x)); % --- 여기에서 부함수가 시작 function z = cuberoot(x) z = sign(x).*abs(x).^(1/3);

• 수행결과

>> sumcubr(100) ans =

4.6416

Page 11: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 부함수 cuberoot는 x의 세제곱근을 원소마다 취하며, 부함수는 스크립트 M-파일이 아닌 함

수 M-파일에서만 이용 가능

• interr.m에서는 구간 [0,1]에서 n개의 샘플에 근거하는 부함수 f에 대한 선형 안짐작 다항식의

최대 오차를 근사

% interr.m: 선형 안짐작 다항식의 오차. function maxerr = interr(n) maxerr = 0; f0 = f(0); f1 = f(1); for x = linspace(0,1,n) p = x*f1 + (x-1)*f0; err = abs(f(x)-p); maxerr = max(maxerr,err); end % 부함수 function y = f(x) % f(x): 안짐작되는 함수 y = sin(x);

• 수행결과 >> interr(5) ans =

0.0587 >> interr(40) ans =

0.0600

Page 12: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

기본적인 입력인수: nargin

• nargin(Number of argument of Input)을 사용하여 특별한 호출에서 그 입력인수들 가운데

처음 몇 개만이 공급되고 그 나머지 인수들은 함수 내에서 기본값으로 설정되도록 함수를 작

성가능

• 함수를 구성할 때에는 그의 입력인수들을 중요도가 높은 것부터 낮은 순위대로 공급되어야

하는 순서에 따라 지정할 수 있거나 없는 것들과 함께 정렬시켜야 함

• M-파일 exfun.m

function f = exfun(A, np, na, step) if nargin < 2 | isempty(np), np = length(A); end if nargin < 3 | isempty(na), na = 10; end if nargin < 4, step = 0.1; end

• 배열 A는 반드시 제공되어야 하지만 다른 인수들은 임의적

• 함수 exfun.m은 다음과 같이 호출 가능

A = 1:0.5:8; exfun(A,10,20,1e-3) exfun(A,10) exfun(A,[],50) exfun(A,[],[],0.5)

• 빈 행렬 []가 두 번째나 세 번째 인수로 제공되면 해당되는 if 테스트의 isempty 부분은 기본

값이 관련되는 변수에 부여됨

Page 13: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

가변적인 인수의 개수: varargin과 varargout

• 어떤 경우에는 함수가 제한이 없을 수도 있는 가변적인 수의 입력이나 출력인수들을 받아들

이거나 반환해야 함

• varargin 및 varargout 함수들을 이용하면 이러한 것이 가능

• M-파일 blockcomp.m을 이용하여 행렬 에 해당하는 다음과 같

은 블록 컴패니언 행렬을 형성한다고 가정

• 이를 위하여 다음과 같은 표준적인 함수의 정의를 이용

function C = blockcomp(A1,A2,A3,A4,A5)

• 그러나 위에서 m은 5로 제한되어 있으며 m이 1과 5 사이의 값일 때에는 프로그램이 복잡해

• M-파일 blockcomp.m에 보인 바와 같이 varargin을 사용

Page 14: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

% blockcomp.m: Block companion 행렬 function C = blockcomp(varargin) varargin m = nargin; n = length(varargin{1}); C = diag(ones(n*(m-1),1),-n); for j=1:m Aj = varargin{j}; C(1:n,(j-1)*n+1:j*n) = -Aj; end

• varargin이 입력인수 목록으로 지정되면 공급된 입력인수들은 varargin라는 이름의 셀 배열에 복사 • 셀 배열의 원소들은 중괄호를 사용

>> X = ones(2); C = blockcomp(X, 2*X, 3*X) varargin = [2x2 double] [2x2 double] [2x2 double] C =

-1 -1 -2 -2 -3 -3 -1 -1 -2 -2 -3 -3 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0

Page 15: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 앞에서 varargin은 1 x 3 셀 배열로서 그 원소들은 blockcomp에 대한 인수로 제공된 2 x 2

행렬들이며 varargin{ j}은 j 번째 입력행렬 임

• 한편 nargout(Number of argument of Output)을 이용하여 얼마나 많은 출력인수들이 요구

되는가를 결정한 다음에 요구되는 출력을 포함하는 varargout 셀 배열을 생성

• M-파일 vecmom.m을 작성하여 [m1,m2,...,mk] = vecmom(X)는 벡터 X의 첫 번째, 두 번째, ...,

k번째 모멘트가 되도록 함(할당문의 오른쪽에 중괄호를 사용하여 varargout을 셀 배열로 만듬)

Page 16: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

% vecmom.m : 벡터의 모멘트. function varargout = vecmom(x) % j번째 모멘트 = sum(x.^j)/length(x) for j=1:nargout varargout(j) = {sum(x.^j)/length(x)}; end

• M-파일의 수행결과

>> m1 = vecmom(1:4) m1 = 2.5000 >> [m1,m2,m3] = vecmom(1:4) m1 = 2.5000 m2 = 7.5000 m3 =

25

Page 17: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

중첩함수

• MATLAB에서는 하나, 혹은 그 이상의 함수들이 다른 함수 안에 완전히 중첩되는 것 허용

• 중첩을 정의하려면 중첩된 함수와 주함수의 맨 끝에 end 문을 두어야 함

• 그렇게 하지 않으면 함수들은 부함수들이 됨

• 중첩된 함수들은 들여쓰기하는 것이 알아보기에 좋음

• 중첩함수는 MATLAB 7에서 처음 도입

• 두 가지 중요한 성질 :

중첩함수는 그것이 중첩되어 있는 모든 함수들의 작업공간에 접근이 가능하다.

중첩함수에 대한 함수핸들은 중첩함수에의 접근에 필요한 정보와 중첩함수를 포함하는 모든

함수들의 계산에 필요한 임의의 변수값들에 대한 정보를 저장한다.

• M-파일 nestfun.m에서는 중첩함수 ratf에 대한 함수핸들이 별개의 함수 M-파일 appdt로 전

달됨

• 주 함수 M-파일 nestfun.m의 변수 a, b, c 및 d들은 중첩함수 ratf 내에서 접근이 가능

• 값은 appdt로 전달되는 함수핸들 내에 포함

Page 18: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

% appdt.m: 미분에 대한 유한차분 근사. function y = appdt(f,x,h) % h: 차분 파라미터 if nargin < 3 h = sqrt(eps); end y = (f(x+h) - f(x))/h; % nestfun.m : 중첩함수(nested function)의 예시. function nestfun(x) a = 1; b = 2; c = 1; d = -1; appdt(@ratf,x) function r = ratf(x) r = (a+b*x)/(c+d*x); end end

• M-파일의 수행결과

>> nestfun(7) ans =

0.0833 >> nestfun(2) ans =

3.0000

Page 19: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

비공개 함수(Private function)

• 통상적으로 MATLAB을 설치하면 사용자 경로는 수 많은 M-파일들을 포함하게 되는데 이들

모두는 M-파일의 이름만을 입력하면 바로 사용가능

• M-파일들에 이렇게 쉽게 접근할 수 있는 것이 잇점이기도 하지만 함수 이름들이 혼란스러워

지고 서로 충돌하거나 중복될 수 있음(비공개 함수(private function)를 이용하여 방지)

• private라는 이름의 디렉토리에 내장된 함수들은 상위 디렉토리의 함수들로부터만 접근이 가

능하므로 다른 디렉토리의 함수들은 이들과 동일한 이름 사용 가능

• MATLAB이 함수를 탐색할 때에는 먼저 부함수들을 탐색한 다음에 비공개 함수들을 탐색하

고 이어서 현재의 디렉토리와 경로를 탐색

• 비공개 함수가 공개함수와 동일한 이름을 갖는다면 비공개 함수가 제일 먼저 발견

• 비공개 함수들은 gallery 함수에서 잘 이용되고 있는데 이 함수는 matlab\elmat 디렉토리에

위치하며 시험용 행렬들을 모아두고 있음

• gallery에서 호출되는 50개 정도의 행렬생성 함수들은 matlab\elmat\private에 위치하며 기

존 함수와 충돌하거나 중복될 염려가 없이 그 이름들을 선택 가능

• 비공개 디렉토리들은 경로상에 올려두지 않아야 함

Page 20: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

되부름 함수(Recursive function)

• 함수들은 자체 내에서 스스로를 호출 가능

• M-파일 makekoch.m은 Koch 곡선을 생성

% makekoch.m: Koch 곡선을 생성 clear all level = 4; edges = 7; for k = 1:edges pl = [cos(2*k*pi/edges); sin(2*k*pi/edges)]; pr = [cos(2*(k+1)*pi/edges); sin(2*(k+1)*pi/edges)]; kochcurv(pl,pr,level); end axis('equal') title('Koch snowflake','FontSize',14,'FontAngle','italic') hold off

• 이 파일에서는 아래와 같은 함수 M-파일 kochcurv.m을 호출하고 있는데 함수 kochcurv는

자기 자신을 반복 호출함으로써 Koch 곡선을 생성

Page 21: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

% kochcurv.m: Koch 곡선. function kochcurv(pl,pr,level) if level == 0 plot([pl(1),pr(1)],[pl(2),pr(2)]); hold on else A = (sqrt(3)/6)*[0 1; -1 0]; pmidl = (2*pl + pr)/3; kochcurv(pl,pmidl,level-1) ptop = (pl + pr)/2 + A*(pl-pr); kochcurv(pmidl,ptop,level-1) pmidr = (pl + 2*pr)/3; kochcurv(ptop,pmidr,level-1) kochcurv(pmidr,pr,level-1) end

• 함수 kochcurv로부터 얻은 Koch 곡선: -1 -0.5 0 0.5 1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

Koch snowflake

Page 22: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 함수 kochcurv는 세 개의 입력인수들을 갖음

• 처음 두 개의 인수 pl과 pr은 현재 선분의 (x,y) 좌표이며 세 번째 인수 level은 요구되는 되부름

단계

• level=0이면 하나의 선분이 그려지며 그 이외의 경우에는 kochcurv는 level을 하나 줄이고 네

개의 보다 짧은 선분들을 정의하는 끝점들을 이용하여 스스로를 네 번 호출

Page 23: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

MATLAB 내장 수학함수 • MATLAB은 많은 내장함수들을 지님

• sqrt, cos, sin, tan, log, exp, 그리고 atan들은 물론 gamma, erf, 그리고 besselj와 같은 보다

전문적인 수학적 함수들이 포함. (함수 log는 자연로그로서 대개 “ln"으로 호칭)

• MATLAB에 내장되어 있는 수학함수들을 보인 것

• 삼각함수들은 인수로서 라디안을 취하며 “*d" 버전들은 인수로서 도(degree)를 취함

• 특별한 것들로서 expm1과 log1p가 있는데 이들은 각각 에 대하여 직접적인 계산

에 영향을 미치는 생략을 피하면서 과 를 정확하게 계산

• MATLAB 내장 수학함수(“fun*"는 하나 이상의 함수 이름이 ”fun"으로 시작됨을 의미):

구분 내장함수

삼각함수 cos, sin, tan, csc, sec, cot,cosd, sind, tand, cscd, secd, cotd

역 삼각함수 acos, asin, atan, atan2, asec, acsc, acot, acosd, asind, atand, asecd, acscd, acotd

하이퍼볼릭 cosh, sinh, tanh, sech, csch, coth

역 하이퍼볼릭 acosh, asinh, atanh, asech, acsch, acoth

지수함수 log, log2, log10, log1p, exp, expm1, pow2, nextpow2, nthroot

반올림 ceil, fix, floor, round

복소수 abs, angle, conj, imag, real

나머지, 부호 mod, rem, sign

수학함수 airy, bessel*, beta*, ellipj, ellipke, erf*, expint, gamma*, legendre, psi

수 이론 factor, gcd, isprime, lcm, primes, nchoos다, perms, rat, rats

좌표변환 cart2sph, cart2pol, pol2cart, sph2cart

Page 24: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• Gamma 함수 • Gamma 함수 는

와 같이 정의

• Gamma 함수는 와 같은 재귀적 규칙을 따르며 n이 양의 정수라면

( ) 을 만족

• n의 gamma 함수는 함수 gamma에 의하여 얻을 수 있음

>> gamma(6) ans =

120 >> y = gamma(-1) y =

Inf >> y = gamma(-1.2) y =

4.8510 >> y = gamma(-2.2) y =

-2.2050

Page 25: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• x가 음수일 때의 의 값을 의 범위에서 그래프

>> x = -5:0.01:0; >> plot(x,gamma(x)), xlabel('x'), ylabel('Gamma(x)'), grid on >> axis([-5 0 -40 100])

• 음수에 대한 Gamma 함수의 그래프:

-5 -4.5 -4 -3.5 -3 -2.5 -2 -1.5 -1 -0.5 0-40

-20

0

20

40

60

80

100

x

Gam

ma(

x)

Page 26: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 불완전 Gamma 함수는 아래와 같이 정의

• gammainc 함수에 의하여 계산

>> x = 0.2; n = 0.3; >> y = x^n y =

0.6170 >> z = gammainc(x,n) z =

0.6575 >> x = 0.002; n = 0.003; y = x^n y =

0.9815 >> z = gammainc(x,n) z =

0.9832

Page 27: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

Bessel 함수

• Bessel 미분방정식은

의 형태를 가지며 이의 해는

로 주어짐

• 위에서 과 는 경계조건에 의하여 결정되는 상수들이며 은 제 1종 Bessel 함

수, 그리고 은 제 2종 Bessel 함수 제 1종 Bessel 함수는

와 같이 정의되며 Gamma 함수를 포함

• 제 1종 Bessel 함수는 MATLAB의 besselj 함수로 계산할 수 있으며 제 2종 Bessel 함수는

bessely(n,x)로부터 계산 가능

Page 28: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 음수에 대한 Gamma 함수의 그래프:

0 5 10 15 20 25 30-0.4

-0.3

-0.2

-0.1

0

0.1

0.2

0.3

0.4

0.5

0.6

x

Bes

selJ

(1,x

)

• 범위에서 의 그래프를 작성

>> x = [0:0.1:50]; >> y = besselj(1,x); >> plot(x,y), xlabel('x'), ylabel('BesselJ(1,x)') >> axis([0 30 -0.4 0.6])

Page 29: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 범위 에서 의 그래프

>> x = [0:0.1:20]; >> u = besselj(0,x); v = besselj(1,x); w = besselj(2,x); >> plot(x,u,x,v,':',x,w,'.-'), xlabel('x'), ylabel('BesselJ(n,x)') >> grid on, legend('bessel0(x)','bessel1(x)','bessel2(x)')

0 2 4 6 8 10 12 14 16 18 20-0.5

0

0.5

1

x

Bes

selJ

(n,x

)

bessel0(x)bessel1(x)bessel2(x)

• 의 그래프

Page 30: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• Beta 함수

• Beta 함수는 아래와 같이 정의 됨

• MATLAB의 beta 함수를 이용하여 Beta 함수를 계산 가능

• B(1,n)을 계산

>> x = [1:10]'; >> y = beta(1,x); >> A = [x,y] A =

1.0000 1.0000 2.0000 0.5000 3.0000 0.3333 4.0000 0.2500 5.0000 0.2000 6.0000 0.1667 7.0000 0.1429 8.0000 0.1250 9.0000 0.1111 10.0000 0.1000

Page 31: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 지수적분

• 지수적분은 아래와 같이 정의되는 적분으로서 x의 함수

• 지수적분은 MATLAB 함수 expint에 의하여 계산

>> x = [0.1:0.2:2]'; >> y = expint(x); >> A = [x y] A =

0.1000 1.8229 0.3000 0.9057 0.5000 0.5598 0.7000 0.3738 0.9000 0.2602 1.1000 0.1860 1.3000 0.1355 1.5000 0.1000 1.7000 0.0747 1.9000 0.0562

Page 32: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• Riemann Zeta 함수

• Riemann Zeta 함수는 수열 에 의하여 정의

• MATLAB에서 Riemann Zeta 함수를 구하려면 w = mfun('Zeta',z)와 같이 입력

• 는

>> x = mfun('Zeta',2) x =

1.6449

Page 33: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• 의 범위에서 Zeta 함수의 그래프

>> x = linspace(0,10); >> y = mfun('Zeta',x); >> plot(x,y), xlabel('x'), title('Zeta(x)'), axis([0 10 -10 10])

0 1 2 3 4 5 6 7 8 9 10-10

-8

-6

-4

-2

0

2

4

6

8

10

x

Zeta(x)

•Zeta(x)의 그래프

Page 34: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• Legendre 함수

• Legendre 미분방정식은

로 주어지는 방정식으로서 이의 해는

로 주어짐

• 여기에서 는 1종 Legendre 다항식, 는 2종 Legendre 다항식으로 불리는

다항식들이다.

• 는 MATLAB 함수 legendre에 의하여 계산

• 의 범위에서 n=1일 때 m=0이나 m=1에 대한 은

>> x = -1:0.5:1; >> P = legendre(1,x) P =

-1.0000 -0.5000 0 0.5000 1.0000 0 -0.8660 -1.0000 -0.8660 0

Page 35: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• P의 첫 번째 행은 m=0, 두 번째 행은 m=1에 대한 값

>> x = linspace(-1,1); >> p1 = legendre(1,x); >> plot(x,p1), xlabel('x'), ylabel('p1')

-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

x

p1

• 와 의 그래프

Page 36: 제 9 장 함수 - elearning.kocw.netelearning.kocw.net/KOCW/document/2013/hanyang/ParkSangung/09.pdf · -4 >> alpha = 0; >> g(1,2,3) ans = -4 • alpha의 달라진 값이 g에 반영되기

• Airy 함수

• Airy 함수는 미분방정식 에 대한 해로서 이 함수는 다음과 같이 나타낼

수 있음

• MATLAB 함수 airy를 이용하면 Airy 함수값을 계산 가능

>> x = linspace(-10,5); >> y = airy(x); >> plot(x,y), xlabel('x'), ylabel('Ai(x)'), grid on Warning: Imaginary parts of complex X and/or Y arguments ignored.

-10 -5 0 5-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

x

Ai(x

)

Airy 함수의 그래프