39
[102] 002 cemm#활용한 수치해석, 2 비선형방정식의 www.msharpmath.com 1 "cemmsharp", "msharpmath" revised on 2013.01.04 [102] 002 2 비선형방정식의 www.msharpmath.com * invite authors for improvement ** * Msharpmath Inc. ** author's address 수치해석 강좌 담당교수께서는 원본파일을 강의의 목적에 맞게 설명방법, 예제, 그림, 연습문제 등을 원하는 방향으로 수정하여 www.msharpmath.com 출간하시면 강의의 진행에 도움되실 것입니다. 학생들에게는 항상 무료로 다운로드 받을 있는 인터넷 교재를 제공하고, 담당교수께서는 언제든지 수정출간할 있는 장점을 가진 인터넷 출간에 부디 많은 학과에서 참여하시기를 부탁드립니다. 인터넷 출간은 Chapter 별로 이루어지므로 원하시는 분야만을 골라서 출간할 있습니다. 따로 담당강좌별로 저자 고유번호가 부여되어 쉽게 검색하고 다운받을 있습니다. 2-1 이분법 2-2 뉴턴법 2-3 다중근의 경우 2-4 연속대입법 2-5 오차 수렴특성 2-6 연습문제 ============================== 2-7 가위치법 (선택) 2-8 뮬러 방법 (선택) 2-9 다항식에 대한 베어스토우 방법 (선택) 장에서는 해를 구하는 문제에서 가장 간단한 경우인 근을 찾는 문제를 다룬다. 방정식의 근을 찾는 문제에서 오차를 추정하는 가장 쉬운 방법으로는 방정식 근인가를 판단하는 기준으로

비선형방정식의 - · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 2 의 값이 얼마나 0에 가까운가를 판단하는

Embed Size (px)

Citation preview

Page 1: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

1

"cemmsharp", "msharpmath" revised on 2013.01.04

[102] 002

제 2 장 비선형방정식의 근

www.msharpmath.com *

invite authors for improvement **

* Msharpmath Inc.

** author's address

수치해석 강좌 담당교수께서는 원본파일을 강의의 목적에 맞게 설명방법, 예제, 그림,

연습문제 등을 원하는 방향으로 수정하여 www.msharpmath.com 에 출간하시면 강의의 진행에

도움되실 것입니다. 학생들에게는 항상 무료로 다운로드 받을 수 있는 인터넷 교재를 제공하고,

담당교수께서는 언제든지 수정출간할 수 있는 장점을 가진 인터넷 출간에 부디 많은 학과에서

참여하시기를 부탁드립니다. 인터넷 출간은 Chapter 별로 이루어지므로 원하시는 분야만을

골라서 출간할 수 있습니다. 따로 각 담당강좌별로 저자 고유번호가 부여되어 쉽게 검색하고

다운받을 수 있습니다.

2-1 이분법

2-2 뉴턴법

2-3 다중근의 경우

2-4 연속대입법

2-5 오차 및 수렴특성

2-6 연습문제 ==============================

2-7 가위치법 (선택)

2-8 뮬러 방법 (선택)

2-9 다항식에 대한 베어스토우 방법 (선택)

이 장에서는 해를 구하는 문제에서 가장 간단한 경우인 의

근을 찾는 문제를 다룬다. 방정식의 근을 찾는 문제에서 오차를 추정하는

가장 쉬운 방법으로는 가 방정식 의 근인가를 판단하는 기준으로

Page 2: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

2

의 값이 얼마나 0에 가까운가를 판단하는 것이다.

이 장에서는 잘 알려진 이분법, 뉴턴법 등을 포함하여 비선형방정식의

근을 구하는 몇 가지 방법들을 다룬다. 그리고 오차 또는 수렴특성 등의

이론적인 배경에 대해서 다룬다.

아래와 같이 정의되는 다항식

#> .[ an, …, a2,a1,a0 ].solve ; // cemm# command to solve

의 근을 구하는 베어스토우 (Bairstow) 방법은 마지막 절에서 선택과정으로

다룬다. 그 이유는 베어스토우 방법 보다는 QR 방법이 훨씬 정확하고

효율적이기 때문이다. 하지만 QR 방법을 설명하려면 고유값에 대한 이해가

선행되어야 하므로 이것은 제 4장에서 다루기로 한다.

또한 연립 비선형방정식은 행렬연산이 필요하므로 최소값탐색 방법과

더불어 제 10장에서 다루기로 한다.

//======================================================================

// syntax in cemm#

//----------------------------------------------------------------------

solve .x { a } ( <<opt>>, f(x) = g(x) ) // default method

solve .x ( <<opt>>, f(x) = g(x) ) .bisect( a,b ) // bisection method

solve .x ( <<opt>>, f(x) = g(x) ) .secant( a,b ) // secant method

solve .x ( <<opt>>, f(x) = g(x) ) .muller( a,b,c ) // Muller method

solve .x ( <<opt>>, f(x) = g(x) ) .march ( a,b,dx ) // marching method

solve .x ( <<opt>>, f(x) = g(x) ) .span[n=100,g=1](a,b)

solve .x { a } ( <<opt>>, f(x) = g(x) ) .newton ( f'(x)-g'(x) )

solve .x { a } ( <<opt>>, f(x) = g(x) ) .multiple( f'(x)-g'(x) )

//----------------------------------------------------------------------

// Spokes

.peep // show all the iteration procedures

.peeptail // show the final stage of the iteration

.return( … ) // return manipulated data

.maxiter(1000) // maximum number of iteration

.tol/abstol(1.e-7) // absolute tolerance

.reltol(1.e-7) // relative tolerance

// p.quad(r,s) // bairstow method for a polynomial p(x)

// dot function

.bisect(a,b, f(x)) // when f(x) is considerably long

.secant(a,b, f(x)) // dot function is applied instead of Umbrella

Page 3: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

3

2-1 이분법

이 절에서는 방정식 의 근을 구하는 가장 기초적인 방법인

이분법 (二分法, bisection method)에 대해서 알아본다. 이 방법은 매우

간단하지만 해가 존재한다고 알려진 구간에서 근을 구하는 가장 확실한

방법이며 비해석적인 함수에도 적용되는 방법이다.

■ 근의 존재성. 에 관한 연속함수 의 값이 구간

에서

(1)

인 조건을 만족하면, 구간의 내부에서 을 만족하는 적어도 한 개의

가 반드시 존재한다 (불연속인 경우는 해당되지 않음). 이것은 그림 2-

