1 / 48

MATLAB 개요 및 응용 6 장 사용자정의 함수와 함수 파일

MATLAB 개요 및 응용 6 장 사용자정의 함수와 함수 파일. 강의 내용. 함수 파일의 작성 함수 파일의 구조 지역변수와 전역변수 함수파일의 저장 사용자정의 함수의 이용 스크립트 파일과 함수 파일의 비교 익명 함수와 인라인 함수 함수의 함수 부함수 중첩함수 응용예제. 서 론.

delano
Download Presentation

MATLAB 개요 및 응용 6 장 사용자정의 함수와 함수 파일

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. MATLAB개요 및 응용6장 사용자정의 함수와 함수 파일

  2. 강의 내용 • 함수 파일의 작성 • 함수 파일의 구조 • 지역변수와 전역변수 • 함수파일의 저장 • 사용자정의 함수의 이용 • 스크립트 파일과 함수 파일의 비교 • 익명 함수와 인라인 함수 • 함수의 함수 • 부함수 • 중첩함수 • 응용예제 6장 사용자정의 함수와 함수 파일

  3. 서 론 수학에서 간단한 함수 f(x)는 주어진 x의 각 값에 유일한 값을 연관시킨다. 함수는 y=f(x)로 표현할 수 있으며, 일반적으로 f(x)는 x에 의한 수학적 표현식이다. 식의 x에 값(입력)을 대입하면 y의 값(출력)이 얻어진다. MATLAB에는 많은 함수들이 내장함수(built-in function)로 프로그램 되어 있으며, 함수 이름과 입력인자(argument)만 입력하면 결과를 얻을 수 있다. 예) sin(x), cos(x), sqrt(x), exp(x), log(x), … 내장함수가 아닌 함수의 값을 계산할 필요가 있을 때 함수 식이 간단하고 한번만 계산하면 되는 경우 : 프로그램의 일부로 작성 여러 입력인자들에 대해 여러 번 함수 값을 계산할 때 : 사용자 정의(user-defined)함수를 만들어 내장함수처럼 반복적으로 사용 Function은 프로그램 속의 부프로그램(subprogram)으로서 입력데이터를 이용하여 계산을 수행한 후 계산결과를 function 밖으로 출력해준다. 6장 사용자정의 함수와 함수 파일

  4. 함수 파일(Function file) 반복적인 일련의 계산과정이 필요할 때, 또는 계산과정에서 만들어지거나 잠시 필요한 중간 변수들에 관심이 없거나 감추고 싶을 때, 즉 주어진 입력에 대해 결과인 출력만을 얻고 싶을 때 함수 파일을 작성한다. Output argument Input argument Function File Input data Output data • 사용자 정의함수 예 : 직각삼각형의 두 변으로부터 빗변을 구하는 함수 x=3 y=4 Function √(x2+y2) z=5 • 수학함수로 사용하는 용도 외에도 함수파일은 큰 프로그램의 부프로그램으로 사용될 수 있다. 독립적으로 테스트가 가능한 부프로그램들로 큰 프로그램을 작성하면, 유지관리에 유리하다. • C – function , FORTRAN – subroutine, PASCAL - procedure 6장 사용자정의 함수와 함수 파일

  5. 함수 파일의 생성 명령창에서 edit 명령을 입력하거나File →New→M-file 메뉴를 순서대로 선택하면, Editor/Debugger창이 열린다. 스크립트 파일이 특별한 형식 없이 명령창에서 사용하는 명령어들을 모아 놓은 데 비해, 함수 파일은 정해진 형식을 가지고 있으며 스크립트 파일과 다른 차이점을 가지고 있다. 함수 파일의 구조 출력인자들 Function 파일임을 알리며, 반드시 소문자로 한다. 함수이름 입력인자들 Function definition line H1 line (lookfor에서 사용) On-line help에서 사용되는 주석문 Function body (함수 프로그램) 6장 사용자정의 함수와 함수 파일

  6. 함수 파일의 구조 –함수 정의 Function definition line 함수 파일의 첫번째 라인에는 반드시 함수 정의 라인이 있어야 한다. 그렇지 않으면, 스크립트 파일로 인식된다. Function definition line의 역할 파일을 함수 파일로 정의 함수의 이름을 정의 입력인자와 출력인자의 개수와 순서를 정의 함수 정의 라인의 형식 : 함수 프로그램 안에서 사용할 입력인자들로 괄호 안에 입력 함수 파일임을 알림. 반드시 소문자로 입력. function [출력변수1, 출력변수2, ….] = function_name(입력변수1, 입력변수2, …) 꺾은 괄호 안에 출력인자들을 나열함. 출력인자가 한 개인 경우에는 꺾은 괄호 없이 변수 하나만 쓴다. 프로그램에서 사용할 함수 이름. 함수 이름에 대한 규칙은 변수와 동일함 6장 사용자정의 함수와 함수 파일

  7. 함수 파일의 구조 –입력 인자 입력 및 출력 인자는 함수 안으로 필요한 데이터를 공급하고 계산된 결과를 함수 밖으로 출력해주는 역할을 한다. 입력인자에 대한 규칙 함수 이름 다음에 괄호 속에 입력하며, 한 개 이상인 경우 콤마로 구분함 입력인자는 대개 한 개 이상이지만, 전혀 갖지 않을 수도 있음 입력인자는 스칼라 뿐만 아니라 벡터나 배열이 될 수도 있으므로, 함수 파일 내에서 수학식은 입력인자의 차원에 맞춰서 표현되어야 한다. radial 함수에서 입력인자 x, y는 스칼라일 수도 있지만, 벡터일수도 있으므로 크기 r과 각 theta를 계산할 때 원소별 연산으로 나타내었음. >> x=[3 5 6 9];y=[4 12 8 12]; >> [d, ang]=radial(x, y); 6장 사용자정의 함수와 함수 파일

  8. 함수 파일의 구조 –출력 인자 출력인자에 대한 규칙 함수 정의 라인에서 부호 ‘=’의 왼쪽에 쓰며, 인자가 두 개 이상인 경우 꺾은 괄호 속에 콤마로 구분하여 나열한다. 출력인자가 단 한 개인 경우에는 꺾은 괄호가 필요 없다. 출력인자가 전혀 없는 경우에는 ‘=’부호와 출력인자를 생략한다. 출력인자가 없는 함수의 예 : 그래프만을 출력하거나 계산결과를 파일에 저장하는 경우 출력인자는 함수 파일 속에서 계산된 결과를 본 프로그램에 전달하는 역할을 하므로, 함수 파일이 작동하기 위해서는 함수 프로그램 안에서 반드시 출력인자에 값이 주어져야 한다. 문자열(string)을 함수 파일에 입력인자로 전달할 수도 있다. 함수 파일 안에서 다른 함수를 이용하고자 할 때 이용할 함수의 이름을 전달하기 위해 문자열을 입력인자에 전달한다. 6장 사용자정의 함수와 함수 파일

  9. 함수 파일의 구조-입력 및 출력 인자 일반적으로 함수 파일은 입력인자와 출력인자를 통해 필요한 데이터를 받고 계산결과를 출력하며, 함수 파일 안에서 사용한 변수들은 함수 파일 안에서만 유효하므로 함수를 부른 본 프로그램에서는 사용할 수 없다. 스크립트 파일에서 사용했던 입력과 출력 명령어들의 특성은 그대로 유지된다. 즉, 스크립트 파일처럼 함수 파일에서 명령어 뒤에 세미콜른을 붙이지 않으면 각 명령어의 계산결과가 화면에 표시되며, input 명령을 통해 사용자로부터 데이터를 입력 받을 수 있고, disp나 fprintf, plot등의 명령어를 통해 데이터를 화면이나 파일에 출력시킬 수 있다. 다양한 함수파일의 정의 예 function [r, theta]= radial(x, y): 두 개의 입력인자와 두 개의 출력인자 function [r]= radial(x, y): 두 개의 입력인자와 한 개의 출력인자 functionr= radial(x, y): 두 개의 입력인자와 한 개의 출력인자 function[S, V]= Sphere(r): 한 개의 입력인자와 두 개의 출력인자 functionpath(v0, theta): 두 개의 입력인자, 출력인자 없음 6장 사용자정의 함수와 함수 파일

  10. 함수파일 구조-H1 line,Help text lines • %로 시작되는 함수 정의라인 아래의 주석부분으로 함수에 대한 정보를 제공하는 것이 목적이므로 필수는 아니다. • H1 라인 • 첫 번째 줄의 주석으로서 대개 함수의 이름과 간단한 정의를 포함한다. • 명령창에 입력한 lookfor 명령은 키워드를 함수의 H1 라인에서 찾아 H1 라인의 내용을 화면에 표시한다. 6장 사용자정의 함수와 함수 파일

  11. 함수 파일의 변수 • 계산수행 부분에서는 MATLAB 프로그래밍의 모든 특징을 사용할 수 있으며, 출력인자가 있는 경우 반드시 계산 결과를 출력인자에 돌려줘야 한다. • 지역변수(local variable)와 전역변수(global variable) 함수 파일의 모든 변수는 workspace가 아닌 별도의 메모리 공간을 사용하므로 함수 파일 안에서만 인식되는 “지역”변수이다. 따라서 명령 창에서는 함수 파일의 입력변수나 출력변수의 이름을 인식하지 못한다. 6장 사용자정의 함수와 함수 파일

  12. 함수 파일에서의 전역변수 함수 파일 안의 특정 변수를 다른 함수 파일에서 사용하거나 명령창에서 사용하기 위해 global명령을 이용하여 전역변수로 선언할 수 있다. 변수의 전역변수 선언 global 명령어 뒤에 전역변수로 선언할 변수들을 공백으로 구분하여 나열한다. 변수들 구분을 절대 콤마(,)로 하면 안 되고 공백으로 해야 한다. 예) globalvar1 var2 var3 … 특정 변수들을 전역변수로 사용하기 위해서는 사용할 함수 파일이나 스크립트 파일, 명령창 등에서 동일하게 global 명령어로 선언해 주어야 한다. 선언된 곳에서만 인식이 된다. global 명령으로 선언한 후에 유효하므로 가능하면 파일의 제일 앞 부분에서 선언하는 것이 좋다. 전역변수로 선언된 후, 어디서든 변수의 값은 변경이 가능하다. 전역변수는 일반변수와 구별하기 위해 가급적이면 식별이 가능하도록 길게 하거나 전부 대문자로 이름을 정하는 것이 좋다. 명령 창에서 전역변수로 선언하게 되면 workspace의 변수로 인식된다. 6장 사용자정의 함수와 함수 파일

  13. global 명령에 의한 전역변수 선언 6장 사용자정의 함수와 함수 파일

  14. 함수 파일의 저장 • 함수 파일은 사용하기 전에 반드시 파일로 저장이 되어야 한다. 파일 이름은 함수 정의 라인의 함수 이름과 같도록 하는 것을 강력하게 권장함. • 함수 파일을 함수 이름과 같게 저장하지 않았다면, 이 함수를 호출할 때는 함수 이름 대신에 파일이름을 사용해야 한다. • 함수파일에서 함수 정의 라인이 function [r, theta]=radial(x, y)일 때 파일 이름은 radial.m으로 정하도록 권장한다. 그러면 이 함수를 radial로 호출할 수 있다. 그러나 만일 dist.m과 같이 다른 이름으로 저장을 한다면, 더 이상 radial이란 이름으로 호출하지 못하고 dist로 호출해야 한다. 6장 사용자정의 함수와 함수 파일

  15. 함수 파일의 사용 • 사용자가 정의한 함수는 내장함수와 같은 방법으로 사용한다. 함수는 명령창이나 스크립트 파일, 또는 다른 함수에서 호출할 수 있다. • 함수 파일을 사용하기 위해서는 파일을 현재 디렉토리에 저장하거나 search path에 파일이 저장된 디렉토리를 등록해야 한다. • 함수의 사용 • 명령창이나 스크립트 파일에서 함수의 이름을 입력인자와 함께 쓴다. >> radial(3, 4)% 함수 정의 라인 : funciton [r, theta]=radial(x, y) ans = 5 • 다른 함수의 입력인자로 쓸 수 있다. >> sqrt( radial(3,4) ) ans = 2.2361 • 수학식의 일부로 함수를 쓸 수 있다. >> y=0.2*exp( radial(3,4) ) y = 14.8413 • 함수의 출력 값을 변수에 할당한다. 6장 사용자정의 함수와 함수 파일

  16. 함수 파일의 사용 - 입력인자 >> [d, ang] = radial(3, 4) d = 5 ang = 0.9273 • 입력인자 : 수, 계산 가능한 식, 값이 미리 할당된 변수 • 함수 정의 라인에서 입력인자와 출력인자의 각 위치별로 함수 호출시에 인자들이 할당된다. function [r, theta] = radial(x, y) % radial(x, y)는 벡터 (x,y)의 크기와 각을 계산함 % 출력 r은 벡터의 크기 % 출력 theta는 벡터의 각 θ(rad)를 돌려준다. … r = sqrt(x.^2+y.^2); theta = atan(y./x); >> re=[3 5 6]; >> im=[4 12 8]; >> [d, ang] = radial(re, im) d = 5 13 10 ang = 0.9273 1.1760 0.9273 6장 사용자정의 함수와 함수 파일

  17. 예제 6.1 수학함수의 사용자정의 함수 함수 에 대한 함수 파일 f.m을 작성하되, 함수에 대한 입력을 x, 출력을 y=f(x)로 하고, x는 벡터일 수 있도록 하라. 이 함수를 이용하여 f(6)과 x=1, 3, 5, 7에 대한 f(x)를 계산하라. 파일명 : f.m >> f(6) ans = 4.5401 >> y = f(6) y = 4.5401 >> f(1:2:11) ans = 0.7071 3.0307 4.1347 4.8971 5.5197 6.0638 >> y = f([1 3 5 7]) y = 0.7071 3.0307 4.1347 4.8971 function y=f(x) num=x.^4 .* sqrt(3*x+5); den=(x.^2 + 1).^2; y=num./den; 6장 사용자정의 함수와 함수 파일

  18. 예제 6.2 온도 단위의 변환 화씨온도 F를 섭씨온도 C로 변환하는 함수 FtoC.m을 작성하고, 이 함수를 이용하여 다음 문제를 풀어라. 온도 변화 ΔT에 의한 물체 길이의 변화는 ΔL=αLΔT로 주어진다. 만일 온도가 40°F에서 92°F까지 변한다면, 4.5 ⅹ2.25 m 크기의 사각형 알루미늄판(α =23x10-6)의 면적 변화는 얼마가 되겠는가? 파일명 : FtoC.m function C=FtoC(F) % FtoC는 화씨온도 F를 섭씨온도 C로 바꾼다. C=5*(F-32)./9; Script file : Ch6Ex2 a1=4.5; b1=2.25; T1=40; T2=92; alpha=23e-6; deltaT=FtoC(T2)-FtoC(T1); a2=a1+alpha*a1*deltaT; b2=b1+alpha*b1*deltaT; AreaChange=a2*b2-a1*b1; fprintf(‘면적 변화는 %6.5f m^2이다.', AreaChange) 6장 사용자정의 함수와 함수 파일

  19. 스크립트 파일과 함수 파일의 비교 스크립트 파일과 함수 파일의 비교 6장 사용자정의 함수와 함수 파일

  20. 익명함수(Anonymous function) (1/3) 익명함수는 별도의 함수 파일(M-files)을 만들지 않고 정의하는, 한 줄로 된 간단한 사용자정의 함수이다. 익명 함수는 명령어 창이나 스크립트 파일, 일반 사용자정의 함수 안에서 정의할 수 있다. 익명함수는 MATLAB 7에서 도입되었으며, MATLAB 이전 버전에서 같은 목적으로 사용되던 inline 함수를 대체한다. 둘 다 사용할 수는 있으나, 여러 장점 때문에 익명함수의 사용을 권장한다. 익명함수의 정의 name = @(arglist) expr 예) cube=@(x) x^3 → cube(x) = x3, cube(2)=8 익명함수를 생성하고 익명함수의 핸들을 = 변수 name에 할당한다. 함수 핸들은 함수 사용을 위한 수단이며, 함수를 다른 함수에 전달하기 위한 방법을 제공하기도 한다. expr은 MATLAB으로 표현된 수학식으로 내장함수나 사용자정의 함수도 포함할 수 있음. 6장 사용자정의 함수와 함수 파일

  21. 익명함수의 정의(계속) name = @(arglist) expr 독립변수는 arglist에 나열되며, 변수가 한 개 이상이면 콤마로 분리한다. 예) circle = @ (x, y) (16*x^2+9*y^2) → circle(x, y)=16x2+9y2 수학식은 입력인자의 차원에 따라 원소별 연산 또는 선형대수 계산으로 작성되어야 한다. 수학식은 익명함수가 정의되기 전에 미리 정의된 변수를 포함할 수 있다. 예) >> a=4; b=12;c=9; >> f = @ (x) (a*x^2+b*x+c) >> f(1) ans = 25 미리 정의된 변수를 포함하는 익명함수가 정의될 때, MATLAB은 정의 당시의 변수의 값을 취하므로, 나중에 변수 값이 다른 값으로 바뀌어도 함수는 변하지 않는다. 이 경우 익명함수를 다시 정의해야 한다. 익명함수(2/3) 6장 사용자정의 함수와 함수 파일

  22. 함수 의 익명함수 정의 >> FA = @(x) exp(x^2)/sqrt(x^2+5) FA = @(x)exp(x^2)/sqrt(x^2+5) >> FA(2) ans = 18.1994 >> z = FA(3) z = 2.1656e+0.03 • x가 배열로 주어질 경우를 고려한 정의 >> FA = @(x) exp(x.^2)./sqrt(x.^2+5) FA = @(x)exp(x^2)/sqrt(x^2+5) >> FA([1 0.5 2]) ans =1.1097 0.5604 18.1994 익명함수(3/3) 6장 사용자정의 함수와 함수 파일

  23. 다변수 함수의 익명함수 정의 • 2변수 함수 의 한 줄로 된 함수 정의 >> HA = @(x,y) 2*x^2-4*x*y+y^2 HA = @(x,y) 2*x^2-4*x*y+y^2 >> HA(2,3) ans = -7 • 2변수 함수 >> f = @(x,y) 1.8.^(-1.5*sqrt(x.^2+y.^2)).*cos(0.5*y).*sin(x) f = @(x,y)1.8.^(-1.5*sqrt(x.^2+y.^2)).*cos(0.5*y).*sin(x) >> x=[-4:0.2:4]; y=[-4:0.2:4]; [X,Y]= meshgrid(x,y); >> Z=f(X,Y); mesh(X,Y,Z) 6장 사용자정의 함수와 함수 파일

  24. 예제 6.3 극좌표로 주어진 두 점 • 두 점의 위치가 극좌표로 주어질 때, 두 점 사이의 거리를 계산하는 익명함수를 작성하라. 이 익명함수를 사용하여 점 A(2, π/6)와 점 B(5, 3π/4) 사이의 거리를 구하라. 두 점 사이의 거리 : >> d= @ (rA,thetA,rB,thetB) sqrt(rA^2+rB^2-2*rA*rB*cos(thetB-thetA)) d = @(rA,thetA,rB,thetB)sqrt(rA^2+rB^2-2*rA*rB*cos(thetBthetA)) >> DistAtoB = d(2, pi/6, 5, 3*pi/4) DistAtoB = 5.8461 6장 사용자정의 함수와 함수 파일

  25. Inline 함수 (1/2) 익명함수와 마찬가지로 별도의 함수 파일을 만들지 않고 프로그램 내에서 간단한 수학함수를 정의하는 간단한 사용자정의 함수이다. fname = inline(‘수학식’) 예) cube= inline(‘x^3’) 수학식은 한 개 또는 여러 개의 독립변수를 가질 수 있다. i와 j를 제외한 어떠한 글자도 독립변수로 사용될 수 있으며, 독립변수가 두 개 이상인 경우 알파벳 순으로 정해진다. 수학식에는 내장함수와 사용자정의 함수가 포함될 수 있다. 수학식은 입력인자의 차원에 따라 원소별 연산 또는 선형대수 계산으로 작성되어야 한다. 수학식은 미리 정의된 변수를 포함할 수 없다. 일단 함수가 정의되면, 함수의 이름과 괄호 안에 입력인자의 값을 입력하여 함수를 사용한다. inline 함수는 다른 함수의 입력인자로 사용될 수도 있다. 6장 사용자정의 함수와 함수 파일

  26. 예) x=1, 4, 5에서 f(x) = 2x2-10의 값을 구하라. >> f=inline('2*x.^2 - 10') f = Inline function: f(x) = 2*x.^2 - 10 >> f(2) ans = -2 >> x=4; >> f(x) ans = 22 >> f([1 4 5]) ans = -8 22 40 >> root=fzero(f, 0) root = -2.2361 >> f(root) ans = 1.7764e-015 의 inline 함수 정의 >>f = inline('exp(x.^2)./sqrt(x.^2+5)') f = Inline function: f(x) = exp(x.^2)./sqrt(x.^2+5) >> f(2) ans = 18.1994 >> f([1 0.5 2]) ans = 1.1097 0.5604 18.1994 Inline 함수 (2/2) 6장 사용자정의 함수와 함수 파일

  27. 다변수함수의 Inline 함수 정의 name = inline('수학식, 'arg1', 'arg2', 'arg3') 함수를 호출할 때 사용하는 입력인자들의 순서는 정의할 때 나열한 순서로 정의된다. 독립변수들을 나열하지 않은 경우에는 알파벳 순서를 따른다. 예) 함수 f (x, y)=2x2 - 4xy + y2의 정의 >> HA=inline('2*x^2-4*x*y+y^2') HA = Inline function: HA(x,y) = 2*x^2-4*x*y+y^2 익명함수를 이용하여 다시 실행해보라. 예) inline 명령어로 f(x)=xsin(2x2-π/6)을 그려라. >> f=inline(‘x.*sin(2*x.^2-pi/6)'); >> x=[0:0.1:4*pi]; y=f(x); >> plot(x, y) >> f(pi) ans = 1.1245 6장 사용자정의 함수와 함수 파일

  28. Inline Function의 사용 예 • inline 명령어를 이용하여 f(t)=t2sin(ωt -π/6), 0≤ω≤2, 0≤t≤6π의 그래프를 그려라. 익명함수를 이용하여 다시 실행해보라. • >> f=inline(' t.^2.*sin(omega.*t-pi/6)') • f = • Inline function: • f(omega,t) = t.^2.*sin(omega.*t-pi/6) • >> omega=linspace(0,2,200); • >> t=linspace(0,6*pi,200); • >> x=f(omega, t); • >> plot(t, x); • >> grid on • >> axis tight 6장 사용자정의 함수와 함수 파일

  29. 예제 그림과 같이 극좌표계로 표현된 두 점 A와 B 사이의 거리 d는 cos 제2법칙에 의해 다음 식으로 주어진다. inline 함수를 이용하여 d를 정의하고 두 점 A(2, π/6)와 B(5, 3π/4) 사이의 거리를 구하라. d b a >> d=inline( ‘sqrt(a^2 + b^2 – 2*a*b*cos(theta_B – theta_A))’ ) d = Inline function: d(a, b, theta_A, theta_B) = sqrt(a^2 + b^2 - 2*a*b*cos(theta_B - theta_A)) >> distance = d(2,5, pi/6, 3*pi/4) distance = 5.8461 >>d=inline( ‘sqrt(a^2 + b^2 – 2*a*b*cos(theta_B – theta_A))’, ‘a’, … ‘theta_A’, ‘b’, ‘theta_B’) % 독립변수 지정 d= Inline function: d(a, theta_A, b, theta_B) = sqrt(a^2+b^2-2*a*b*cos(theta_B - theta_A)) 6장 사용자정의 함수와 함수 파일

  30. 함수의 함수(Function Function) 다른 함수 Function B를 입력으로 받아들이는 어떤 함수 Function A를 MATLAB에서는 함수의 함수, 즉 함수 함수(function function)라고 한다. 예) 함수의 영점( f(x)=0인 x 값)을 구하는 MATLAB 내장함수 fzero는 영점 을 구할 함수를 입력인자로 받아들이므로, fzero는 함수 함수이다. 다른 함수를 받아들이는 함수 함수의 입력인자에는 받아들일 함수의 이름을 기입해야 하며, 이 함수의 이름은 함수 함수의 프로그램(코드)에서 연산에 사용된다. 함수 함수를 호출할 때, 전달할 특정함수의 이름을 표기하는 방법 함수 핸들을 이용하는 방법과 함수 이름을 문자열 표현으로 표기하는 방법. 사용 방법은 함수 함수에서 연산을 프로그래밍하는 방식에 영향을 미친다. 함수핸들을 이용하는 것이 더 쉽고 효율적이다. 6장 사용자정의 함수와 함수 파일

  31. 함수 핸들을 이용한 함수 함수의 호출 함수 핸들은 함수와 관련된 MATLAB 값으로, MATLAB 데이터 형이며, 다른 함수에 입력인자로 전달될 수 있다. 내장 함수와 사용자정의 함수의 경우, 함수 이름 앞에 기호 @를 붙이면 함수 핸들이 생성되며, 변수에 할당할 수 있다. 예) cosHandle = @cos은 내장함수 cos의 함수 핸들을 변수 cosHandle에 할당한다. 익명함수는 익명함수의 이름 자체가 함수 핸들이다. 예) 임의의 함수 f(x)를 입력으로 받아 x=a와 x=b 사이의 정의역에 대한 그 래프와 좌우 경계와 중앙에서의 함수 값을 출력하는 사용자정의 함수 함수 파일을 작성하라. 6장 사용자정의 함수와 함수 파일

  32. 함수함수 파일의 작성 예제 function xyout=funplot(Fun, a, b) % funplot은 입력함수 Fun의 그래프를 영역 [a, b]에 대해 그린다. % 입력인자: % Fun = 그래프를 그릴 함수의 함수 핸들 % a = 영역의 첫 번째 점 % b = 영역의 마지막 점 % 출력인자: % xyout = 3×2의 행렬로 세 점 x=a, (a+b)/2, b에서의 x 값과 y 값으로 구성됨 x=linspace(a,b,100); y=Fun(x); plot(x, y) xlabel('x'), ylabel('y') % xyout 행렬 xyout(1,1)=a; xyout(2,1)=(a+b)/2; xyout(3,1)=b; xyout(1,2)=y(1); xyout(2,2)=Fun((a+b)/2); xyout(3,2)=y(100); 6장 사용자정의 함수와 함수 파일

  33. 함수핸들을 이용한 함수함수의 호출 (1/2) 영역 [0.5, 4]에 대한 함수 f(x)=e-0.17xx3-2x2+0.8x-3을 앞의 사용자정의 함수 funplot에 전달하여 결과를 구해 보자. • 사용자정의 함수 파일을 만들어 전달하는 방법 function y=Fdemo(x) y=exp(-0.17*x).*x.^3-2*x.^2+0.8*x-3; >> ydemo=funplot(@Fdemo,0.5,4) ydemo = 0.5000 -2.9852 2.2500 -3.5548 4.0000 0.6235 • 익명함수를 정의하여 전달하는 방법 >> FdemoAnony=@(x) exp(-0.17*x).*x.^3-2*x.^2+0.8*x-3 >> ydemo=funplot(FdemoAnony, 0.5, 4); 6장 사용자정의 함수와 함수 파일

  34. 함수 함수의 입력인자에 전달할 함수의 이름을 문자열로 표기하여 함수 함수를 호출할 수 있다. 함수 핸들이 도입되기 전에 사용된 이 방법보다는 함수 핸들 사용 방법을 권장한다. 함수 함수에서 사용자정의 함수의 이름을 이용하여 함수를 받아들인 경우, 함수 함수 내부에서 받아들인 함수의 값은 feval명령어로 계산해야 한다. 이것이 함수 핸들을 사용할 때와 차이점이다. • feval(function evaluate) 명령어 주어진 입력인자 값에 대한 함수값을 계산함 variable = feval(‘함수 이름’, 입력인자 값) • 함수 이름은 문자열로 표기한다. • 함수는 내장함수 또는 사용자정의 함수일 수 있다. • 입력인자가 두 개 이상이면, 콤마로 입력인자들을 구분한다. • 출력인자가 두 개 이상이면, 출력변수들은 대괄호 안에 콤마로 구분하여입력한다. 함수핸들을 이용한 함수함수의 호출 (2/2) 6장 사용자정의 함수와 함수 파일

  35. feval 명령어의 사용 예 • feval(function evaluate) 명령어의 사용 예 >>feval('sqrt',64) ans = 8 >> x=feval('sin',pi/6) x = 0.5000 • 사용자정의 함수 loan을 feval 명령어에 사용한 예 >> [M,T]=feval('loan',50000,3.9,10)%대출 $50000,연이율 3.9%,기간 10년 M = 502.22 T = 60266.47 function [mpay,tpay]=loan(amount, rate,years) % amount : 대출금, rate : 연이율, years : 대출기간 format bank ratem=rate*0.01/12; a=1+ratem; b=(a^(years*12)-1)/ratem; mpay=amount*a^(years*12)/(a*b) %월 상환액 tpay=mpay*years*12; % 총 상환액 6장 사용자정의 함수와 함수 파일

  36. 함수 이름으로 호출하는 함수함수의 작성 function xyout = funplotS(Fun, a, b) % funplot은 입력함수 Fun의 그래프를 영역 [a, b]에 대해 그린다. % 입력인자: % Fun = 그래프를 그릴 함수의 이름 (문자열 표시) % a = 영역의 첫 번째 점 % b = 영역의 마지막 점 % 출력인자: % xyout = 3×2의 행렬로 세 점 x=a, (a+b)/2, b에서의 x 값과 y 값으로 구성됨 x=linspace(a,b,100); y=feval(Fun, x); % 전달받은 함수를 이용하여 100개의 점에서 f(x) 값을 계산함 plot(x, y) xlabel('x'), ylabel('y') % xyout 행렬 xyout(1,1)=a; xyout(2,1)=(a+b)/2; xyout(3,1)=b; xyout(1,2)=y(1); xyout(2,2)=Feval(Fun, (a+b)/2); xyout(3,2)=y(100); 6장 사용자정의 함수와 함수 파일

  37. 함수 이름에 의한 함수함수의 호출 functionxyout = funplotS(Fun, a, b) • 사용자정의 함수 Fdemo를 이용하여 함수 함수 funplotS를 호출하는 예 • function y=Fdemo(x) • y=exp(-0.17*x).*x.^3-2*x.^2+0.8*x-3; • >> ydemoS=funplotS('Fdemo', 0.5, 4) • ydemoS = • 0.5000 -2.9852 • 2.2500 -3.5548 • 4.0000 0.6235 • >> 6장 사용자정의 함수와 함수 파일

  38. 부함수(Subfunction) 사용자정의 함수의체계적인 작성을 위해,주함수의 프로그램을 작은 작업단위로나눈 후 이들을 함수로 만들 수 있는데, 이 함수들을 부함수라고 한다. 주함수와 부함수들은 하나의 파일에 함께 저장(파일명: 주함수의 이름)되며, 주함수가 처음에 오고 나머지 부함수들의 순서는 임의로 할 수 있다. 각 함수는 함수 정의 라인으로 시작된다. 스크립트 파일이나 외부의 함수에서는 주함수만 호출할 수 있다. 같은 파일에 있는 부함수끼리는 서로 호출할 수 있으며, 각 부함수의 변수들은 지역변수이므로 상대방 함수 안의 변수들에게 접근할 수 없다. function outarg = Pfunc(inarg1, inarg2) % 주함수 x=Sfunc1(inarg1); y=Sfunc2(inarg2); outarg = x*y; function a = Sfunc1(in1) % 부함수 1 a = .... ; function b = Sfunc2(in2) % 부함수 2 b = ... 파일명: Pfunc.m 6장 사용자정의 함수와 함수 파일

  39. 예제 6.4 평균과 표준편차 수 집합의 평균과 표준편차를 계산하는 사용자정의 함수를 작성하라. 주함수와 부함수를 이용하여 다음 성적의 평균과 표준편차를 구하라: 80 75 91 60 79 89 65 80 95 50 81 파일명: stat.m 평균 식과 표준편차 식: function [me, SD] = stat(v) n = length(v); me = AVG(v, n); SD = StandDiv(v, me, n); function av = AVG(x,num) av = sum(x)/num; function Sdiv = StandDiv(x, xAve, num) xdif = x - xAve; xdif2 = xdif.^2; Sdiv = sqrt(sum(xdif2)/(num-1)); 주함수 stat >> Grades=[80 75 91 60 79 89 65 80 95 50 81]; >> [AveGrade, StanDeviation] = stat(Grades) AveGrade = 76.8182 StanDeviation = 13.6661 >> 부함수 6장 사용자정의 함수와 함수 파일

  40. 중첩함수(nested function) 중첩(된)함수는 사용자정의 함수 속에 작성된 또 다른 사용자정의 함수이다. 일반함수와 달리 중첩함수가 포함된 함수와 중첩함수는 모두 end 문으로 끝나야 한다. 중첩함수는 또 다른 중첩함수를 포함할 수도 있다. • 중첩함수가 한 개인 경우 (예:중첩함수B를 포함한 주함수 A) • 중첩함수가 두 개인 경우 (예:중첩함수 B, C를 포함한 주함수 A) function y = A(a1, a2) ....... functionz = B(b1, b2) ....... end ....... end function y = A(a1, a2) ....... functionz = B(b1, b2) ....... end ....... function w = C(c1, c2) ....... end …… end • 각 함수는 end로 끝나야 한다. • 함수 A, B, C는 서로의 작업공간에 접근할 수 있다. • 각 함수는 서로를 호출할 수 있다. 6장 사용자정의 함수와 함수 파일

  41. 같은 레벨의 두 중첩함수를 이용하여 다음 성적의 평균과 표준편차를 계산하라. 80 75 91 60 79 89 65 80 95 50 81 예제 6.4 중첩함수를 이용한 풀이 (1/2) 중첩함수를 이용한 함수 파일 statNest.m function [me, SD] = statNest(v) n = length(v); me = AVG(v); function av = AVG(x) av = sum(x)/n; end function Sdiv = StandDiv(x) xdif = x -me; xdif2 = xdif.^2; Sdiv = sqrt(sum(xdif2)/(n-1)); end SD = StandDiv(v); end 부함수를 이용한 함수 파일 stat.m 주함수 stat function [me, SD] = stat(v) n = length(v); me = AVG(v, n); SD = StandDiv(v, me, n); function av = AVG(x,num) av = sum(x)/num; function Sdiv=StandDiv(x, xAve, num) xdif = x - xAve; xdif2 = xdif.^2; Sdiv = sqrt(sum(xdif2)/(num-1)); 중첩함수 중첩함수 6장 사용자정의 함수와 함수 파일

  42. 중첩함수의 순서는 중요하지 않음 함수 파일의 변수는 해당 함수가 수행 중일 때만 인식되며함수의 종료와 함께 삭제된다. function [me, SD] = statNest(v) n = length(v); me = AVG(v); SD = StandDiv(v); function av = AVG(x) av = sum(x)/n; end function Sdiv = StandDiv(x) xdif = x -me; xdif2 = xdif.^2; Sdiv = sqrt(sum(xdif2)/(n-1)); end end function [me, SD] = statNest(v) n = length(v); me = AVG(v); function av = AVG(x) av = sum(x)/n; end function Sdiv = StandDiv(x) xdif = x -me; xdif2 = xdif.^2; Sdiv = sqrt(sum(xdif2)/(n-1)); end SD = StandDiv(v); end >> Grades=[80 75 91 60 79 89 65 80 95 50 81]; >> [AveGrade, StanDeviation] = stat(Grades) AveGrade = 76.8182 StanDeviation = 13.6661 예제 6.4 중첩함수를 이용한 풀이 (2/2) 6장 사용자정의 함수와 함수 파일

  43. 중첩함수 속에 또 다른 중첩함수를 쓰면 두 레벨의 중첩함수가 생성된다. 네 개의 중첩함수가 두 레벨에 걸쳐 있는 예: 두 레벨의 중첩함수 function y=A(a1,a2) ....... function z=B(b1,b2) ....... function w=C(c1,c2) ....... end end function u=D(d1,d1) ....... function h=E(e1,e1) ....... end end ....... end • A의 A의 중첩함수, C는 B의 중첩함수, D는 A의 중첩함수, E는 D의 중첩함수 • 중첩함수는 자기 위의 레벨에서 호출할 수 있다. 예) A는 B, D를 호출할 수 있으나, C, E를 호출할 수는 없다. • 주함수 안에서 같은 레벨끼리는 서로 호출할 수 있다. 예) 함수 B는 D를, D는 B를 호출할 수 있다. • 중첩함수는 하위의 중첩함수에서 호출될 수 있다. • 주함수에서 정의된 변수는 어떤 레벨의 중첩함수에서도 인식하고 재정의할 수 있다. 6장 사용자정의 함수와 함수 파일

  44. 지수함수 증가/감쇠 모델은 A(t) = A0ekt이다. 단, A0= A(t0). 이 모델을 사용하여 A0와 A(t1)을 알 때 A(t)를 예측하는 사용자정의 함수를 작성하라. 함수 이름과 입력인자는At = expGD(A0,AT1,t1,t)를 사용하라. 여기서 출력인자 At는 A(t)에 해당되며, 입력인자 A0, At1, t1, t는 각각 A0, A(t1), t1, t에 해당된다. 명령어 창에서 이 함수를 이용하여 다음 두 경우의 해를 구하라. a) 멕시코의 인구는 1980년에 6700백만 명, 1986년에 7900백만 명이었다. 2000년의 인구를 추정하라. b) 방사성 물질의 반감기(half-life)는 5.8년이다. 7g의 샘플 중 30년 후에 남게 되는 샘플의 양은 얼마인가? 응용예제 6.5지수함수 증가 및 감쇠 (1/2) • 위 모델의 사용을 위해 먼저 상수 k의 값을 구한다. k가 구해지면 모델을 이용하여 임의 시간에서의 값을 예측할 수 있다. function At=expGD(A0, At1, t1, t) % expGD 지수함수적 증가와 감쇠의 계산 % 입력인자들: A0 = A(0), At1=A(t1) % t1=시간 t1, t=시간 t % 출력인자: At = 시간 t에서의 양 k=log(At1/A0)/t1; At=A0*exp(k*t); 6장 사용자정의 함수와 함수 파일

  45. a) A0=67, A(t1)=79, t1=6, t=20 이므로 해를 다음과 같이 구한다. >> expGD(67,79,6,20) ans = 116.03 b) A0=7, A(t1=5.8)=3.5(반감기: 물질의 양이 반으로 감소하는 데 걸리는 시간)이고, t=30 이므로 해를 다음과 같이 구한다. >> expGD(7, 3.5, 5.8, 30) ans = 0.19 응용예제 6.5(2/2) 6장 사용자정의 함수와 함수 파일

  46. 응용예제 6.6 발사체의 운동 (1/2) 발사체의 궤적을 계산하고 그래프로 그리는 함수 파일을 작성하라. 함수의 입력은 초기 발사속도와 각도이고 출력은 최고 높이와 최대 거리이다. 함수를 사용하여 39°의 각도에서 속도 230 m/s로 발사된 발사체의 궤적을 구하라. • 초기속도 v0의 수평 및 수직 성분: • 수평 방향의 속도와 위치: • 수직 방향의 속도와 위치: • 발사체가 최고점(vy=0)에 도달하는 데 걸리는 시간과 해당 높이: • 총 비행시간(발사체가 최고점에 도달하는 데 걸리는 시간의 두 배) : 6장 사용자정의 함수와 함수 파일

  47. function [hmax, dmax]=trajectory(v0, theta) % trajectory:발사체의 최고 높이와 거리 계산 % 입력인자 : v0=초기속도(m/s), theta=발사각 % 출력인자 : hmax=최고 높이, dmax=최대 거리 % 마지막으로 궤적의 그래프를 그린다. g=9.81; v0x=v0*cos(theta*pi/180); v0y=v0*sin(theta*pi/180); thmax=v0y/g; hmax=v0y^2/(2*g); ttot=2*thmax; dmax=v0x*ttot; % 궤적 그래프 tplot=linspace(0,ttot,200); x=v0x*tplot; y=v0y*tplot-0.5*g*tplot.^2; plot(x,y) xlabel('DISTANCE (m)'); ylabel('HEIGHT (m)') title('PROJECTILE''S TRAJECTORY') 응용예제 6.6 (2/2) 6장 사용자정의 함수와 함수 파일

  48. 6장 끝 6장 강의록 끝 6장 사용자정의 함수와 함수 파일

More Related