스칼라 함수의 근
하나의 변수에서 비선형 방정식의 해 구하기
fzero
함수는 하나의 변수를 포함하는 하나의 방정식의 근을 구하려고 합니다. 요소를 1개 가진 시작점이나, 시작 구간을 지정하는 요소를 2개 가진 벡터를 사용하여 이 함수를 호출할 수 있습니다. fzero
에 시작점 x0
을 제공하면 fzero
는 함수의 부호가 바뀌는 구간을 먼저 이 시작점 주변에서 탐색합니다. 구간이 검색될 경우 fzero
는 함수의 부호가 바뀌는 위치 가까이에 있는 값을 반환합니다. 이러한 구간이 검색되지 않을 경우 fzero
는 NaN
을 반환합니다. 또는, 함수 값의 부호가 달라지는 두 지점을 알고 있는 경우라면 요소를 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
는 위 섹션에 설명되어 있는 알고리즘을 사용하여 작업을 진행합니다. 이러한 구간이 검색되지 않을 경우 fzero
는 NaN
을 반환합니다.
예를 들어, 시작점을 -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
각 반복에서 현재 하위 구간의 끝점은 열 제목 a
와 b
아래에 나열되는 반면, 끝점에서의 humps
의 대응값은 각각 f(a)
와 f(b)
아래에 나열됩니다.
참고: 끝점 a
와 b
는 특정한 순서로 나열되지 않습니다. 즉, a
가 b
보다 클 수도 있고 b
보다 작을 수도 있습니다.
처음 9개 단계에서는 출력값에 표시되어 있는 현재 하위 구간의 두 끝점 모두에서 humps
의 부호가 음입니다. 10번째 단계에서는 humps
의 부호가 a
, -0.10949
에서는 양이지만, b
, -0.264
에서는 음입니다. 이 지점부터 알고리즘은 위 섹션에 설명된 것처럼 x값 -0.1316
에 도달할 때까지 구간 [-0.10949 -0.264]
를 계속해서 좁힙니다.
관련 항목
- 다항식의 근
- 비선형 함수 최적화하기
- 비선형 연립방정식 (Optimization Toolbox)