1 을 보면 명확히 알 수 있으며 이러한 성질을 이용하여 근을 구하는

방법에는 이분법 (二分法, bisection method)과 이분법의 변형인 가위치법

(假位置法, false position method) 및 수정 가위치법이 있다.

Figure 2-1 Existence of roots when

■ 이분법. 식(1)의 조건이 만족되는 경우 구간 을

2등분하는 중간점을 택하고

(2)

Page 4: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

4

함수값 에 따라 근이 존재하는 새로운 구간 을

아래의 경우에 따라 선택한다 ( 은 반복횟수를 의미).

(3)

그러면 근이 존재하는 구간은 처음에 비해서 반으로 줄어들게 된다. 이와

같이 구간을 계속 이등분 하면서 구간의 크기가

(4)

으로 미리 주어진 허용오차 보다 작아지면 구하고자 하는 근은

(5)

와 같이 결정된다. 이분법의 장점은 해가 존재하는 것이 알려진 경우

반복에 필요한 횟수

(6)

을 미리 판단할 수 있다는 점과 반드시 해가 얻어진다는 점이다

(연속함수인 경우). 또한 여기에서는 설명하지 않지만, 이분법은

비해석적인 함수 (예를 들어 목적함수가 미분방정식이거나 보간법으로 값을

추정하면서 이산데이터를 처리하는 경우 등을 포함) 에 대해서도 적용할 수

있다는 장점을 가진다.

(예제 1) 의 근을 구간 에서 이분법으로

구하라.

먼저 구간의 양끝을 으로 두고, 함수값을 구하면

이고 인 조건이 만족되므로 구간 에서 최소한

하나의 근이 반드시 존재한다. 따라서 중간점에 대한 함수값을

Page 5: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

5

으로 구한다. 계속해서 식(3)과 비교하여

(7)

와 같이 오른쪽의 반구간(半區間) 을 새로운 구간 ,

즉 에 대해서 다시 이분법을 적용한다 (☑ 참조). 두 번째의

반복에서는

인 경계값을 이용하여 중간점에 대해서

(8)

을 얻는다. 계속해서 반복되는 결과는 cemm#을 다음과 같이 이용한다.

#> solve .x ( exp(x) = 5 ) .bisect(0,3).peep ; // .peep for procedure filing

--------- bisection method --------

iter x f(x)

0 0 -4

0 3 15.09

1 1.5 -0.5183

2 2.25 4.488

3 1.875 1.521

4 1.6875 0.4059

...

22 1.6094377 -1.042e-006

23 1.6094381 7.464e-007

24 1.6094379 -1.477e-007

ans = 1.6094379

결과적으로 인 최종해를 얻는다.

Page 6: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

6

프로그래밍에 익숙한 독자라면 cemm#으로 자신만의 코드를 작성할 수

있을 것이다. 아래에는 이분법을 코딩한 예를 들며, 실행예를 바로

제시한다.

//----------------------------------------------------------------------------

// function definitions

//----------------------------------------------------------------------------

double reldiff(a,b) = |a-b|/(1+|a|+|b|); // relative difference, a.-.b

double bisect(a,b, ftn(x)) {

eps = 1.e-6;

ya = ftn(a); if( |ya| < eps ) return a;

yb = ftn(b); if( |yb| < eps ) return b;

if( ya*yb > 0 ) { "y(a)y(b) > 0"; return NaN; }

iter = 0;

while(1) {

if( ++iter > 200 ) { "bisection failed"; return NaN; }

x = 0.5*(a+b);

y = ftn(x);

[ iter,a,b,x,y ];; // display with double semicolons ;;

if( |y| > inf ) { "bisection diverged"; return NaN; }

if( reldiff(a,b) < eps || |y| < eps ) break;

if( ya*y > 0 ) a = x;

else b = x;

}

return x;

}

#> double fn(x) = exp(x)-5;

%> user-function call

#> bisect(0,3, fn);

[ 1 0 3 1.5 -0.5183109 ]

[ 2 1.5 3 2.25 4.487736 ]

[ 3 1.5 2.25 1.875 1.520819 ]

[ 4 1.5 1.875 1.6875 0.4059489 ]

...

Page 7: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

7

[ 18 1.60943 1.60945 1.60944 9.68711e-006 ]

[ 19 1.60943 1.60944 1.60943 -1.89231e-005 ]

[ 20 1.60943 1.60944 1.60944 -4.61802e-006 ]

[ 21 1.60944 1.60944 1.60944 2.53454e-006 ]

ans = 1.6094379

☑ 경우에 따라서는 이더라도 짝수개의 근이 존재할 수 있다.

그러나 이분법에서는 나머지 반구간(半區間)에서 다른 근이 존재하는 것을

알기 때문에 이 구간을 버려도 된다. 따라서 다중근이 있을 경우 어떤 근이

구해질지는 미리 알 수 없다.

★ 도트 함수 .bisect(a,b,f(x)). 주어진 함수가 단순하지 않을 때는

함수 f(x)를 별도로 정의하고 위에 작성한 사용자함수 bisect(a,b,f(x))와

결합하여 해를 구하는 것이 바람직하다. 이러한 목적으로 cemm#에는 도트

함수 (dot function)가 내장되어 있다. 위의 문제의 경우

#> double fn(x) = exp(x)-5;

#> .bisect(0,3, fn); // dot function in cemm#

ans = 1.6094379

으로 근을 구하고자 하는 함수만을 정의하면 된다. 한편

인 식에서 에 존재하는 근 를 구하는 경우

#> double fn(s) = int.x(0,s) ( x*sin(x) );

#> .bisect(pi,2*pi, fn);

ans = 4.4934094

으로 쉽게 해를 구할 수 있다. 비슷한 경우로 상미분방정식을 사격법으로

구하는 문제에서

초기점 에서의 기울기를 가정하고 엄밀해

Page 8: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

8

를 근으로 풀 수 있다. 이 때의 목적함수는 으로 되며, 아래에

사용예를 보인다.

double fn(s) {

y1 = ode.x(0,1) ( y'' = -2*x*y', y = 2, y' = s ).return(y).end;

return y1-3;

}

#> .bisect(1,3, fn);

ans = 1.3390033

2-2 뉴턴법

이분법은 방정식의 근을 구하는 가장 확실한 방법이기는 하지만 해가

존재하는 구간을 미리 알아야 한다는 단점이 있다. 이 절에서는 초기에

주어진 한 점에서 시작하여 근을 찾아가는 개방법 중의 하나인 뉴턴법

(Newton method)을 알아본다.

