Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

fsolve

비선형 연립방정식 풀기

설명

비선형 시스템 솔버

다음으로 지정된 문제를 풉니다.

F(x) = 0

x에 대한 문제이며, 여기서 F(x)는 벡터 값을 반환하는 함수입니다.

x는 벡터 또는 행렬입니다. 행렬 인수 항목을 참조하십시오.

x = fsolve(fun,x0)x0에서 시작하여 0으로 구성된 배열인 방정식 fun(x) = 0을 풀려고 시도합니다.

참고

추가 파라미터 전달하기에는 필요한 경우 추가 파라미터를 벡터 함수 fun(x)에 전달하는 방법이 설명되어 있습니다. 파라미터화된 방정식 풀기 항목을 참조하십시오.

예제

x = fsolve(fun,x0,options)options에 지정된 최적화 옵션을 사용하여 방정식을 풉니다. 이 옵션을 설정하려면 optimoptions를 사용하십시오.

예제

x = fsolve(problem)problem에 설명되어 있는 구조체인 problem을 풉니다.

예제

[x,fval] = fsolve(___)는 모든 구문에서 해 x에서의 목적 함수 fun의 값을 반환합니다.

예제

[x,fval,exitflag,output] = fsolve(___)fsolve의 종료 상황을 설명하는 값 exitflag와 최적화 과정에 대한 정보가 포함된 구조체 output을 추가로 반환합니다.

예제

[x,fval,exitflag,output,jacobian] = fsolve(___)는 해 x에서의 fun의 야코비 행렬을 반환합니다.

예제

모두 축소

이 예제에서는 두 변수로 구성된 두 비선형 방정식을 푸는 방법을 보여줍니다. 방정식은 다음과 같습니다.

e-e-(x1+x2)=x2(1+x12)x1cos(x2)+x2sin(x1)=12.

이 방정식을 F(x)=0 형식으로 변환합니다.

e-e-(x1+x2)-x2(1+x12)=0x1cos(x2)+x2sin(x1)-12=0.

이 예제를 실행할 때 제공되는 root2d.m 함수가 값을 계산합니다.

type root2d.m
function F = root2d(x)

F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

[0,0]에서 시작하여 연립방정식을 풉니다.

fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 1×2

    0.3532    0.6061

비선형 시스템의 풀이 과정을 검토합니다.

계산 과정은 표시하지 않되, 알고리즘이 반복됨에 따라 0으로 수렴되는 1차 최적성을 표시하는 플롯 함수는 포함하도록 옵션을 설정합니다.

options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);

비선형 시스템의 방정식은 다음과 같습니다.

e-e-(x1+x2)=x2(1+x12)x1cos(x2)+x2sin(x1)=12.

이 방정식을 F(x)=0 형식으로 변환합니다.

e-e-(x1+x2)-x2(1+x12)=0x1cos(x2)+x2sin(x1)-12=0.

root2d 함수는 이 두 방정식의 좌변을 계산합니다.

type root2d.m
function F = root2d(x)

F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

[0,0]에서 시작하여 비선형 시스템을 푼 다음 풀이 과정을 살펴봅니다.

fun = @root2d;
x0 = [0,0];
x = fsolve(fun,x0,options)

x = 1×2

    0.3532    0.6061

추가 파라미터 전달하기 항목에 설명한 대로 방정식을 파라미터화할 수 있습니다. 예를 들어, 이 예제 마지막 부분에 있는 헬퍼 함수 paramfunc로 파라미터화된 다음의 연립방정식을 만듭니다.

2x1+x2=exp(cx1)-x1+2x2=exp(cx2).

특정 값에 대한 연립방정식을 풀려면(이 경우 c=-1), 작업 공간에 c를 설정하고 paramfun으로부터 x의 익명 함수를 만듭니다.

c = -1;
fun = @(x)paramfun(x,c);

x0 = [0 1]에서 시작하여 연립방정식을 풉니다.

