allscience
과학, 공학, 수학 등 대학에서 고등교육으로 배우는 것을 알려드립니다. 블로그 홈으로 가서 더 많은 정보를 얻어보세요!!!

고차 다항식 근 찾기 - 뉴턴 랩슨법 C++ 코드 예제로 쉽게 이해하기

수학적으로 해를 구하기 어려운 고차 다항식도 뉴턴 랩슨법을 이용하면 컴퓨터의 힘으로 손쉽게 해결할 수 있어요! 그리고 C++로 직접 구현해 보면 수학적 개념이 훨씬 잘 이해되죠. 실제 공학, 머신러닝, 금융 분야에서도 이런 수치해석 기법은 널리 사용된답니다.

 

고차 다항식 근 찾기 - 뉴턴 랩슨법 C++ 코드 예제로 쉽게 이해하기 썸네일

안녕하세요 지식노동자s입니다.

오늘은 수치해석에서 정말 자주 등장하는 알고리즘인 뉴턴 랩슨법(Newton-Raphson Method)을 소개할게요!
특히 고차 다항식의 근 찾기 문제에 어떻게 적용되는지,
그리고 C++로 구현하는 예제 코드까지 정리해서, 한 번에 이해할 수 있게 도와드릴게요.


뉴턴 랩슨법이란?

뉴턴 랩슨법은 비선형 방정식의 근을 반복적으로 근사해가는 알고리즘이에요.

기본 아이디어는 간단합니다:

어떤 함수 f(x)f(x)의 근을 알고 싶다면, 현재 추정값 xnx_n에서의 접선을 따라 이동해서 더 나은 추정값 xn+1x_{n+1}를 찾자!

수식

xn+1=xnf(xn)f(xn)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

즉, 함수와 그 도함수를 알고 있다면 간단한 계산으로 근에 가까운 값을 구할 수 있어요.


고차 다항식 예제

예를 들어 다음과 같은 4차 함수의 근을 구하고 싶다고 해볼게요.

f(x)=x43x3+2f(x) = x^4 - 3x^3 + 2

그럼 미분은?

f(x)=4x39x2f'(x) = 4x^3 - 9x^2

C++ 코드 예제

이제 이걸 바탕으로 C++로 구현해볼게요.

cpp
#include <iostream> #include <cmath> #include <iomanip> using namespace std; // 고차 다항식 함수 double f(double x) { return pow(x, 4) - 3 * pow(x, 3) + 2; } // 도함수 double df(double x) { return 4 * pow(x, 3) - 9 * pow(x, 2); } // 뉴턴 랩슨 메서드 void newtonRaphson(double x0, int max_iter = 100, double tol = 1e-6) { double x = x0; for (int i = 0; i < max_iter; ++i) { double fx = f(x); double dfx = df(x); if (fabs(dfx) < 1e-12) { cout << "도함수가 0에 가까워요! 수렴하지 않을 수 있어요." << endl; return; } double x_new = x - fx / dfx; cout << "Iteration " << i + 1 << ": x = " << setprecision(10) << x_new << endl; if (fabs(x_new - x) < tol) { cout << "\n✔ 수렴했습니다! 근은 약 " << setprecision(10) << x_new << " 입니다." << endl; return; } x = x_new; } cout << "\n❗ 최대 반복 횟수에 도달했지만 수렴하지 않았어요." << endl; } int main() { double initial_guess; cout << "초기 추정값을 입력하세요: "; cin >> initial_guess; newtonRaphson(initial_guess); return 0; }

코드 설명 포인트

  • f(x)f'(x)를 별도 함수로 분리해서 가독성 높임

  • 수렴 조건: |x_new - x| < tolerance

  • 도함수가 0에 가까울 경우 오류 경고 출력

  • 반복 횟수 제한: 무한 루프 방지!


실전에서 주의할 점

  • 초기 추정값 x₀에 따라 결과가 크게 달라질 수 있어요!

  • 도함수가 0이 되면 분모가 0이 되므로 반드시 체크 필요!

  • 복근(복소수 해)을 다루려면 C++ 복소수 라이브러리 활용이 필요합니다.