이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

스칼라 함수의 근

하나의 변수에서 비선형 방정식의 해 구하기

fzero 함수는 하나의 변수를 포함하는 하나의 방정식의 근을 구하려고 합니다. 요소를 1개 가진 시작점이나, 시작 구간을 지정하는 요소를 2개 가진 벡터를 사용하여 이 함수를 호출할 수 있습니다. fzero에 시작점 x0을 제공하면 fzero는 함수의 부호가 바뀌는 구간을 먼저 이 시작점 주변에서 탐색합니다. 구간이 검색될 경우 fzero는 함수의 부호가 바뀌는 위치 가까이에 있는 값을 반환합니다. 이러한 구간이 검색되지 않을 경우 fzeroNaN을 반환합니다. 또는, 함수 값의 부호가 달라지는 두 지점을 알고 있는 경우라면 요소를 2개 가진 벡터를 사용하여 시작 구간을 지정할 수 있습니다. 그러면 fzero가 구간을 좁혀 나가며 부호가 바뀌는 위치 가까이에 있는 값을 반환합니다.

다음 섹션에는 시작 구간과 시작점을 사용하여 함수의 영점(Zero)을 구하는 방법을 보여주는 두 가지 예제가 나와 있습니다. 아래 예제에서는 MATLAB®이 제공하는 함수 humps.m을 사용합니다. 다음 그림은 humps의 그래프를 보여줍니다.

x = -1:.01:2;
y = humps(x);
plot(x,y)
xlabel('x');
ylabel('humps(x)')
grid on

fzero의 옵션 설정하기

옵션을 설정하여 fzero 함수의 여러 측면을 제어할 수 있습니다. 옵션은 optimset을 사용하여 설정합니다. 옵션에는 다음이 포함됩니다.

  • fzero가 생성하여 표시하는 양(개수) 선택 — 옵션 설정하기, 시작 구간 사용하기시작점 사용하기 항목을 참조하십시오.

  • fzero가 근을 판별하는 방법을 제어하는 여러 허용오차 선택 — 옵션 설정하기 항목을 참조하십시오.

  • fzero의 진행 방향이 근을 향하는지 확인하기 위한 플롯 함수 선택 — 플롯 함수 항목을 참조하십시오.

  • fzero의 진행 방향이 근을 향하는지 확인하기 위한 사용자 지정 프로그래밍된 출력 함수 사용 — 출력 함수 항목을 참조하십시오.

시작 구간 사용하기

humps의 그래프는 함수가 x = -1에서 음수이고 x = 1에서 양수임을 나타냅니다. 이 두 지점에서 humps를 계산하여 이를 확인할 수 있습니다.

humps(1)
ans = 16
humps(-1)
ans = -5.1378

따라서 [-1 1]fzero에 대한 시작 구간으로 사용할 수 있습니다.

fzero의 반복 알고리즘은 [-1 1]의 더 작은 하위 구간을 구합니다. 하위 구간마다 두 끝점에서 humps의 부호가 서로 다릅니다. 하위 구간의 끝점이 가까워지면서 구간은 humps에 대해 0으로 수렴하게 됩니다.

각 반복에서 fzero의 진행 상황을 보려면 optimset 함수를 사용하여 Display 옵션을 iter로 설정하십시오.

options = optimset('Display','iter');

그런 후, 다음과 같이 fzero를 호출합니다.

a = fzero(@humps,[-1 1],options)
 
 Func-count    x          f(x)             Procedure
    2              -1      -5.13779        initial
    3       -0.513876      -4.02235        interpolation
    4       -0.513876      -4.02235        bisection
    5       -0.473635      -3.83767        interpolation
    6       -0.115287      0.414441        bisection
    7       -0.115287      0.414441        interpolation
    8       -0.132562    -0.0226907        interpolation
    9       -0.131666    -0.0011492        interpolation
   10       -0.131618   1.88371e-07        interpolation
   11       -0.131618   -2.7935e-11        interpolation
   12       -0.131618   8.88178e-16        interpolation
   13       -0.131618   8.88178e-16        interpolation
 
Zero found in the interval [-1, 1]
a = -0.1316

각각의 값 x는 그때까지 찾은 최적의 끝점을 나타냅니다. Procedure 열에는 알고리즘의 각 단계가 이분법(bisection)을 사용하는지 아니면 보간(interpolation)을 사용하는지가 표시됩니다.

다음을 입력하여 a에서의 함수 값이 0에 가까운지 확인할 수 있습니다.

humps(a)
ans = 8.8818e-16

시작점 사용하기

humps 함수 값의 부호가 서로 다른 두 지점을 알지 못한다고 가정해 보겠습니다. 이 경우, fzero에 대한 시작점으로 스칼라 x0을 선택할 수 있습니다. 그러면 fzero는 함수의 부호가 바뀌는 구간을 먼저 이 시작점 주변에서 탐색합니다. 이러한 구간을 찾으면 fzero는 위 섹션에 설명되어 있는 알고리즘을 사용하여 작업을 진행합니다. 이러한 구간이 검색되지 않을 경우 fzeroNaN을 반환합니다.

예를 들어, 시작점을 -0.2로, Display 옵션을 Iter로 설정하고 fzero를 호출합니다.

options = optimset('Display','iter');
a = fzero(@humps,-0.2,options)
 
Search for an interval around -0.2 containing a sign change:
 Func-count    a          f(a)             b          f(b)        Procedure
    1            -0.2      -1.35385          -0.2      -1.35385   initial interval
    3       -0.194343      -1.26077     -0.205657      -1.44411   search
    5          -0.192      -1.22137        -0.208       -1.4807   search
    7       -0.188686      -1.16477     -0.211314      -1.53167   search
    9          -0.184      -1.08293        -0.216      -1.60224   search
   11       -0.177373     -0.963455     -0.222627      -1.69911   search
   13          -0.168     -0.786636        -0.232      -1.83055   search
   15       -0.154745      -0.51962     -0.245255      -2.00602   search
   17          -0.136     -0.104165        -0.264      -2.23521   search
   18        -0.10949      0.572246        -0.264      -2.23521   search
 
Search for a zero in the interval [-0.10949, -0.264]:
 Func-count    x          f(x)             Procedure
   18        -0.10949      0.572246        initial
   19       -0.140984     -0.219277        interpolation
   20       -0.132259    -0.0154224        interpolation
   21       -0.131617   3.40729e-05        interpolation
   22       -0.131618  -6.79505e-08        interpolation
   23       -0.131618  -2.98428e-13        interpolation
   24       -0.131618   8.88178e-16        interpolation
   25       -0.131618   8.88178e-16        interpolation
 
Zero found in the interval [-0.10949, -0.264]
a = -0.1316

각 반복에서 현재 하위 구간의 끝점은 열 제목 ab 아래에 나열되는 반면, 끝점에서의 humps의 대응값은 각각 f(a)f(b) 아래에 나열됩니다.

참고

끝점 ab는 특정한 순서로 나열되지 않습니다. 즉, ab보다 클 수도 있고 b보다 작을 수도 있습니다.

처음 9개 단계에서는 출력값에 표시되어 있는 현재 하위 구간의 두 끝점 모두에서 humps의 부호가 음입니다. 10번째 단계에서는 humps의 부호가 끝점 -0.10949에서는 양이지만, 끝점 -0.264에서는 음입니다. 이 지점부터 알고리즘은 위 섹션에 설명된 것처럼 x값 -0.1316에 도달할 때까지 구간 [-0.10949 -0.264]를 계속해서 좁힙니다.

관련 항목