x0 = [0 1];
x = fsolve(fun,x0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 1×2

    0.1976    0.4255

c의 다른 값을 구하려면, 작업 공간에 c를 입력하고 fun 함수를 다시 생성하십시오. 그러면 함수는 새로운 c 값을 갖게 됩니다.

c = -2;
fun = @(x)paramfun(x,c); % fun now has the new c value
x = fsolve(fun,x0)
Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 1×2

    0.1788    0.3418

헬퍼 함수

다음 코드는 paramfun 헬퍼 함수를 생성합니다.

function F = paramfun(x,c)
F = [ 2*x(1) + x(2) - exp(c*x(1))
      -x(1) + 2*x(2) - exp(c*x(2))];
end

fsolve에 대한 문제 구조체를 만들고 문제를 풉니다.

디폴트가 아닌 옵션을 사용한 풀이에 나온 것과 동일한 문제를 풀되, 문제 구조체를 사용하여 문제를 정식화합니다.

계산 과정은 표시하지 않되, 알고리즘이 반복됨에 따라 0으로 수렴되는 1차 최적성을 표시하는 플롯 함수는 포함하도록 문제의 옵션을 설정합니다.

problem.options = optimoptions('fsolve','Display','none','PlotFcn',@optimplotfirstorderopt);

비선형 시스템의 방정식은 다음과 같습니다.

e-e-(x1+x2)=x2(1+x12)x1cos(x2)+x2sin(x1)=12.

이 방정식을 F(x)=0 형식으로 변환합니다.

e-e-(x1+x2)-x2(1+x12)=0x1cos(x2)+x2sin(x1)-12=0.

root2d 함수는 이 두 방정식의 좌변을 계산합니다.

type root2d
function F = root2d(x)

F(1) = exp(-exp(-(x(1)+x(2)))) - x(2)*(1+x(1)^2);
F(2) = x(1)*cos(x(2)) + x(2)*sin(x(1)) - 0.5;

문제 구조체의 나머지 필드를 만듭니다.

problem.objective = @root2d;
problem.x0 = [0,0];
problem.solver = 'fsolve';

문제를 풉니다.

x = fsolve(problem)

x = 1×2

    0.3532    0.6061

이 예제에서는 다음과 같이 두 개의 방정식과 두 개의 미지수로 구성된 시스템에 대한 풀이의 반복 과정을 표시합니다.

2x1-x2=e-x1-x1+2x2=e-x2.

이 방정식을 F(x) = 0 형식으로 다시 작성합니다.

2x1-x2-e-x1=0-x1+2x2-e-x2=0.

x0 = [-5 -5]에서 해 탐색을 시작합니다.

먼저, x에서 방정식 값 F를 계산하는 함수를 작성합니다.

F = @(x) [2*x(1) - x(2) - exp(-x(1));
         -x(1) + 2*x(2) - exp(-x(2))];

초기점 x0을 만듭니다.

x0 = [-5;-5];

반복 과정을 표시하도록 옵션을 설정합니다.

options = optimoptions('fsolve','Display','iter');

방정식을 풉니다.

[x,fval] = fsolve(F,x0,options)
                                             Norm of      First-order   Trust-region
 Iteration  Func-count     ||f(x)||^2           step       optimality         radius
     0          3             47071.2                        2.29e+04              1
     1          6             12003.4              1         5.75e+03              1
     2          9             3147.02              1         1.47e+03              1
     3         12             854.452              1              388              1
     4         15             239.527              1              107              1
     5         18             67.0412              1             30.8              1
     6         21             16.7042              1             9.05              1
     7         24             2.42788              1             2.26              1
     8         27            0.032658       0.759511            0.206            2.5
     9         30         7.03149e-06       0.111927          0.00294            2.5
    10         33         3.29525e-13     0.00169132         6.36e-07            2.5

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
x = 2×1

    0.5671
    0.5671

fval = 2×1
10-6 ×

   -0.4059
   -0.4059

반복 과정에서 함수 F(x)의 노름에 대한 제곱인 f(x)가 표시됩니다. 이 값은 반복이 진행될 때마다 0에 가깝게 감소합니다. 마찬가지로 1차 최적성 측정값도 반복이 진행될 때마다 0에 가깝게 감소합니다. 이러한 요소가 해에 대한 반복 수렴을 나타냅니다. 다른 요소에 대한 의미는 반복 과정 표시 항목을 참조하십시오.

fval 출력값은 함수 값 F(x)를 제공하고, 이 값은 해(FunctionTolerance 허용오차 내에서)에서 0이어야 합니다.

다음을 충족하는 행렬 X를 구합니다.

X*X*X=[1234],

x0 = [1,1;1,1]에서 시작합니다. 행렬 방정식을 계산하는 익명 함수를 만들고 점 x0을 생성합니다.

fun = @(x)x*x*x - [1,2;3,4];
x0 = ones(2);

계산 과정을 표시하지 않도록 옵션을 설정합니다.

options = optimoptions('fsolve','Display','off');

fsolve 출력값을 검토하여 해의 품질과 풀이 과정을 확인합니다.

[x,fval,exitflag,output] = fsolve(fun,x0,options)
x = 2×2

   -0.1291    0.8602
    1.2903    1.1612

fval = 2×2
10-9 ×

   -0.2742    0.1258
    0.1876   -0.0864

exitflag = 1
output = struct with fields:
       iterations: 11
        funcCount: 52
        algorithm: 'trust-region-dogleg'
    firstorderopt: 4.0197e-10
          message: 'Equation solved....'

종료 플래그 값 1은 해를 신뢰할 수 있음을 나타냅니다. 잔차(fval의 제곱합)를 계산하여 0에 얼마나 가까운지 살펴봄으로써 이를 수동으로 확인할 수 있습니다.

sum(sum(fval.*fval))
ans = 1.3367e-19

이렇게 잔차가 작을 경우 x가 해라는 것을 확인할 수 있습니다.

output 구조체에서 해를 구하기 위해 fsolve가 수행한 반복 횟수와 함수 실행 횟수를 확인할 수 있습니다.

입력 인수

모두 축소

풀려는 비선형 방정식으로, 함수 핸들 또는 함수 이름으로 지정됩니다. fun은 벡터 x를 받고 x에서 계산된 비선형 방정식 값인 벡터 F를 반환하는 함수입니다. 풀려는 방정식은 F의 모든 성분에서 F = 0입니다. 함수 fun은 다음과 같이 파일에 대한 함수 핸들로 지정할 수 있습니다.

x = fsolve(@myfun,x0)

여기서 myfun은 다음과 같은 MATLAB® 함수입니다.

function F = myfun(x)
F = ...            % Compute function values at x

fun을 익명 함수에 대한 함수 핸들로 지정할 수도 있습니다.

x = fsolve(@(x)sin(x.*x),x0);

fsolve 함수는 xx0 인수 형태로 목적 함수에 전달합니다. 예를 들어, x0이 5×3 배열이면 fsolve 함수는 x를 5×3 배열로 fun에 전달합니다.

야코비 행렬도 계산할 수 있고 'SpecifyObjectiveGradient' 옵션이 다음 설정처럼 true인 경우

options = optimoptions('fsolve','SpecifyObjectiveGradient',true)

함수 fun은 두 번째 출력 인수로 x에서 계산된 행렬 값인 야코비 행렬 값 J를 반환해야 합니다.

funm개의 성분으로 구성된 벡터(행렬)을 반환하고 x의 길이가 n이면(여기서 nx0의 길이임), 야코비 행렬 Jm×n 행렬입니다. 여기서 J(i,j)x(j)에 대한 F(i)의 편도함수입니다. 야코비 행렬 JF의 기울기의 전치입니다.

예: fun = @(x)x*x*x-[1,2;3,4]

데이터형: char | function_handle | string

초기점으로, 실수형 벡터나 실수형 배열로 지정됩니다. fsolvex0의 크기와 요소 개수를 사용하여 fun이 받는 변수의 크기와 개수를 확인합니다.

예: x0 = [1,2,3,4]

데이터형: double

최적화 옵션으로, optimoptions의 출력값 또는 optimset 등이 반환하는 구조체로 지정됩니다.

옵션에 따라 모든 알고리즘에 적용되는 옵션이 있고 특정 알고리즘에만 유효한 옵션이 있습니다. 자세한 내용은 최적화 옵션 참조 항목을 참조하십시오.

일부 옵션은 optimoptions 표시에 나타나지 않습니다. 이러한 옵션은 다음 표에서 기울임꼴로 표시되어 있습니다. 자세한 내용은 최적화 옵션 보기 항목을 참조하십시오.

모든 알고리즘
Algorithm

'trust-region-dogleg'(디폴트 값), 'trust-region', 'levenberg-marquardt' 중에서 선택합니다.

Algorithm 옵션은 사용할 알고리즘에 대한 기본 설정을 지정합니다. 이는 단지 기본적인 설정에 불과합니다. trust-region 알고리즘이라면 비선형 연립방정식이 부족 결정 시스템이어서는 안 됩니다. 다시 말해 방정식 개수(fun이 반환하는 F의 요소 개수)가 x의 길이보다 크거나 같아야 합니다. 마찬가지로 trust-region-dogleg 알고리즘이라면 방정식 개수가 x의 길이와 같아야 합니다. fsolve는 선택한 알고리즘을 사용할 수 없는 경우 Levenberg-Marquardt 알고리즘을 사용합니다. 알고리즘을 선택하는 방법에 대한 자세한 내용은 알고리즘 선택하기 항목을 참조하십시오.

optimoptions 대신 optimset을 사용하여 알고리즘 옵션을 설정하려면 다음과 같이 하십시오

  • Algorithm — 알고리즘을 'trust-region' 대신 'trust-region-reflective'로 설정합니다.

  • InitDampingAlgorithm을 셀형 배열(예: {'levenberg-marquardt',.005})로 설정하여 초기 Levenberg-Marquardt 파라미터 λ를 설정합니다.

CheckGradients

사용자 제공 도함수(목적 함수 또는 제약 조건의 기울기)를 유한 차분 도함수와 비교합니다. true 또는 false(디폴트 값)를 선택할 수 있습니다.

optimset의 경우, 이 이름은 DerivativeCheck이고 값은 'on' 또는 'off'입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

CheckGradients 옵션은 향후 릴리스에서 제거될 예정입니다. 도함수를 검사하려면 checkGradients 함수를 사용하십시오.

Diagnostics

최소화하거나 풀려는 함수에 대한 진단 정보를 표시합니다. 'on' 또는 'off'(디폴트 값)를 선택할 수 있습니다.

DiffMaxChange

유한 차분 기울기에 대한 변수의 최대 변화량입니다(양의 스칼라). 디폴트 값은 Inf입니다.

DiffMinChange

유한 차분 기울기에 대한 변수의 최소 변화량입니다(양의 스칼라). 디폴트 값은 0입니다.

Display

표시 수준입니다(반복 과정 표시 참조):

  • 'off' 또는 'none'은 출력값을 표시하지 않습니다.

  • 'iter'는 각 반복마다 출력값을 표시하고 디폴트 종료 메시지를 제공합니다.

  • 'iter-detailed'는 각 반복마다 출력값을 표시하고 기술적인 종료 메시지를 제공합니다.

  • 'final'(디폴트 값)은 최종 출력값만 표시하고 디폴트 종료 메시지를 제공합니다.

  • 'final-detailed'는 최종 출력값만 표시하고 기술적인 종료 메시지를 제공합니다.

FiniteDifferenceStepSize

유한 차분에 대한 스칼라 또는 벡터 스텝 크기 인자입니다. FiniteDifferenceStepSize를 벡터 v로 설정하는 경우 전향 유한 차분 delta는 다음과 같습니다.

delta = v.*sign′(x).*max(abs(x),TypicalX);

여기서 sign′(x) = sign(x)입니다(단, sign′(0) = 1임). 중심 유한 차분은 다음과 같습니다.

delta = v.*max(abs(x),TypicalX);

스칼라 FiniteDifferenceStepSize는 벡터로 확장됩니다. 디폴트 값은 전향 유한 차분의 경우 sqrt(eps)이고 중심 유한 차분의 경우 eps^(1/3)입니다.

optimset의 경우, 이 이름은 FinDiffRelStep입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

FiniteDifferenceType

기울기를 추정하는 데 사용되는 유한 차분으로, 'forward'(디폴트 값) 또는 'central'(중심화됨)입니다. 'central'은 함수 실행 횟수가 2배 더 많지만 더 정확합니다.

알고리즘은 두 유형의 유한 차분을 모두 추정하는 경우 범위를 준수하려고 노력합니다. 예를 들어, 범위 외부에 있는 점에서 실행되는 것을 방지하기 위해 전향 차분이 아니라 후향 차분을 사용할 수 있습니다.

optimset의 경우, 이 이름은 FinDiffType입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

FunctionTolerance

함수 값에 대한 종료 허용오차로, 음이 아닌 스칼라입니다. 디폴트 값은 1e-6입니다. 허용오차와 중지 기준 항목을 참조하십시오.

optimset의 경우, 이 이름은 TolFun입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

FunValCheck

목적 함수 값이 유효한지 여부를 확인합니다. 'on'은 목적 함수가 complex, Inf 또는 NaN 값을 반환하는 경우에 오류를 표시합니다. 디폴트 값인 'off'는 오류를 표시하지 않습니다.

MaxFunctionEvaluations

허용되는 함수 실행의 최대 횟수로, 음이 아닌 정수입니다. 디폴트 값은 'trust-region-dogleg' 알고리즘과 'trust-region' 알고리즘의 경우 100*numberOfVariables이고, 'levenberg-marquardt' 알고리즘의 경우 200*numberOfVariables입니다. 허용오차와 중지 기준 항목과 반복 횟수와 함수 실행 횟수 항목을 참조하십시오.

optimset의 경우, 이 이름은 MaxFunEvals입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

MaxIterations

허용되는 최대 반복 횟수로, 음이 아닌 정수입니다. 디폴트 값은 400입니다. 허용오차와 중지 기준 항목과 반복 횟수와 함수 실행 횟수 항목을 참조하십시오.

optimset의 경우, 이 이름은 MaxIter입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

OptimalityTolerance

1차 최적성에 대한 종료 허용오차(음이 아닌 스칼라)입니다. 디폴트 값은 1e-6입니다. 1차 최적성 측정값 항목을 참조하십시오.

내부적으로, 'levenberg-marquardt' 알고리즘은 최적성 허용오차(중지 기준) 1e-4FunctionTolerance를 곱한 값을 사용하고 OptimalityTolerance는 사용하지 않습니다.

OutputFcn

각 반복마다 최적화 함수가 호출하는 하나 이상의 사용자 정의 함수를 지정합니다. 함수 핸들 또는 함수 핸들 셀형 배열을 전달합니다. 디폴트 값은 없음([])입니다. Output Function and Plot Function Syntax 항목을 참조하십시오.

PlotFcn

알고리즘이 실행되는 동안 다양한 진행률 측정값을 플로팅합니다. 미리 정의된 플롯에서 선택하거나 사용자가 직접 작성할 수 있습니다. 내장 플롯 함수 이름, 함수 핸들 또는 내장 플롯 함수 이름이나 함수 핸들로 구성된 셀형 배열을 전달하십시오. 사용자 지정 플롯 함수의 경우, 함수 핸들을 전달하십시오. 디폴트 값은 없음([])입니다.

  • 'optimplotx'는 현재 점을 플로팅합니다.

  • 'optimplotfunccount'는 함수 실행 횟수를 플로팅합니다.

  • 'optimplotfval'은 함수 값을 플로팅합니다.

  • 'optimplotstepsize'는 스텝 크기를 플로팅합니다.

  • 'optimplotfirstorderopt'는 1차 최적성 측정값을 플로팅합니다.

사용자 지정 플롯 함수는 출력 함수와 동일한 구문을 사용합니다. Optimization Toolbox의 출력 함수 항목과 Output Function and Plot Function Syntax 항목을 참조하십시오.

optimset의 경우, 이 이름은 PlotFcns입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

SpecifyObjectiveGradient

true인 경우, fsolve는 목적 함수에 대해 사용자 정의 야코비 행렬(fun에서 정의됨) 또는 야코비 행렬 정보(JacobianMultiplyFcn을 사용하는 경우)를 사용합니다. false(디폴트 값)인 경우, fsolve는 유한 차분을 사용하여 야코비 행렬의 근삿값을 계산합니다.

optimset의 경우, 이 이름은 Jacobian이고 값은 'on' 또는 'off'입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

StepTolerance

x에 대한 종료 허용오차로, 음이 아닌 스칼라입니다. 디폴트 값은 1e-6입니다. 허용오차와 중지 기준 항목을 참조하십시오.

optimset의 경우, 이 이름은 TolX입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

TypicalX

일반적인 x 값입니다. TypicalX의 요소 개수는 시작점 x0의 요소 개수와 같습니다. 디폴트 값은 ones(numberofvariables,1)입니다. fsolve는 기울기 추정을 위해 유한 차분을 스케일링하는 데 TypicalX를 사용합니다.

trust-region-dogleg 알고리즘은 스케일링 행렬의 대각 항으로 TypicalX를 사용합니다.

UseParallel

true인 경우 fsolve는 기울기를 병렬로 추정합니다. 디폴트 값 false로 설정하면 비활성화됩니다. 병렬 연산 항목을 참조하십시오.

trust-region 알고리즘
JacobianMultiplyFcn

야코비 행렬의 곱셈 함수로, 함수 핸들로 지정됩니다. 특정 구조를 가진 대규모 문제의 경우, 이 함수는 J를 실제로 구성하지 않고 야코비 행렬 곱 J*Y, J'*Y 또는 J'*(J*Y)를 계산합니다. 이 함수의 형식은 다음과 같습니다.

W = jmfun(Jinfo,Y,flag)

여기서 JinfoJ*Y(또는 J'*YJ'*(J*Y))를 계산하는 데 사용되는 데이터를 포함합니다. 첫 번째 인수 Jinfo는 목적 함수 fun이 반환하는 두 번째 인수입니다. 예를 들어 다음과 같습니다.

[F,Jinfo] = fun(x)

Y는 문제의 차원과 동일한 개수의 행을 갖는 행렬입니다. flag는 계산해야 하는 곱을 결정합니다.

  • flag == 0이면 W = J'*(J*Y)입니다.

  • flag > 0이면 W = J*Y입니다.

  • flag < 0이면 W = J'*Y입니다.

어느 경우든 J가 명시적으로 구성되지는 않습니다. fsolveJinfo를 사용하여 선조건자를 계산합니다. jmfun에 필요한 추가 파라미터의 값을 제공하는 방법에 대한 자세한 내용은 추가 파라미터 전달하기 항목을 참조하십시오.

참고

fsolvefun에서 jmfun으로 Jinfo를 전달하도록 하려면 'SpecifyObjectiveGradient'true로 설정되어야 합니다.

유사한 예제는 Minimization with Dense Structured Hessian, Linear Equalities 항목을 참조하십시오.

optimset의 경우, 이 이름은 JacobMult입니다. 현재 옵션 이름과 이전 옵션 이름 항목을 참조하십시오.

JacobPattern

유한 차분을 위한 야코비 행렬의 희소성 패턴입니다. fun(i)x(j)에 종속되는 경우 JacobPattern(i,j) = 1을 설정합니다. 그렇지 않은 경우 JacobPattern(i,j) = 0을 설정합니다. 다시 말해, ∂fun(i)/∂x(j) ≠ 0이 성립하는 경우 JacobPattern(i,j) = 1을 설정합니다.

JacobPatternfun의 야코비 행렬 J를 계산하는 것이 번거롭고 fun(i)x(j)에 종속된다는 사실은 (조사를 통해) 확인할 수 있는 경우에 사용합니다. JacobPattern을 제공하는 경우 fsolve는 희소 유한 차분을 통해 J의 근삿값을 계산할 수 있습니다.

최악의 경우, 구조를 알 수 없다면 JacobPattern을 설정하지 마십시오. 이 경우 기본적으로 JacobPattern이 1로 구성된 조밀 행렬인 것처럼 동작합니다. 그러면 fsolve가 각 반복마다 비희소 유한 차분 근삿값을 계산합니다. 이 과정은 대규모 문제의 경우 시간이 아주 오래 걸릴 수 있으므로 희소성 구조를 확인하는 것이 일반적으로 더 좋습니다.

MaxPCGIter

최대 PCG(선조건 적용 켤레 기울기) 반복 횟수로, 양의 스칼라입니다. 디폴트 값은 max(1,floor(numberOfVariables/2))입니다. 자세한 내용은 방정식 풀이 알고리즘 항목을 참조하십시오.

PrecondBandWidth

PCG에 대한 선조건자의 상부 대역폭으로, 음이 아닌 정수입니다. 디폴트 값 PrecondBandWidthInf이며, 이는 직접 분해(촐레스키)가 켤레 기울기(CG) 대신 사용된다는 것을 의미합니다. 직접 분해는 CG보다 계산량이 더 많지만 해에 다가가는 데 있어 더 나은 품질의 스텝을 생성합니다. 대각 선조건 지정에서는 PrecondBandWidth0으로 설정합니다(상부 대역폭: 0). 일부 문제의 경우, 중간 대역폭을 사용하면 PCG 반복 횟수가 줄어듭니다.

SubproblemAlgorithm

반복 스텝이 계산되는 방식을 결정합니다. 디폴트 값 'factorization''cg'보다 더 느리지만 더 정확한 스텝을 실행합니다. Trust-Region 알고리즘 항목을 참조하십시오.

TolPCG

PCG 반복에 대한 종료 허용오차로, 양의 스칼라입니다. 디폴트 값은 0.1입니다.

Levenberg-Marquardt 알고리즘
InitDamping

Levenberg-Marquardt 파라미터의 초기값으로, 양의 스칼라입니다. 디폴트 값은 1e-2입니다. 자세한 내용은 Levenberg-Marquardt 방법 항목을 참조하십시오.

ScaleProblem

'jacobian'을 사용하면 잘못 스케일링된 문제의 수렴이 향상될 수도 있습니다. 디폴트 값은 'none'입니다.

예: options = optimoptions('fsolve','FiniteDifferenceType','central')

문제 구조체로, 다음 필드를 가진 구조체로 지정됩니다.

필드 이름항목

objective

목적 함수

x0

x의 초기점

solver

'fsolve'

options

optimoptions로 생성되는 옵션

데이터형: struct

출력 인수

모두 축소

해로, 실수형 벡터나 실수형 배열로 반환됩니다. x의 크기는 x0의 크기와 같습니다. 일반적으로 xexitflag가 양수인 경우 문제에 대한 국소해입니다. 해의 품질에 대한 자세한 내용은 솔버가 성공한 경우 항목을 참조하십시오.

해에서 계산된 목적 함수 값으로, 실수형 벡터로 반환됩니다. 일반적으로 fval = fun(x)입니다.

fsolve가 중지된 이유로, 정수로 반환됩니다.

1

방정식을 풀었습니다. 1차 최적성이 작습니다.

2

방정식을 풀었습니다. x의 변화량이 지정된 허용오차보다 작거나, x에서 야코비 행렬이 정의되어 있지 않습니다.

3

방정식을 풀었습니다. 잔차의 변화량이 지정된 허용오차보다 작습니다.

4

방정식을 풀었습니다. 탐색 방향의 크기가 지정된 허용오차보다 작습니다.

0

반복 횟수가 options.MaxIterations를 초과하거나, 함수 실행 횟수가 options.MaxFunctionEvaluations를 초과했습니다.

-1

출력 함수 또는 플롯 함수가 알고리즘을 중지했습니다.

-2

방정식을 풀지 못했습니다. 종료 메시지에 추가 정보가 포함될 수 있습니다.

-3

방정식을 풀지 못했습니다. 신뢰 영역 반지름이 너무 작아졌습니다(trust-region-dogleg 알고리즘).

최적화 과정에 대한 정보로, 다음 필드를 가진 구조체로 반환됩니다.

iterations

수행된 반복 횟수

funcCount

함수 실행 횟수

algorithm

사용된 최적화 알고리즘

cgiterations

총 PCG 반복 횟수('trust-region' 알고리즘만 해당)

stepsize

x의 최종 변위('trust-region-dogleg'에는 해당되지 않음)

firstorderopt

1차 최적성에 대한 측정값

message

종료 메시지

해에서 계산된 야코비 행렬로, 실수형 행렬로 반환됩니다. jacobian(i,j)는 해 x에서 계산된 x(j)에 대한 fun(i)의 편도함수입니다.

해에서 활성 제약 조건이 있는 문제의 경우 jacobian은 신뢰구간을 추정하는 데 유용하지 않습니다.

제한 사항

  • 풀려는 함수는 연속 함수여야 합니다.

  • 성공할 경우 fsolve는 하나의 근만 제공합니다.

  • 디폴트 값인 trust-region dogleg 방법은 연립방정식이 정사각 행렬인 경우(즉, 방정식 개수가 미지수 개수와 같음)에만 사용할 수 있습니다. Levenberg-Marquardt 방법을 사용하는 경우 연립방정식이 정사각 행렬일 필요가 없습니다.

  • 변수가 수천 개 이상 있는 큰 문제의 경우, Algorithm 옵션을 'trust-region'으로 설정하고 SubproblemAlgorithm 옵션을 'cg'로 설정하면 메모리를 절약할 수 있으며 시간도 절약할 수 있습니다.

알고리즘

Levenberg-Marquardt 방법과 trust-region 방법은 lsqnonlin에도 사용된 비선형 최소제곱 알고리즘을 기반으로 합니다. 시스템이 0을 가지지 않을 가능성이 있는 경우 이 방법 중 하나를 사용하십시오. 알고리즘은 여전히 잔차가 작은 점을 반환합니다. 하지만, 시스템의 야코비 행렬이 특이 행렬인 경우 알고리즘이 연립방정식의 해가 아닌 점으로 수렴할 수 있습니다(제한 사항 참조).

  • 기본적으로 fsolve는 trust-region dogleg 알고리즘을 선택합니다. 이 알고리즘은 파월(Powell)의 dogleg 방법([8]에 설명되어 있음)의 변형입니다. 이는 [7]에 구현된 알고리즘과 성격이 비슷합니다. Trust-Region-Dogleg 알고리즘 항목을 참조하십시오.

  • trust-region 알고리즘은 부분공간 trust-region 방법이며 interior-reflective 뉴턴 방법([1][2]에 설명되어 있음)을 기반으로 합니다. 각 반복에는 선조건 적용 켤레 기울기(PCG) 방법을 사용한 대규모 선형 시스템의 근사해 풀이 작업이 포함됩니다. Trust-Region 알고리즘 항목을 참조하십시오.

  • Levenberg-Marquardt 방법은 참고 문헌 [4], [5], [6]에 설명되어 있습니다. Levenberg-Marquardt 방법 항목을 참조하십시오.

대체 기능

최적화 라이브 편집기 작업은 fsolve에 대한 시각적 인터페이스를 제공합니다.

참고 문헌

[1] Coleman, T.F. and Y. Li, “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds,” SIAM Journal on Optimization, Vol. 6, pp. 418-445, 1996.

[2] Coleman, T.F. and Y. Li, “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds,” Mathematical Programming, Vol. 67, Number 2, pp. 189-224, 1994.

[3] Dennis, J. E. Jr., “Nonlinear Least-Squares,” State of the Art in Numerical Analysis, ed. D. Jacobs, Academic Press, pp. 269-312.

[4] Levenberg, K., “A Method for the Solution of Certain Problems in Least-Squares,” Quarterly Applied Mathematics 2, pp. 164-168, 1944.

[5] Marquardt, D., “An Algorithm for Least-squares Estimation of Nonlinear Parameters,” SIAM Journal Applied Mathematics, Vol. 11, pp. 431-441, 1963.

[6] Moré, J. J., “The Levenberg-Marquardt Algorithm: Implementation and Theory,” Numerical Analysis, ed. G. A. Watson, Lecture Notes in Mathematics 630, Springer Verlag, pp. 105-116, 1977.

[7] Moré, J. J., B. S. Garbow, and K. E. Hillstrom, User Guide for MINPACK 1, Argonne National Laboratory, Rept. ANL-80-74, 1980.

[8] Powell, M. J. D., “A Fortran Subroutine for Solving Systems of Nonlinear Algebraic Equations,” Numerical Methods for Nonlinear Algebraic Equations, P. Rabinowitz, ed., Ch.7, 1970.

확장 기능

버전 내역

R2006a 이전에 개발됨

모두 확장