영상처리에서 $2\times2$ 행렬의 고유값과 고유벡터를 수치적으로 구해야 하는 상황이 많이 생긴다. 이 경우 2차인 특성방정식을 풀어서 고유값을 구하게 되는데, 두 고유값의 차이가 매우 큰 경우 단순한 근의 공식을 적용한 결과는 수치적으로 부정확한 값을 줄 수 있다. 이를 피하는 방법을 간단히 살펴보자.

 

이차방정식 

$$x^2 - b x +c =0$$

의 두 해는 

\begin{align}x_1 = \frac{b + d}{2},\quad x_2 = \frac{b - d}{2},\qquad d= \sqrt{b^2 - 4c}\end{align}

로 표현된다.  고유값의 특성방정식으로 보면 계수 $b$는 두 고유값의 합, 판별식 $d$는 두 고유값의 차이다. 그런데 $b ^2 \gg c $ 판별식 $d$는 $b$와 매우 근접한 수치이므로 거의 비슷한 두 수의 뺄셈으로 표현된 $x_2$의 수치계산 결과는 매우 부정확해질 수 있다. 예로 

$$ x^2 - 10^8 x +1=0$$

의 해를 프로그램으로 구하면 

	double b = 1.0e8, c = 1.;
	double d = sqrt(b * b - 4. * c);
	double x1 = (b + d)/2., x2 = (b - d)/2.;
	TRACE("x1=%e, x2=%e", x1, x2);

프로그램을 돌리면 얻게 되는 결과는

$$ \tt  x1=1.000000e+008, \qquad x2=7.450581e-009$$

그런데 테일러 전개를 사용하면 $x_2$는 

$$x_2 = \frac{b}{2}\left( 1 - \sqrt{1-\frac{4c}{b^2}} \right)  \approx \frac{b}{2}\times \frac{2c}{b^2} = \frac{c}{b}=10^{-8}$$ 

이어야 한다. 따라서 $x_2$를 바로 근의 공식으로 구할 경우 25%정도의 오차가 생긴다. 이런 경우에는 근의 공식에 의한 직접적인 계산보다는 이차방정식의 특성을 이용하는 것이 수치적으로 더 정교한 답을 얻을 수 있다. 두 근의 곱이 $x_1 x_2 =c$이므로 $x_2$는 

$$x_2 = c / x_1\approx 10^{-8}$$

을 통해서 구하는 것이 더 수치적으로 정교하다.  일반적으로 두 근의 합  $b$가 양수인 경우는  $x_2$를, 음수인 경우는 $x_1$을 두 근의 곱을 이용해서 계산하는 것이 더 정교한 수치값을 얻을 수 있다.

// Find two roots of a quadratic eq: x * x - b * x + c = 0;
void Quadratic2(double b, double c, double& x1, double& x2) {
    double d = sqrt(b * b - 4. * c);
    x1 = (b + d)/ 2., x2 = (b - d)/ 2.;
    TRACE("x1=%e, x2=%e\r\n", x1, x2);
    if (b > 0) {
        if (x1 != 0) x2 = c / x1;
        TRACE("Improved: x1=%e, x2=%e\r\n", x1, x2);
    } else {
        if (x2 != 0) x1 = c / x2;
        TRACE("Improved: x1=%e, x2=%e\r\n", x1, x2);
    }
}

이 경우 결과는 훨씬 더 정교한 값을 보여준다.

$$\tt Improved: x1=1.000000e+008, \quad x2=1.000000e-008$$

728x90

'Mathematics' 카테고리의 다른 글

Fourier Interpolation  (0) 2024.03.20
Generalized eigenvalues problem  (0) 2024.03.02
열방정식의 Green function  (0) 2024.02.12
지구의 나이는?  (0) 2024.02.11
n 차원 공의 부피  (2) 2024.02.07
Posted by helloktk
,