개요
이 튜토리얼에서는 할선법(Secant Method)을 이용해 방정식의 근을 구하는 C++ 프로그램을 살펴보겠습니다. 주어진 방정식에 대해 반복적인 할선법을 적용하여 그 근을 찾는 것이 목표입니다.
할선법(Secant Method)이란?
할선법은 방정식 f(x) = 0의 근을 수치적으로 계산하는 대표적인 반복(iterative) 알고리즘입니다. 두 개의 초기 근사값 x₁과 x₂를 지나는 직선(할선)을 그리고, 이 직선이 x축과 만나는 교점을 다음 근사값으로 사용하는 방식입니다.
뉴턴-랩슨법(Newton-Raphson Method)과 달리 도함수가 필요 없다는 장점이 있어, 미분이 어렵거나 복잡한 함수에도 손쉽게 적용할 수 있습니다.
동작 원리
먼저 두 초기값 x₁, x₂에 대해 f(x₁) × f(x₂) < 0 조건을 만족해야 합니다. 이는 해당 구간 안에 근이 존재한다는 것을 의미합니다(중간값 정리). 이후 아래 공식으로 새로운 근사값 x₀을 계산합니다.
x₀ = (x₁·f(x₂) − x₂·f(x₁)) / (f(x₂) − f(x₁))
새로 계산한 값과 이전 값의 차이가 허용 오차 E보다 작아질 때까지 이 과정을 반복하며, 반복이 끝나면 최종 근사값을 출력합니다.
C++ 구현 예제
#include <bits/stdc++.h>
using namespace std;
float f(float x) {
float f = pow(x, 3) + x - 1;
return f;
}
void secant(float x1, float x2, float E) {
float n = 0, xm, x0, c;
if (f(x1) * f(x2) < 0) {
do {
//중간값 계산
x0 = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));
c = f(x1) * f(x0);
x1 = x2;
x2 = x0;
n++;
if (c == 0)
break;
xm = (x1 * f(x2) - x2 * f(x1)) / (f(x2) - f(x1));
} while (fabs(xm - x0) >= E);
cout << "Root of the given equation=" << x0 << endl;
cout << "No. of iterations = " << n << endl;
} else
cout << "Can not find a root in the given inteval";
}
int main() {
//초깃값 설정
float x1 = 0, x2 = 1, E = 0.0001;
secant(x1, x2, E);
return 0;
}실행 결과
Root of the given equation=0.682326 No. of iterations = 5
코드 및 결과 해석
위 예제는 f(x) = x³ + x − 1 방정식의 근을 구하는 프로그램입니다. main 함수에서 초기 구간을 [0, 1]로, 허용 오차 E를 0.0001로 설정한 후 secant 함수를 호출합니다.
secant 함수 내부에서는 먼저 f(x₁) × f(x₂) < 0 조건을 검사하여 구간 내에 근이 존재하는지 확인합니다. 조건을 만족하면 위에서 소개한 공식을 이용해 새로운 근사값을 반복적으로 계산하고, 인접한 두 근사값의 차이가 오차 범위 이내가 되면 반복을 종료합니다.
실행 결과, 프로그램은 단 5번의 반복만에 약 0.682326이라는 근을 찾아냈습니다. 실제로 x ≈ 0.6823을 f(x)에 대입하면 거의 0에 수렴하므로 정확한 결과임을 알 수 있습니다.
반면, 만약 주어진 구간에서 f(x₁) × f(x₂) ≥ 0이라면 해당 구간에 근이 없거나 짝수 개의 근이 존재할 가능성이 있으므로, 프로그램은 "Can not find a root in the given interval" 메시지를 출력하고 종료됩니다. 이 경우 다른 초기 구간을 선택해 다시 시도해야 합니다.