반응형
Recent Posts
Recent Comments
Link
관리 메뉴

공머씨의 블로그

내가 공부한 옥타브 21. 익명함수2 본문

내가 공부한 옥타브(매틀랩)/내가 공부한 옥타브 시리즈2 (공업수학1)

내가 공부한 옥타브 21. 익명함수2

공머씨 2020. 5. 9. 23:23
반응형

지난 포스트에서 다뤘던 함수의 함수에 이어서 공부하겠습니다. 

function function에 대해 복습해보겠습니다. 

 

매트랩 내장함수에서 함수를 인자로 전달받는 함수에는 fplot fminbnd fzero integral

이정도가 있습니다. 

 

복습 삼아서 각각에 대해 훝어보도록 하겠습니다 .

 

 

fplot란 함수의 핸들과 x의범위를 입력으로 받아서 함수의 그래프를 주어진 범위에서 그리는 내장함수 입니다. 

예를 들면

fplot를 사용해서 계산 하려면 , 주어진 것 처럼 익명함수로 아래 코드와 같이 

f1()이라는 함수를 정의합니다. 

@표시는 익명함수를 정의한다는뜻,  ()안에는 함수의 인자-독립변수, 그 오른쪽에는 함수의 내용

과 같은 식으로 저장을했습니다. 

이렇게 저장하면  f1이라는 변수는 함수의 핸들을 뜻하게 됩니다. 

f1=@(x) exp(-x).*cos(2*pi*x);
fplot(f1,[0 4]);

 

fplot라는 내장함수는 함수에서 변수x의 시작점,끝점만 입력하면 됩니다. 

 

0부터 4까지의 범위에서 위와 같은 그래프가 출력됩니다. 

 

fminbnd라는 함수를 사용해보겠습니다.

이 함수는 인자로 주어진 fun이라는 함수에 대해서 x1과 x2 범위내에서 최솟값을 찾고

그 최솟값을 일으키는 x값도 찾는 그런 함수 입니다. 

 

이 함수를 사용하려면 어떤 함수를 제공해야합니다. 

이와 같은 함수에 대해서 0과2범위에서 최대,최소값을 찾는 코드입니다. 

 

예시와 같은 함수를 만들어서 최대,최솟값을 구해보도록 하겠습니다. 

 

 

 

f2=@(x) exp(x).*sin(pi*x) %f2를 정의
fplot(f2,[0 2]) %익명함수를 plot하는 함수

[xval1,fmin]=fminbnd(f2, 0,2) %최솟값 찾기 (함수의 핸들을 전달, x의범위)
text(xval1,fmin,['min=' num2str(fmin) 'at x=' num2str(xval1)]); %그래프에서 최솟값지점에 text를 출력

최솟값은 fmin이라는 변수에 들어있으므로 그것을 문자열로 바꿔서 거기다가 붙여주고

또 그때의 x좌표를 표시하고 싶으므로 변수에 들어있는 x값을 문자열로 바꾸는 함수를 사용하면 됩니다. 

 

다음과 같은 화면이 나타납니다. 

 

다음으로 최댓값을 구해보겠습니다. 

최댓값을 구하는 내장함수는 따로 없습니다. 

 

 

 

 

잘 생각해보면 최댓값같은 경우에는

주어진 함수를 x축 대칭이동(전체에 -부호)한 다음,

최솟값함수를 사용해서 구하고

주어진 최솟값에서 -부호를 붙이면 원래함수의 최댓값이 됩니다.

 

 

 

 

 

 

 

 

 

 

최댓값을 구하기 위해 f3이라는 함수를 정의해보겠습니다. 

 

f3=@(x) -f2(x)
[xval2,fmax]=fminbnd(f3,0,2) %최솟값인데 변수명을 fmax로 사용했습니다.
fmax=-fmax

f3이라는것은 원래f3에 -부호를 붙인것이었으므로 fmax=-fmax라는 코드를 작성해줍니다. 

그래프를 그려보겠습니다.

????????/

clear;clc;
lims=[0,2];
f2=@(x) exp(x).*sin(pi*x)
fplot(f2,lims)

[xval,fval]=fminbnd(f2,lims(1),lims(2));
text(xval,fval,['minimum is',num2str(fval),'at x is',num2str(xval)]);

lims2=[0,1];
f3=@(x) -f2(x)
[xval2,fval2]=fminbnd(f3,lims2(1),lims2(2));
text(xval2,fval2,['MAX is',num2str(fval2),'at x is',num2str(xval2)]);

 

 

같은맥락에서 쉽게 사용할 수있는 함수로 fzero라는 함수가 있는데 인자로 받은 fun이라는 함수에 함수값을 0으로 만드는 값을 찾는것인데

y값을 주고 함숫값을 만족하는 x값, 즉, 근을 찾는 함수

전체의 모든 근을 대상으로 찾을수는 없고 초기치를 주면 초기치 근처에 있는 근만 찾을 수 있습니다

다음과 같은 코드를 작성해보겠습니다.

f4=@(x) exp(x).*sin(pi*x-pi/8)
fplot(f4,[0 2])
grid
hold on
x=fzero(f4,0)
plot(x,f4(x),'o')

5번째  줄은 f4의 0근처에서 근을 찾으라는 코드입니다. 

마지막줄은 근을 찾았으면 그지점에 동그라미로 표시를 하라는 명령입니다 . Figure창은 아래와 같습니다 .

 

f(x)는 1근처에서 함수를 0으로 만드는 지점을 나타내는 코드를 추가해보았습니다. 

x는 1.125쯤에서 함수값이 0이 됩니다. 

 

마지막으로  integral이라는 내장함수를 살펴보겠습니다.