■ 뉴턴법. 에 관한 해석함수 에 대한 방정식의 정확한 근을

라고 할 때 근으로 추정한 점 에서 테일러전개를 하면

(9)

으로 된다. 윗식에서 2계도함수 이상을 모두 절단하고 에 대해서 풀면

(10)

와 같이 쓸 수 있다 ( 은 반복단계에서의 값). 그러나 절단오차의

영향으로 위에서 구한 는 실제의 참값이 아니므로 이 값을 다시

추정값으로 하여 식(10)을 반복하여 해를 구하는 방법을 뉴턴법 (Newton's

method)이라고 한다.

Page 9: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

9

뉴턴법은 초기에 근의 추정위치 하나만 주면 해를 찾아가는 개방법에

속하며, 그림 2-2에 보인 것처럼 매우 빠르게 정확한 해로 수렴한다.

Figure 2-2 Graphical representation of Newton method

한편 연속된 점들 , 에서의 급격한 변화는 분모에 있는 에

기인한다. 이 값이 0 에 가까울때 분자의 값이 같은 정도로 0 에 가까워지지

않는다면 문제가 발생한다. 또한 의 부호가 계속 바뀌는

경우에도 진동이 발생하여 해를 구하기 어려워진다. 이와 같이 뉴턴법은

초기값의 설정에 따라 해를 구할 수 없는 경우가 있으므로 뉴턴법의 사용은

다소 제한적이다.

(예제 2) 의 근을 에서 시작하여 뉴턴법으로 근을

구하라.

초기점 에서

이므로 새로운 추정근은

(11)

을 얻는다. 계속해서 두 번째의 추정근으로

(12)

Page 10: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

10

이 과정을 계속하는 것은 내장함수를 이용하거나 아래에 작성된 코드를

이용한다.

#> solve .x {3} ( exp(x) = 5 ) .newton( exp(x) ) .peep; // built-in function

--------- Newton method -----------

iter x f(x)

0 3 15.09

1 2.2489353 4.478

2 1.7764928 0.9091

3 1.622646 0.06648

4 1.6095248 0.0004342

5 1.6094379 1.885e-008

ans = 1.6094379

//----------------------------------------------------------------------------

// Newton method

//----------------------------------------------------------------------------

double dnewton(x, ftn(x)) {

eps = 1.e-6;

y = ftn(x); if( |y| < eps ) return x;

iter = 0;

while(1) {

if( ++iter > 200 ) { "newton solver failed"; return NaN; }

deno = ftn'(x); // derivative

if( |deno| < eps ) { "dfdx ~= 0"; return NaN; }

dx = -y / deno;

x += dx;

y = ftn(x);

[ iter,x,y ];; // display

if( x.-.(x-dx) < eps || |y| < eps ) break; // relative difference a.-.b

}

return x;

}

%> Newton method

#> double fn(x) = exp(x)-5;

#> dnewton(3, fn); // user-program in the above

[ 1 2.24894 4.47764 ]

Page 11: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

11

[ 2 1.77649 0.909096 ]

[ 3 1.62265 0.0664784 ]

[ 4 1.60952 0.000434237 ]

[ 5 1.60944 1.8854e-008 ]

ans = 1.6094379

//----------------------------------------------------------------------------

// Complex Newton method, cftn = complex function

//----------------------------------------------------------------------------

complex cnewton(z, cftn(z),cftn2(z)) {

eps = 1.e-6;

w = cftn(z); if( |w| < eps ) return z;

iter = 0;

while(1) {

if( ++iter > 200 ) { "newton-complex solver failed"; return NaN ! ; }

deno = cftn2(z); // derivative must be given by argument

if( |deno| < eps ) { "dfdx ~= 0"; return NaN !; }

dz = -w / deno;

z += dz;

w = cftn(z);

[ iter, z, |w| ];; // display

if( |dz| < eps || |w| < eps ) break;

}

return z;

}

(예제 3) 복소함수 의 근을 로부터 시작하여

구하라.

일반적인 복소함수의 복소근을 찾는 데에는 뉴턴법이 특히 유용하다.

cemm#을 이용하여 해를 구하면

#> solve .z { 1+1i } ( exp(z)+1 = 0 );

ans = -5.46391e-008 + 3.14159!

을 얻는다 (근은 ). 그런데 복소함수 은 다가함수 (多價函數,

multiple-valued function)이므로 에서 출발하면 가

얻어지는 것을 확인해보라.

Page 12: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

12

#> complex w1(z) = exp(z)+1; // case of applying user-function

#> complex w2(z) = exp(z);

#> cnewton(1+1i, w1,w2);

[ 1 -0.198766 + i 1.30956 1.44755 ]

[ 2 -1.51384 + i 2.48807 0.836056 ]

[ 3 1.09395 + i 5.25085 3.60265 ]

...

[ 14 0.0179863 + i 3.10836 0.0381315 ]

[ 15 -0.000381658 + i 3.14099 0.000709675 ]

[ 16 -1.06312e-007 + i 3.14159 2.51948e-007 ]

ans = -1.06312e-007 + 3.14159!

■ 할선법. 뉴턴의 방법에서 함수 의 도함수 를 구하기

어렵거나 함수값이 데이터로 주어지는 경우 도함수 를 다음과 같이

(13)

으로 근사시킨 후 식(10)에 대입하면

(14)

인 공식을 얻는다. 위에서 과 대응하는 함수값 은 초기값으로

주어져야 한다. 식(14)를 이용하여 방정식의 근을 찾는 방법을 할선법

(secant method)이라고 하며 선형보간을 이용한다는 점에서 가위치법과

유사하다 [할선법은 보외법 (補外法, extrapolation)에 속하고, 가위치법은

보간법 (補間法, interpolation)에 속한다].

☑ 식(14)를 적용할 때 주의해야 할 점은 함수값이 줄어드는 방향으로

처음의 두 점을 선택해야 한다는 것이다. 따라서 인 경우에는 두

점의 역할을 바꾸어야 한다.

(예제 4) 의 근을 두 점 을 이용하는

할선법으로 근을 구하라.

앞에서 풀어본 문제를 다른 방법으로 다시 풀어서 수치방법의 차이점을

살펴보기 위한 것이다. 먼저 두 점에서의 함수값을 구하면

Page 13: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

13

으로 인 순서이므로 두 점의 역할을 바꾼다. 따라서

으로 두고, , 을 이용하여

식(20)으로부터

(15)

을 얻는다. 할선법의 다음 단계는 의 두 점을 이용하여

