Main Content

스칼라 함수의 근

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

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

Figure contains an axes object. The axes object with xlabel x, ylabel humps(x) contains an object of type line.

fzero의 옵션 설정하기

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

시작 구간 사용하기

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의 부호가 a, -0.10949에서는 양이지만, b, -0.264에서는 음입니다. 이 지점부터 알고리즘은 위 섹션에 설명된 것처럼 x값 -0.1316에 도달할 때까지 구간 [-0.10949 -0.264]를 계속해서 좁힙니다.

관련 항목