적분을 수치적으로 계산하는 함수인데.

f4라는 함수는 익명함수인데 x의제곱

그 함수의 적분을 구하면 됩니다. 괄호안에는 익명함수로 정의된 함수의 핸들, 적분시작점,적분끝점 순서대로 작성해주면 됩니다. 

f5=@(x) x.^2
q=integral(f5,0,2)

f6=@(x) exp(-x.^2).*log(x).^2
q=integral(f6,0,inf) 

f7=@(x) sin(x)
q=integral(f7,0,2*pi)

f6함수의 적분범위에서inf라는 문자가 있는데 무한대까지 적분하라는 뜻입니다 .

다음과 같은 결과가 나옵니다. 

 

 

 

f7의 경우 이미저장되어있는 함수인데 이럴때는 함수이름에 그냥 @를 붙이면 그게 함수의 핸들이 됩니다.

 

 

 

함수의 함수를 사용하는 방법에 대해서 복습해보았습니다. 

각 함수의 q를 직접 적분해보면 매트랩의 결과값과 같음을 알 수 있습니다.

 

 

 

 

 

 

만들어져있는 함수를 직접사용하는것 뿐만아니라.

함수의 평균을 계산해서 return하는 함수를 만들어 보겠습니다. 

ave는 직접설정해둔 변수명입니다.

m파일에 저장한 사용자 정의함수의 코드는 다음과 같습니다

function favg=funcavg(f,a,b,n)
  x=linspace(a,b,n);
  y=f(x);
  favg=mean(y); %mean()이라는 내장함수 
endfunction

 

linspace시작점과 끝점을 점의 개수를 이용해서 x값을 만들어 냅니다. 

시작점,끝점,n개라고 입력하면 시작점과 끝점사이에 n개의 점을 만들어내라는것입니다. 

함숫값은 인자로 들어온 함수가 무엇이 될지 모르지만 무엇이든간에 함숫값을계산하라는 뜻입니다. 

favg는 우리가 만든 함수입니다. mean()이라는 매트랩내장함수를 이용해서 함수를 작성해줍니다. 

구한것을 favg에 대입한뒤 return하게 됩니다. 

funcavg라는 이름으로 m파일을 저장합니다. 

이제 마음대로 사용할 수 있게 됩니다.

 

 

 

 

 

 

 

 

 

 

 

commandwindow에서 함수를 출력하고 싶으면 다음과 같이 입력해주면 됩니다. 

a=funcavg(myf, 0,5,20)이렇게 입력해야 a값이 출력됨...

 

17d의 (1)번의 코드 입니다.

myf=@(x) x.^2
fplot(myf,[0,5])

a=funcavg(myf,0,5,20)

 

x^2이라는 함수에서 0에서 5까지 20등분하고 등분된 지점의x값을 함수에 대입해서 나오는 함숫값들

>>20개가 됩니다.

이 20개 함숫값의 평균을 구하는것이 위 코드입니다.

 

 

 

 

다음문제를 풀어보겠습니다.

 

 

 

(2)번의 코드는 다음과 같습니다.

%ex17d에서 2번 입니다. 
t=[0 12];
g=9.81;cd=0.25;m=68.1;
mys=@(t) sqrt(g*m/cd).*tanh(sqrt(g*cd*t/m));

a=funcavg(mys,0,12,60)

 

 

결과화면 입니다.

 

 

 

 

 

변수가 여러개인 함수를 어떻게 전달할지???

매트랩에서는 일변수함수만 다룰수 있으므로

variable argument함수에 따로 저장합니다.

 

 

문제

 

 

전체코드입니다.

%17e에서 나온 funcavg2함수 파일입니다.
function favg=funcavg2(f,a,b,n,varargin)
   x=linspace(a,b,n);   
   y=f(x,varargin{:}); 
   favg=mean(y);   
endfunction

 

만약 인자가 여러개인 함수를 만들고 싶다면 

var arg이라는 파라미터에 집어넣어서 전달을 하면 됩니다. 

funcavg2는 아까와 다르게 

vararg라는 변수를 하나더 넣어서 그 안에 나머지 값들 g,m,cd에 해당되는것을 모두 넣어서 보냅니다. 

x는 a부터 b까지 n개의 포인트로 정하고 

f함수에는 r기본적인 변수x와 추가적인 변수를 작성합니다.

 

그렇게해서 다음페이지에 보면 사용하는 방법이 나와있습니다.

 

 

 

 

이 함수에 대해서 아까는 17e에서는 g,m,cd값을 다 주고 나서 익명함수로 정의했었는데

17f에서는 funcavg2라는 함수를 사용해서 계산 해보라는 문제입니다.

funcavg1를 사용할때 작성하는 코드의 m파일명을 ex17f1이라고 하였습니다.

 

 

 

전체코드 입니다.

 

 

%funcavg1을 사용할때 작성하는 코드
v=@(t) sqrt(9.81*68.1/0.25)*tanh(sqrt(9.81*0.25/68.1)*t)
avg1=funcavg(v, 0, 12, 60)
v=@(t) sqrt(9.81*100/0.28)*tanh(sqrt(9.81*0.28/100)*t)
avg2=funcavg(v, 0, 12, 60)

 

 

 

 

 

funcavg2를 사용할때 작성하는 코드의 m파일명을 ex17f2라고 하였습니다.

 

%funcavg2를 사용할때 작성하는 코드

vel = @(t, m, cd) sqrt(9.81*m/cd)*tanh(sqrt(9.81*cd/m)*t)
avg1=funcavg2(vel, 0, 12, 60, 68.1, 0.25)
avg2=funcavg2(vel, 0, 12, 60, 100, 0.28)

 

 

 

 

 

 

반응형
Comments