(16)

으로 새로운 점 를 구한다. 이것을 반복하면 아래의 결과를 얻는다.

#> solve .x ( exp(x)-5 = 0 ) .secant(2,3) .peep; // Umbrella 'solve'

--------- secant method -----------

iter x f(x)

0 2 2.389

0 3 15.09

1 1.8118332 1.122

2 1.6453036 0.1826

3 1.6129255 0.01747

4 1.6095 0.0003107

5 1.609438 5.414e-007

6 1.6094379 1.682e-011

ans = 1.6094379

이 문제를 내장된 도트함수 .secant(a,b, f(x))를 이용하여 다음과 같이 풀

수도 있다.

Page 14: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

14

#> double fn(x) = exp(x)-5; .secant(2,3, fn); // dot function .secant

ans = 1.6094379

2-3 다중근의 경우

■ 다중근의 경우. 에 관한 다항식이

(17)

와 같이 다중근을 가지는 경우(단 ), 윗식을 미분하면

(18)

이므로

(19)

으로 다중근의 영향이 소거되고 윗식은 에서 단일근을 가진다.

따라서 다중근을 가질 것으로 예상되는 경우 이 방법을 이용하여 해를

구한다.

☑ 실용적인 측면에서 보면 나중에 공부하게 될 QR 반복법으로 해를 구한

다음에 다중근의 존재여부를 판단하는 것이 편리하다. 아래의 문제를

풀면서 생각해보라.

(예제 5) 을 다중근

해법으로 근을 구하라.

cemm#을 작성하고 실행하면

#> solve .x { 2 } ( .[ 1, -15, 90, -270, 405, -243 ](x) = 0 )

.multiple( .[ 5,-60,270,-540,405](x) ).peep;

--------- Multiple method -----------

iter x f(x)

0 2 -0.2

1 3 -5.684e-014

ans = 3

Page 15: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

15

으로 다중근

(20)

인 해를 구한다. 이때 내부적으로는 할선법을 이용한 것이다. 뉴턴법은

복잡한 미분함수가 필요하므로 사용하기 어렵다. 위의 근이 몇 중근인가는

주어진 다항식을 에 관한 조립제법을 수행하면 알 수 있다.

#> .[ 1, -15, 90, -270, 405, -243 ].solve;

ans =

[ 3.0028 - i 0.0020331 ]

[ 3.0028 + i 0.0020331 ]

[ 2.99893 - i 0.00328364 ]

[ 2.99893 + i 0.00328364 ]

[ 2.99655 ]

2-4 연속대입법

■ 연속대입법. 방정식의 형태가

(21)

으로 주어지고 도함수의 절대값이 1 보다 작게 되는 특수한 경우, 방정식의

근을

(22)

와 같이 연속대입법 (succesive substitution method) 또는 고정점 반복법

(fixed point iteration method)으로 구할 수 있다.

연속대입법의 성공여부는 주어진 방정식 을 식(21)의 형태로

변환가능한가에 달려있다. 이것은 그림 2-3 에 나타낸 바와 같이

연속대입법으로 근을 결정할 수 있는 여부는 의 만족여부에

의존하기 때문이다.

Page 16: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

16

Figure 2-3 Graphical representation of substitution method(⊗ initial

guess)

식(21)으로의 변환법은 여러 형태로 가능한데 앞에서 살펴본 뉴턴법과

할선법은 연속대입법에 속한다. 뉴턴법의 경우

(23)

인 변환이 사용되었으며, 할선법의 경우에는

(24)

인 형태의 변환이 사용되었다.

(예제 6) 제곱근 의 값을 구하기 위해서 을 풀려고

한다. 연속대입법의 형태로 변환하여 의 값을 구하라.

가장 간단한 연속대입법은 뉴턴법이므로 식(23)을 이용하여

Page 17: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

17

으로부터

(25)

을 얻는다. 이것은 단지 사칙연산만을 포함하므로 계산비용이 적게 든다.

인 경우에 대해서 로 시작하여 계산하면

으로 불과 세 번의 반복으로 과 비교하여 6 자리까지

일치하는 결과를 얻는다. cemm#으로 다음과 같이 5번을 반복하면

#> double.format("%24.16g");

#> x = 1; for[5] x = 1/2 * ( x + 2/x ); sqrt(2);

x = 1

x = 1.5

x = 1.416666666666667

x = 1.41421568627451

x = 1.41421356237469

x = 1.414213562373095

ans = 1.414213562373095

와 같이 배정도계산의 유효숫자까지 정확하게 값이 구해진다.

2-5 오차 및 수렴특성

방정식 의 근을 구하는 것이 주목적인 경우에는 잔차

(殘差, residue) 가 미리 지정된 오차범위 이내로 들어올 때까지

반복계산하여 근을 구하면 된다. 그러나 오차를 분석하고 수렴특성을

이해하는 것도 수치이론에서 중요하게 다루어지므로 이 절에서는

연속대입법과 뉴턴법의 수렴특성에 대해서 알아보기로 한다.

Page 18: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

18

■ 연속대입법의 경우. 연속대입법에서 반복과정은

(26)

이고, 엄밀해를 라고 하면 가 성립한다. 따라서 평균값

정리로부터

(27)

으로 쓸 수 있다 (위에서 는 와 사이에 위치). 여기서 오차를

와 같이 정의하면 윗식으로부터

(28)

인 관계를 얻는다. 따라서 이면

(29)

이므로 이면 으로 수렴한다. 그러나 이면 수렴이

매우 느리고, 이면 오차는 급격하게 감소하여 수렴이 빠르게 된다.

또한, 식(29)로부터 오차의 비율이 선형적으로 감소하는 것을 알 수 있다.

이러한 이유로 연속대입법은 선형적 수렴 (linear convergence) 정도를

가진다고 말한다.

■ 뉴턴법의 경우. 위의 논의와 유사하게 뉴턴의 반복과정

(30)

에서 를 빼고 오차를 로 정의하면

(31)

을 얻는다 [위에서 이므로 분자는 변함이 없다]. 윗식의 분자는

테일러급수

Page 19: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

19

(32)

으로부터

(33)

와 같이 표현된다. 따라서 윗식을 이용하여 식(31)을 정리하면

(34)

으로 된다. 윗식으로부터 에서의 오차 은 에서의 오차 의

제곱에 비례하여 감소하는 것을 알 수 있다. 따라서 뉴턴법은 2 차적 수렴

(quadratic convergence) 정도를 가진다고 한다. 한편 식(34)를 변형하면

