Main Content

fmincon 백그라운드에서 코드 생성

코드 생성이란?

코드 생성은 MATLAB® Coder™를 사용하여 MATLAB 코드를 C 코드로 변환하는 것을 말합니다. 코드를 생성하려면 MATLAB Coder 라이선스가 필요합니다.

일반적으로 MATLAB을 실행하지 않는 하드웨어에서 코드를 배포할 때 코드 생성을 수행합니다. 예를 들어 움직임 최적화 또는 계획 설정을 위해 fmincon을 사용하여 로봇에 코드를 배포할 수 있습니다.

예제는 Generate Code for fmincon 항목을 참조하십시오. 다른 최적화 솔버에서의 코드 생성은 fsolve에 대한 코드 생성하기, quadprog에 대한 코드 생성하기 또는 Generate Code for lsqcurvefit or lsqnonlin 항목을 참조하십시오.

코드 생성 요구 사항

  • fminconcodegen (MATLAB Coder) 함수 또는 MATLAB Coder 앱을 사용한 코드 생성을 지원합니다. 코드를 생성하려면 MATLAB Coder 라이선스가 있어야 합니다.

  • 타깃 하드웨어는 표준 배정밀도 부동소수점 계산 또는 표준 단정밀도 부동소수점 계산을 지원해야 합니다.

  • 코드 생성 대상은 MATLAB 솔버와 동일한 수학 커널 라이브러리를 사용하지 않습니다. 따라서 특히 조건이 나쁜 문제인 경우에 코드 생성의 해가 솔버의 해와 다를 수 있습니다.

  • 생성을 위한 모든 코드는 MATLAB 코드여야 합니다. 구체적으로, 사용자 지정 블랙박스 함수는 fmincon에 대한 목적 함수로 사용할 수 없습니다. C 또는 C++에서 코딩된 사용자 지정 함수는 coder.ceval을 사용하여 실행할 수 있습니다. 단, 사용자 지정 함수를 MATLAB 함수 내부에서 호출해야 합니다.

  • fmincon은 코드 생성 시 problem 인수를 지원하지 않습니다.

    [x,fval] = fmincon(problem) % Not supported
  • 목적 함수와 비선형 제약 조건이 있는 함수를 지정할 때는 문자열이나 문자 이름이 아니라 함수 핸들을 사용해야 합니다.

    x = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon) % Supported
    % Not supported: fmincon('fun',...) or fmincon("fun",...)
  • A, Aeq, lb, ub 같은 fmincon 입력 행렬은 모두 희소 행렬이 아니라 비희소 행렬이어야 합니다. full 함수를 사용하여 희소 행렬을 비희소 행렬로 변환할 수 있습니다.

  • lb 인수와 ub 인수는 x0 인수와 동일한 개수의 요소를 가지거나 비어 있어야 합니다([]).

  • 타깃 하드웨어가 무한 범위를 지원하지 않는 경우 optim.coder.infbound를 사용하십시오.

  • 임베디드 프로세서가 사용되는 고급 코드 최적화의 경우에는 Embedded Coder® 라이선스도 필요합니다.

  • fmincon에 대한 옵션을 포함하고 optimoptions를 사용하여 옵션을 지정해야 합니다. 옵션에는 'sqp' 또는 'sqp-legacy'로 설정된 Algorithm 옵션이 포함되어야 합니다.

    options = optimoptions('fmincon','Algorithm','sqp');
    [x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
  • 코드 생성에 지원되는 옵션은 다음과 같습니다.

    • Algorithm'sqp' 또는 'sqp-legacy'여야 함

    • ConstraintTolerance

    • FiniteDifferenceStepSize

    • FiniteDifferenceType

    • MaxFunctionEvaluations

    • MaxIterations

    • ObjectiveLimit

    • OptimalityTolerance

    • ScaleProblem

    • SpecifyConstraintGradient

    • SpecifyObjectiveGradient

    • StepTolerance

    • TypicalX

  • 생성된 코드는 옵션에 대해 제한적인 오류 검사를 수행합니다. 옵션을 업데이트할 때 권장하는 방법은 점 표기법이 아니라 optimoptions를 사용하는 것입니다.

    opts = optimoptions('fmincon','Algorithm','sqp');
    opts = optimoptions(opts,'MaxIterations',1e4); % Recommended
    opts.MaxIterations = 1e4; % Not recommended
  • 파일에서 옵션을 불러오지 마십시오. 파일에서 불러오면 코드 생성이 실패할 수 있습니다. 대신 코드에서 옵션을 만드십시오.

  • 일반적으로, 지원되지 않는 옵션을 지정하면 코드 생성 시에 해당 옵션이 별다른 표시 없이 무시됩니다. 그러나 점 표기법을 사용하여 플롯 함수 또는 출력 함수를 지정하면 코드 생성에서 오류가 발생할 수 있습니다. 안정적인 코드 생성을 위해 지원되는 옵션만 지정하십시오.

  • 출력 함수와 플롯 함수는 지원되지 않으므로 fmincon은 종료 플래그 –1을 반환하지 않습니다.

  • fmincon에서 생성된 코드에는 반환된 output 구조체에 bestfeasible 필드가 포함되지 않습니다.

단정밀도 코드 생성

단정밀도 부동소수점 하드웨어를 위한 코드를 생성하려면 다음 지침을 따르십시오.

  • fmincon 호출의 모든 파라미터가 단정밀도 값을 갖는지 확인합니다. 여기에는 모든 비어 있는 값과 무한대 값이 포함됩니다. 예를 들어, 3차원 문제의 범위가 lb = [0,-Inf,0]ub = [1,100,Inf]인 경우 파라미터를 다음과 같이 설정합니다.

    lb = [single(0),-optim.coder.infbound("single"),single(0)];
    ub = [single([1,100]),optim.coder.infbound("single")];
  • fmincon에 전달된 모든 비어 있는 인수가 단정밀도인지 확인합니다. 예를 들면 다음과 같습니다.

    Aeq = single([]); % Or single.empty
    beq = single([]); % Or single.empty
  • 모든 비선형 함수, 목적 함수 및 제약 조건이 single형 값을 반환하는지 확인합니다. 예를 들면 다음과 같습니다.

    function f = objfun(x)
    % Must be able to accept x as single.
    % Computations must also produce a single or be cast
    expx = x.^2 + exp(x);          % Produces a single
    f = cast(foo(expx),'like',x);  % foo is unknown, so cast to single
    end
    
    function [c,ceq] = nonlcon(x)
    ceq = single.empty;
    c = exp(-exp(-x)) - single(1/2); % Produces a single
    end

생성된 코드에서 멀티스레드를 사용하지 않음

기본적으로 MATLAB 환경 외부에서 사용하도록 생성된 코드는 멀티스레드가 아닌 선형 대수 라이브러리를 사용합니다. 따라서 이 코드는 MATLAB 환경에서 실행되는 코드보다 상당히 느리게 실행될 수 있습니다.

타깃 하드웨어가 다중 코어를 갖는 경우 사용자 지정 멀티스레드 LAPACK 및 BLAS 라이브러리를 사용하여 성능을 높일 수 있습니다. 이러한 라이브러리를 생성된 코드에 포함하려면 Speed Up Linear Algebra in Generated Standalone Code by Using LAPACK Calls (MATLAB Coder) 항목을 참조하십시오.

참고 항목

| (MATLAB Coder) | |

관련 항목