Main Content

추가 파라미터 전달하기

추가 파라미터, 고정 변수 또는 데이터

때때로 목적 함수 또는 제약 조건 함수는 독립 변수 외에 파라미터를 가집니다. 추가 파라미터는 데이터이거나, 최적화 도중에 변경되지 않는 변수를 나타낼 수 있습니다. 이러한 파라미터를 전달하는 방법에는 다음과 같이 세 가지가 있습니다.

전역 변수는 함수 간에 이름을 재사용하는 것을 허용하지 않으므로 문제가 됩니다. 따라서 다른 두 방법 중 하나를 사용하는 것이 좋습니다.

일반적으로 문제 기반 최적화의 경우 추가 파라미터를 통상적인 방법으로 전달합니다. 문제 기반 접근법에서 추가 파라미터 전달하기 항목을 참조하십시오.

예를 들어, 다음 함수를

f(x)=(abx12+x14/3)x12+x1x2+(c+cx22)x22(1)

서로 다른 값 a, b, c에 대해 최소화하고자 한다고 가정하겠습니다. 솔버는 단 하나의 변수(이 예제에서는 x)에만 의존하는 목적 함수를 받습니다. 다음 섹션에서는 추가 파라미터 a, b, c를 제공하는 방법을 보여줍니다. 해는 fminunc를 사용하여 x0 = [0.5 0.5] 근처에서 파라미터 값 a = 4, b = 2.1, c = 4에 대해 구해집니다.

익명 함수

익명 함수를 사용하여 파라미터를 전달하려면 다음과 같이 하십시오.

  1. 다음 코드를 포함하는 파일을 작성합니다.

    function y = parameterfun(x,a,b,c)
    y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + ...
        (-c + c*x(2)^2)*x(2)^2;

  2. MATLAB® 프롬프트에서 다음 명령을 입력하여 값을 파라미터에 할당하고 익명 함수에 대한 함수 핸들 f를 정의합니다.

    a = 4; b = 2.1; c = 4; % Assign parameter values
    x0 = [0.5,0.5];
    f = @(x)parameterfun(x,a,b,c);

  3. 다음과 같이 익명 함수를 사용하여 솔버 fminunc를 호출합니다.

    [x,fval] = fminunc(f,x0)
    다음과 같이 출력값이 명령 창에 표시됩니다.
    Local minimum found.
    
    Optimization completed because the size of the gradient is less than
    the default value of the function tolerance.
    
    x =
       -0.0898    0.7127
    
    fval =
       -1.0316

참고

익명 함수에 전달된 파라미터는 익명 함수가 생성된 시점에 존재하는 파라미터입니다. 다음 예제를 살펴보겠습니다.

a = 4; b = 2.1; c = 4;
f = @(x)parameterfun(x,a,b,c)

이후에 a를 3으로 변경하고 다음을 실행한다고 가정하겠습니다.

[x,fval] = fminunc(f,x0)

parameterfunf가 생성된 시점의 값인 a = 4를 사용하므로 전과 동일한 답을 얻게 됩니다.

함수에 전달된 파라미터 값을 변경하려면 다음을 다시 입력하여 익명 함수를 갱신하십시오.

a = 3;
f = @(x)parameterfun(x,a,b,c)

둘 이상의 인수로 구성된 익명 함수를 만들 수 있습니다. 예를 들어, lsqcurvefit을 사용하려면 다음과 같이 두 개의 입력 인수 xxdata를 받는 함수를 먼저 만드십시오.

fh = @(x,xdata)(sin(x).*xdata +(x.^2).*cos(xdata));
x = pi; xdata = pi*[4;2;3];
fh(x, xdata)
ans =

    9.8696
    9.8696
   -9.8696
이제 lsqcurvefit을 호출하십시오.
% Assume ydata exists
x = lsqcurvefit(fh,x,xdata,ydata)

중첩 함수

중첩 함수를 통해 수식 1에 대한 파라미터를 전달하려면 다음을 만족하는 단일 파일을 작성해야 합니다.

  • 입력값으로 a, b, c, x0을 받습니다.

  • 목적 함수를 중첩 함수의 형태로 포함합니다.

  • fminunc를 호출합니다.

다음은 이 예제에 대한 함수 파일의 코드입니다.

function [x,fval] =  runnested(a,b,c,x0) 
[x,fval] = fminunc(@nestedfun,x0);
% Nested function that computes the objective function     
    function y = nestedfun(x)
        y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) +...
            (-c + c*x(2)^2)*x(2)^2;     
    end
end
목적 함수는 변수 a, b, c에 액세스할 수 있는 중첩 함수 nestedfun입니다.

최적화를 실행하려면 다음을 입력하십시오.

a = 4; b = 2.1; c = 4;% Assign parameter values
x0 = [0.5,0.5];
[x,fval] = runnested(a,b,c,x0)
출력값은 익명 함수에서와 동일합니다.

전역 변수

전역 변수는 문제가 있을 수 있으므로 사용하지 않는 것이 좋습니다. 또한, 전역 변수는 병렬 계산에서 실패합니다. Factors That Affect Results 항목을 참조하십시오.

전역 변수를 사용하려면 변수를 사용하는 함수와 작업 공간에서 전역 변수가 되도록 변수를 선언하십시오.

  1. 다음과 같이 함수 파일을 작성합니다.

    function y = globalfun(x)
    global a b c
    y = (a - b*x(1)^2 + x(1)^4/3)*x(1)^2 + x(1)*x(2) + ...
        (-c + c*x(2)^2)*x(2)^2;

  2. MATLAB 작업 공간에서 다음과 같이 변수를 정의하고 fminunc를 실행합니다.

    global a b c;
    a = 4; b = 2.1; c = 4; % Assign parameter values
    x0 = [0.5,0.5];
    [x,fval] = fminunc(@globalfun,x0)

출력값은 익명 함수에서와 동일합니다.

관련 항목