이고, 식(33)에서 을 무시하고 쓰면

(35)

이므로 두 식을 결합하여

(36)

인 수렴조건을 얻는다. 만일 윗식이 만족되지 않으면 수치해는 발산한다.

이때 점 에서의 기울기 가 작으면 이 급격하게

커지므로 수렴조건을 만족하기 어려워진다. 실제로 뉴턴법은 가

비교적 큰 값을 가지거나 구간의 내부에서 변곡점이 없을 때 사용하는 것이

바람직하다. 한편 뉴턴법은 두 개의 함수를 수작업으로 입력해야 하고,

도함수를 구하기 어려울 때는 매우 번거로운 방법이 된다. 이러한 경우에는

할선법 (secant method)을 사용하는 것이 추천된다.

뉴턴법에서의 오차는 식(31)과 식(35), 즉

Page 20: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

20

을 결합하면

(37)

으로 평가할 수 있다.

2-6 연습문제 =============================================

【1】 의 근을 에서 찾아라.

【2】 의 두 근을 에서 찾아라.

【3】

의 근이 존재하는 구간을 인 범위내부에서

에서 시작하여 의 간격으로 증가시키면서 근이 존재하는

구간이 나타나면 이분법으로 근을 구하라.

#> solve.x ( 1 = sqrt(x)*tanh(3*sqrt(x)) ).march(0.1,2, 0.1).peep;

【4】 의 양수근 중에서 원점에 가장 가까운 다섯 개의 근을

구하라.

#> solve.x ( tanh(x)*cos(x) = sin(x) ) .span(0.01, 20);

ans =

[ 3.9266 8.64089e-008 ]

[ 7.06858 -5.60328e-008 ]

[ 10.2102 -2.47634e-007 ]

[ 13.3518 7.48232e-008 ]

[ 16.4934 1.18975e-006 ]

[ 19.635 1.9051e-006 ]

#> ans..(1:5)(1).tr;

ans = [ 3.9266 7.06858 10.2102 13.3518 16.4934 ]

【5】 의 양수근 중에서 원점에 가장 가까운 다섯 개의 근을

구하라.

【6】 의 양수근 중에서 원점에 가장 가까운 다섯 개의 근을

구하라.

Page 21: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

21

【7】베셀함수는

으로 정의된다. 이때

의 처음 다섯 개의 양수근, 의 처음 다섯 개의 양수근을 각각

구하라.

#> solve .x ( .J_0(x) = 0 ).span(0,20);

ans =

[ 2.40483 -2.98326e-008 ]

[ 5.52008 -3.38461e-009 ]

[ 8.65373 2.24905e-008 ]

[ 11.7915 -3.5296e-009 ]

[ 14.9309 -1.04669e-008 ]

[ 18.0711 1.2312e-008 ]

#> ans..(1:5)(1).tr; // submatrix A..(rows)(columns)

ans = [ 2.40483 5.52008 8.65373 11.7915 14.9309 ]

【8】 의 근 중에서 원점에서 가장 가까운 양수근을 다섯

개 구하라.

【9】 의 값을 연속대입법으로 구하기 위한 공식을 유도하고,

구하라.

【10】다음 다항식의 근을 구하라 (.solve for a poly);

(a)

#> .[ 1, -24, 207, -796, 1332, -720 ].solve;

ans =

[ 6 ]

[ 10 ]

[ 4 ]

[ 3 ]

[ 1 ]

(b)

(c)

(d)

(e)

(f)

【11】수치적분을 위한 가우스 구적법 (Gauss Quadrature)에서는 르장드르

(Legendre) 다항식 의 근을 이용한다. 여기서 에 대해서

르장드르 다항식을 쓰고 모든 근을 구하라.

Page 22: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

22

Use 'poly.P(n)' in cemm#.

#> poly.P(6).solve ;

ans =

[ -0.93247 ]

[ 0.93247 ]

[ 0.661209 ]

[ -0.661209 ]

[ 0.238619 ]

[ -0.238619 ]

【12】 2차부터 6차까지의 체비쉐프 다항식 의 근을 모두 구하라.

Use 'poly.T(n)' in cemm#.

【13】아래의 그림과 같이 두 개의 서로 다른 매질을 통과하는 빛이 최소의

시간으로 점 B 에 도달하는 경로를 찾아보자. 여기서 매질 A 쪽에서 빛의

속도는 aV , 매질 B 쪽에서 빛의 속도는 bV , 경계면까지의 수직거리는 각각

,a b이고 두 점의 수평거리는 L이라고 한다.

총 이동시간은

으로 주어지므로 최소시간은 0dt

dx 에서 나타날 것이다. 이것을 계산하면

Page 23: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

23

을 풀면 된다. 이 문제를

인 경우에 대해서 풀어라 (편의상 단위는 생략). 그리고 얻는 결과로부터

아래에서 설명하는 스넬의 법칙을 확인하라.

☑ 스넬의 법칙 (Snell's law). 이 문제를 기하학적으로 해석하면,

그림으로부터

을 얻는다.

【14】 열역학에서 반데어발스 (van der Waals) 상태식은

으로 주어지고, 질소기체에 대해서

, ,

임이 알려져 있다. 이때 , 인 경우에 대해서 의

값을 구하라.

【15】 축소-확대 노즐 내 1 차원 등엔트로유동에서 마하수 은 다음의

관계식으로부터 결정된다. 단면적비가 , 비열비가 일 때,

인 근과 인 근을 각각 구하라.

【16】아래의 식에서 v의 값을 구하라. 단, 9.81g 이다.

Page 24: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

24

#> log(100); log10(100); // In cemm#, log(x) denotes natural log

ans = 4.6051702

ans = 2

【17】프란틀-카아만 (Prandtl-Karman) 식은

으로 주어지고, 에서 성립한다. 에 대한 의 값을

구하라.

【18】

의 근 를 구하라.

【19】(상대성이론-수소원자 모형) 수소원자의 바닥상태에서 전자가 반지름

인 공의 안쪽에서 발견될 확률 이

으로 주어진다. 여기서 이다. 이 되는 을 구하라.

#> double pr(x)=1-exp(-2*x)*(1+2*x+2*x^2) - 0.90;

#>.bisect(0,10,pr); // dot function .bisect(a,b, f(x))

ans = 2.6611602

【20】 축 위를 움직이는 동점 는 원점을 출발한 후 초가 지났을 때의

속도가 라고 한다. 출발한 후 다시 원점으로 돌아오는

시간은 몇 초 후인가.

【21】1852 년 스코틀랜드의 물리학자 맥스웰은 기체 분자들의 속력분포를

찾는 문제를 처음으로 풀었다. 그가 찾은 결과인 "맥스웰의 속력분포

법칙"은 다음과 같다.

여기서 은 기체의 몰질량, 은 일반기체상수, 는 기체의 절대온도,

는 분자의 속도이다. 온도 에서 산소분자가 발견될 확률이

일 때, 우리가 추정할 수 있는 산소분자의 속력으로 가능한

Page 25: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

25

것 두 가지 경우를 구해보라. 단 산소분자가 맥스웰의 속력분포 법칙을

이상적으로 따른다고 가정한다.

cemm#에 내장된 상수 _R와 온도변환 T.c를 활용한다.

#> _R ;

ans = 8.3144725

#> 30.c ; // Celsius to Kelvin

30 [C]

86 F

545.67 R

303.15 K

ans = 303.15

그리고 다음과 같이 함수를 정의한다.

#> double P(v) {

M = 0.032;

T = 30.c;

return 4*pi*( M/(2*pi*_R*T) )^1.5 * v^2 * exp(-M*v^2/(2*_R*T) ) - 0.001;

}

#> .bisect( 0,500, P);

ans = 185.70518

#> .bisect(500,1000,P);

ans = 658.11539

//----------------------------------------------------------------------------

// end of Lectures

//----------------------------------------------------------------------------

2-7 가위치법 (선택)

■ 가위치법. 이분법에서는 와 의 부호만이 고려되고

함수값은 사용되지 않는다. 그러나 함수값의 분포가 직선에 가깝다면 두

점을 잇는 직선을 이용하는 것이 이분법보다 근을 찾는 데에 더욱 효과적일

것이다. 근이 존재하는 구간 에서 점 와 점

을 지나는 직선

Page 26: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

26

(38)

이 과 만나는 점

(39)

을 새로운 경계점으로 선택하는 방법을 가위치법 (假位置法, false

position method)이라고 한다. 그림 2-4 에는 가위치법을 도식적으로

나타내었는데 함수값의 변화가 완만한 경우 한쪽의 경계점이 계속 고정되는

단점이 있다 [이러한 점을 정체점 (停滯點, stagnation point)이라고 한다].

Figure 2-4 Graphical representation of false position method

//----------------------------------------------------------------------------

// false position method

//----------------------------------------------------------------------------

double falsePos(a,b, ftn(x)) {

eps = 1.e-6;

ya = ftn(a); if( |ya| < eps ) return a;

yb = ftn(b); if( |yb| < eps ) return b;

if( ya*yb > 0 ) { "y(a)y(b) > 0"; return NaN; }

iter = 0;

while(1) {

if( ++iter > 200 ) { "false-position failed"; return NaN; }

x = a-ya*(a-b)/(ya-yb);

y = ftn(x);

[ iter,a,b,x,y ];; // display

Page 27: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

27

if( |y| > inf ) { "false-position failed"; return NaN; }

if( a.-.b < eps || |y| < eps ) break; // relative difference a.-.b

if( ya*y > 0 ) { a = x; ya = y; }

else { b = x; yb = y; }

}

return x;

}

(예제 7) 에서 의 근을 가위치법으로 구하라.

앞의 문제에서와 마찬가지로 이라고 할 때

(40)

이므로 구간 에서 반드시 하나의 근이 존재한다. 따라서 그림 2-

4 에 보인 바와 같이 두 점을 연결하는 직선을 이용하여 첫 번째 가위치

점을

(41)

으로 결정한다. 그러면 근이 존재하는 새로운 구간으로

을 선택할 수 있다. 따라서

(42)

으로 두 번째 가위치점을 구한다. 이러한 과정을 반복하면

Page 28: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

28

%> false-position method

#> double fn(x) = exp(x)-5;

#> falsePos(0,3, fn);

[ 1 0 3 0.628748 -3.12474 ]

[ 2 0.628748 3 1.03564 -2.1831 ]

[ 3 1.03564 3 1.28397 -1.38905 ]

[ 4 1.28397 3 1.42866 -0.826907 ]

...

[ 26 1.60944 3 1.60944 -1.17296e-006 ]

[ 27 1.60944 3 1.60944 -6.32354e-007 ]

ans = 1.6094378

인 결과를 얻는다. 최종적으로 얻는 근 은 이분법의 경우와

동일하지만 오른쪽 경계점 은 반복과정동안 정체점으로 남아 있으며

따라서 이분법에 비해 그다지 성능이 향상되지 않는다.

Figure 2-5 Graphical representation of modified false position method

■ 수정 가위치법. (예제 7)의 결과로부터 알 수 있듯이 가위치법의

단점은 정체점의 영향으로 해가 느리게 수렴한다는 것이다. 이것을

개선하기 위해서 그림 2-5 에 보인 바와 같이 가위치점의 반대쪽에 있는 점

을 지나는 직선을 이용하는 방법을 수정 가위치법 (modified

false position method)이라고 한다.

수정 가위치법으로 (예제 7)을 다시 풀면 최초의 가위치 점에서

이므로 식(11)의 을 2로 나누어 두 번째 가위치점

Page 29: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

29

(43)

이것은 가위치법에서 구한 보다 참값 에

가깝다. 이 과정의 방법은 아래에 작성한 cemm#을 이용한다.

//----------------------------------------------------------------------------

// modified false position method

//----------------------------------------------------------------------------

double modfalsePos(a,b, ftn(x)) {

eps = 1.e-6;

ya = ftn(a); if( |ya| < eps ) return a;

yb = ftn(b); if( |yb| < eps ) return b;

yc = ya;

if( ya*yb > 0 ) { "y(a)y(b) > 0"; return NaN; }

iter = 0;

while(1) {

if( ++iter > 200 ) { "modified false position failed"; return NaN; }

x = a-ya*(a-b)/(ya-yb);

y = ftn (x);

[ iter,a,b,x,y];; // display

if( |y| > inf ) { "modified false position failed"; return NaN; }

if( a.-.b < eps || |y| < eps ) break; // relative difference a.-.b

if( ya*y > 0 ) { a = x; ya = y; if( ya*yc > 0 ) yb *= 0.5; }

else { b = x; yb = y; if( yc*yb > 0 ) ya *= 0.5; }

}

return x;

}

%> modified false-position method

#> double fn(x) = exp(x)-5;

#> modfalsePos(0,3, fn);

[ 1 0 3 0.628748 -3.12474 ]

[ 2 0.628748 3 1.32334 -1.24406 ]

[ 3 1.32334 3 1.73923 0.692944 ]

Page 30: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

30

[ 4 1.32334 1.73923 1.59045 -0.094057 ]

[ 5 1.59045 1.73923 1.62221 0.0642865 ]

[ 6 1.59045 1.62221 1.60932 -0.000607108 ]

[ 7 1.60932 1.62221 1.60956 0.000588256 ]

[ 8 1.60932 1.60956 1.60944 -3.57136e-008 ]

ans = 1.6094379

최종결과를 보면 단지 8번의 반복으로도 참값에 가까운 근을 얻는다.

2-8 뮬러 방법 (선택)

■ 뮬러 방법. 뉴턴법은 주어진 점에서의 기울기를 가진 직선을

이용하고, 할선법은 두 점을 지나는 직선을 이용하여 근을 찾아나간다.

이와 유사하게 세 개의 점을 지나는 2 차식의 근을 이용하여 방정식의 근을

찾는 방법을 뮬러 방법 (Muller method)이라고 한다.

세 개의 점 을 지나는 2차 다항식은

아래의 항을 정의하면

주어진 다항식은

또는

(44)

#> p = .interp(x,f).syndiv(x(2)) ; // x = [ x1,x2,x3 ], f = [ f1,f2,f3 ]

Page 31: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

31

와 같이 중간점 에 대해서 정리할 수 있다. 여기에서 의 근

중에서 하나의 근을 선택해야 하는데 구간의 크기를 계속 줄여나가기

위해서 분모의 절대값이 최대인 경우를 선택한다. 다시 말해서

(45)

으로 선택한다. 다음으로 중에서 위에서 구한 값으로부터 가장

멀리 떨어진 값을 버리고 나머지 세 개의 값을 이용하여 위의 과정을

되풀이하면 전체 구간의 크기는 점차 감소하면서 해가 얻어진다. 그러나

가 항상 구간의 가운데에 위치하도록 하는 점에 주의한다 [수치적으로는

].

//----------------------------------------------------------------------------

// Muller method

//----------------------------------------------------------------------------

double muller(a,b,c, ftn(x)) {

eps = 1.e-7;

x = [a,b,c];

y = ftn++(x); // upgrade ‘double’ function to accept matrix

iter=0;

while(1) {

if(++iter > 100) { "muller failed"; return NaN; }

k = 6 - x.max1k - x.min1k; // median index of x1,x2,x3

p = .interp(x,y) %% x(k); // synthetic division

a = p[2]; b = p[1]; c = p[0];

det = b*b-4*a*c;

if(det < 0) { "no real root in muller";; return NaN; }

if(b > 0) xx = x(k)-2*c/(b+sqrt(det));

else xx = x(k)-2*c/(b-sqrt(det)); // root of a quadratic, eq(45)

yy = ftn(xx);

[ x, xx, yy ];; // display

d = |x-xx|.max1;

k = |x-xx|.max1k;

x(k) = xx; // find and discard the farthermost point from xx

y(k) = yy; // replace the discarded point with the root xx

Page 32: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

32

if( |d| < eps || |yy| < eps ) break;

}

return xx;

}

(예제 8) 의 근을 인 세 점을 이용하는 뮬러

방법으로 근을 구하라.

시작단계는 세 점에서의 값 을 구하고 식(44)에

주어진 다항식을 구하는 것이다.

#> x = [ 1,2,3]; y = exp(x)-5;

x = [ 1 2 3 ]

y = [ -2.28172 2.38906 15.0855 ]

#> p = .interp(x,y) %% x(2) ; // x = x-x(2) below

p = poly( 2.38906 8.68363 4.01285 )

= 4.01285x^2 +8.68363x +2.38906

인 계수를 구한다. 이때 이므로 식(45)의 근은

(46)

으로 된다. 위에서 구한 근과 최초에 주어진 세 점과의 거리는

Page 33: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

33

이므로 가장 멀리 떨어진 점 을 버리고 그 자리에 2 차식의 근을

채워넣는다. 그리고 이 근이 구간의 가운데에 오도록 조정한다. 그러면

수정된 세 점은

으로 된다. 위의 세 점을 이용하여 뮬러법을 다시 반복하면

(47)

인 새로운 추정근을 구한다. 이것을 반복하면

#> double fn(x) = exp(x)-5;

#> muller(1,2,3, fn); // user function listed above

a b c x f(x)

[ 1 2 3 1.67652 0.346935 ]

[ 1 2 1.67652 1.61193 0.0124727 ]

[ 1.61193 2 1.67652 1.60943 -6.15078e-005 ]

[ 1.61193 1.60943 1.67652 1.60944 1.74366e-009 ]

ans = 1.6094379

와 같이 방정식의 근 을 얻는다. 이때 위의 결과로부터 알 수

있듯이 뮬러법으로 방정식의 근을 구하는 과정에서 세 점 의 크기

순서는 문제되지 않으며 단지 으로 점 가 구간의

가운데에 놓이면 된다.

위에 살펴본 결과는 cemm#에 내장된 함수로부터 아래와 같이 구할 수

있다.

#> solve .x ( exp(x) = 5 ) .muller(1,2,3) .peep ; // Umbrella ‘solve’

--------- Muller method -----------

iter x f(x)

0 1 -2.282

0 2 2.389

0 3 15.09

1 1.6765235 0.3469

2 1.6119293 0.01247

Page 34: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

34

3 1.6094256 -6.151e-005

4 1.6094379 1.744e-009

ans = 1.6094379

2-9 다항식에 대한 베어스토우 방법 (선택)

이 절에서는 차 다항식으로 이루어진 방정식의 근을 찾는 방법에

대해서 알아본다. 실제로 다항식의 근을 구하는 데 가장 안정적이고

효율적인 방법은 QR 반복법으로 알려져 있다. 그러나 이 방법은 행렬의

고유값문제를 푸는 방법을 다항식의 근을 구하는 데 응용한 것이므로

뒤에서 다시 다루기로 한다.

■ 베어스토우 방법. 에 관한 다항식의 차수가 5 이상이면 대수적인

해가 존재하지 않는다는 것이 아벨 (Abel)에 의해 증명되어 있다. 따라서

5 차 이상 다항식의 근은 수치적인 방법만이 해를 구하는 유일한 수단이

된다. 이러한 목적으로 개발된 방법 중에서 다항식연산을 이용하는 방법이

베어스토우 (Bairstow) 방법이다. 이 방법은 차 다항식

을 2 차 인자 로 나눈 나머지가 0 이 되도록 계수 를

결정한다.

일반적으로 차 다항식 를 으로 나누어 얻는 몫과

나머지는

(48)

으로 쓸 수 있다. 여기서 나머지가 으로 된다면 차 다항식

는 2 차 인자 를 인수로 가지므로 2 개의 근을 구할 수

있다. 그런데 나머지는 에 따라 달라지므로

(49)

Page 35: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

35

와 같이 표현할 수 있다. 베어스토우 방법의 핵심은 위의 조건이

만족되도록 초기에 추정한 과 의 값을 개선하는 알고리듬을 구하는

것이다. 먼저 식(48)을 전개하여 계수비교하면

(50)

을 얻을 수 있다.

한편 의 초기 추정값을 라고 하면 2 차인수가 되는 참값

와는

(51)

인 오차가 발생하게 된다. 이때 식(36)을 변수 에 관하여

테일러전개하면

(52)

이고 고차항을 무시하면

(53)

인 근사식을 얻게 된다. 윗식에서 계수

는 식(37)을 과 에 관하여 편미분하여 얻을 수 있다. 편미분을 수행하면

Page 36: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

36

(54)

이므로 계수 가 순환관계로부터 결정된다.

정리하면, 다항식의 근을 구하는 베어스토우의 방법은 다음의 과정을

거친다.

(step 1) 초기 추정값 를 가정한다.

(step 2) 식(37)로부터 을 구한다.

(step 3) 식(41)을 이용하여 을 구한다.

(step 4) 식(40)을 풀어 구한 를 이용하여 식(38)로부터 를

값갈이하고, 수렴조건이 만족되지 않으면 (step 1)로 돌아간다.

//----------------------------------------------------------------------------

// Bairstow method

//----------------------------------------------------------------------------

poly bairstow(a, double r,s) { // poly bairstow(poly a, double r,s)

a = a.monic; // make a leading coefficient a_n = 1

n = a.n;

double b[100],br[100],bs[100];

b = 0; br = 0; bs = 0;

iter = 0;

for[500] {

b[n] = a[n];

b[n-1] = a[n-1]-r*b[n];

for.i(n-2,1, -1) b[i] = a[i]-r*b[i+1]-s*b[i+2]; // for(i=n-2; i>=1; i--)

b[0] = a[0]-s*b[2];

br[n-1] = -b[n];

br[n-2] = -b[n-1]-r*br[n-1]; bs[n-2] = -b[n];

for.i(n-3,1, -1) { // for(i = n-3; i >= 1; i--)

br[i] = -b[i+1]-r*br[i+1]-s*br[i+2];

bs[i] = -b[i+2]-s*bs[i+2]-r*bs[i+1];

}

br[0] = -s*br[2];

Page 37: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

37

bs[0] = -b[2]-s*bs[2];

det = br[0]*bs[1]-br[1]*bs[0];

dr = (-b[0]*bs[1]+b[1]*bs[0])/det;

ds = (-b[1]*br[0]+b[0]*br[1])/det;

r += dr; s += ds;

[ ++iter, r, s ];;

if( |dr|+|ds| < 1.e-6 ) break; }

return poly(s,r,1); }

(예제 9) 을 베어스토우 방법으로

모든 해를 구하라. 초기의 2차인수는 으로 두고 시작하라.

초기에 추정하는 2 차인수 를 으로 두면 식(50)

으로부터 가 되므로

(55)

을 얻는다. 다음으로 식(54)에 위의 결과와 을 대입하면

(56)

으로 된다. 이것을 식(53)에 대입하고 풀면

(57)

이므로 새로운 는

(58)

으로 된다. 다음의 반복단계를 계속 진행하면 다음과 같이 해가 얻어진다.

Page 38: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

38

#> bairstow( .[1,12,62,172,221], 0,0); // user-defined function

bairstow.ans = [ 1 2.08429 3.56452 ]

bairstow.ans = [ 2 3.65639 7.37287 ]

bairstow.ans = [ 3 4.75654 12.2209 ]

bairstow.ans = [ 4 3.70532 12.7884 ]

bairstow.ans = [ 5 3.97725 12.9056 ]

bairstow.ans = [ 6 4.00016 12.9994 ]

bairstow.ans = [ 7 4 13 ]

bairstow.ans = [ 8 4 13 ]

ans = poly( 13 4 1 )

= x^2 +4x +13

또는 poly의 멤버함수를 이용하여

#> .[1,12,62,172,221].quad(0,0); // built-in member function

ans = poly( 13 4 1 )

= x^2 +4x +13

따라서 2차인수로

(59)

을 얻는다. 이것을 풀면 인 해가 구해지고, 2 차인수를

이용하여 주어진 다항식을 나누면

(60)

으로부터 모든 복소근

(61)

이 결정된다.

☑ 이 비교적 작은 소형문제에서는 서로 다른 방법들에서 성능차이가

그다지 나타나지 않는다. 그러나 이 아주 큰 대형문제를 다루는 경우에는

베어스토우 방법보다는 안정된 QR 반복법을 사용한다.

Page 39: 비선형방정식의 -  · PDF file[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근   2 의 값이 얼마나 0에 가까운가를 판단하는

[102] 002 cemm#을 활용한 수치해석, 제 2 장 비선형방정식의 근 www.msharpmath.com

39

(예제 10) 을 베어스토우

방법으로 풀어라.

위의 방법을 반복하면

#> bairstow( .[1,-15,90,-270,405,-243], 0,0 );

...........

bairstow.ans = [ 997 -6.00488 9.01466 ]

bairstow.ans = [ 998 -6.00403 9.0121 ]

bairstow.ans = [ 999 -6.00322 9.00967 ]

ans = poly( 9.00967 -6.00322 1 )

= x^2 -6.00322x +9.00967

와 같이 반복계산을 진행하여도 부근에서 계속 진동만 하고

수렴하지 않는다. 그 이유는 주어진 방정식이

(62)

으로 5 중근이기 때문이다. 이와 같이 베어스토우 방법은 다중근의 경우

성능이 떨어진다 (다른 방법들, 복소함수에 대한 뉴턴의 방법, QR 반복법

모두 다중근의 경우에는 성능이 떨어진다). 내장된 멤버함수를 이용하면

#> .[1,-15,90,-270,405,-243] .quad(0,0);

ans = poly( 9.01848 -6.00616 1 )

= x^2 -6.00616x +9.01848

//----------------------------------------------------------------------------

// end of file

//----------------------------------------------------------------------------