• 검색 결과가 없습니다.

제 7 장. 방정식의 풀이

N/A
N/A
Protected

Academic year: 2022

Share "제 7 장. 방정식의 풀이"

Copied!
36
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

제 7 장.

방정식의 풀이

(2)

Newton 방법

• 방정식 을 푸는 Newton 방법에서는 임의의 점에서 의 그래프에 접선을 그리고 이 접선이 x 축과 만나는 점을 정한다. 이 방법에서는 하나의 출발점 가 필요하다. 이후 반복과정은

로 쓸 수 있다. 이를 수행하는 MATLAB 코드는 다음과 같다.

k = 0

while abs(x - xprev) > eps*abs(x) xprev = x;

x = x - f(x)/fprime(x) k = k + 1;

end

(3)

• Newton 방법을 이용하면 제곱근을 능률적으로 계산할 수 있다. 의 계산은 방 정식

의 풀이와 대등하다. 이 경우 이고

이다. 즉 x와 M/x의 평균이 반복해서 계산된다. MATLAB 코드는 다음과 같다.

while abs(x - xprev) > eps*abs(x) xprev = x;

x = 0.5*(x + M/x);

end

(4)

• 에서 시작한 의 계산결과.

1.50000000000000 1.41666666666667 1.41421568627451 1.41421356237469 1.41421356237309 1.41421356237309

(5)

할선법(Secant Method)

• 할선법은 Newton 방법의 미분계산을 가장 최근의 두 반복단계에 근거하는 유한차분 근사로 대체한 방법이다.

• 한 점에서 의 그래프에 접선을 긋는 대신에 두 점을 지나는 할선을 긋는다. 그 다음의 반복점은 이 할선과 x축과의 교차점이다. 반복단계의 시초에서는 두 출발점 와 이 요 구되며 이어지는 반복단계는 다음과 같다.

(6)

• 이 공식으로부터 Newton 방법에서의 가 할선 의 기울기로 대체되었음을 명 확하게 알 수 있다. 위의 관계는 다음의 MATLAB 코드로 수행할 수 있다.

while abs(b - a) > eps*abs(b) c = a;

a = b;

b = b + (b-c)/(f(c)/f(b)-1);

k = k + 1;

end

위에서 함수 f는 다음의 M-파일 함수 f.m으로 정의할 수 있다.

function v = f(x) v = x^2 - 2;

(7)

• 에 대하여 a=1, b=2인 경우 할선법에서는 Newton 방법의 6단계에 비하여 7단 계의 반복계산이 소요된다.

1.33333333333333 1.40000000000000 1.41463414634146 1.41421143847487 1.41421356205732 1.41421356237310 1.41421356237310

• Newton 방법에 대한 할선법의 일차적인 잇점은 를 계산하는 코드가 필요하 지 않다는 점이다. 수렴성은 두 방법이 거의 비슷하다.

(8)

MATLAB 함수를 이용한 방정식의 풀이

solve 함수

• 함수 solve를 이용하여 변수들을 포함하는 방정식을 풀 수 있다. 예를 들어 2차 방정 식

의 해를 구하고자 한다면 다음을 입력한다.

>> solve('x^2 - 2*x - 4 = 0') ans =

5^(1/2)+1 1-5^(1/2)

근을 구할 식은 문자열로 지정된다. 수치해를 얻으려면 double(ans)를 입력하며 더 많은 자리수를 나타내려면 vpa(ans)를 입력한다.

(9)

• solve 함수는 고차 다항식은 물론 많은 다른 형태의 방정식들을 풀 수 있다.

방정식 의 근을 구하여 보자.

>> f = 'log10(x)-log10(x-3) = 1';

>> r = solve(f);

>> r(1) ans =

10/3

또한 하나 이상의 변수를 포함하는 방정식들도 풀 수 있다. 변수들보다 식의 수가 적 다면 어느 변수에 대해서 풀 것인가를 (문자열로) 지정해야 한다.

solve('2*x - log(y) = 1', 'y')를 입력하면 을 y에 대하여 풀어서 x의 식으로 나타낸다.

>> solve('2*x - log(y) = 1', 'y') ans =

exp(2*x-1)

(10)

• 하나 이상의 방정식들을 지정할 수도 있다.

>> [x, y] = solve('x^2 - y = 2', 'y - 2*x = 5') x =

1+2*2^(1/2) 1-2*2^(1/2) y =

7+4*2^(1/2) 7-4*2^(1/2)

(11)

• 위의 방정식 시스템은 두 개의 해를 갖는다. x와 y의 첫 번째 해는 x(1)과 y(1)을 입력 하여 얻을 수 있다.

>> x(1) ans =

1+2*2^(1/2)

>> y(1) ans =

7+4*2^(1/2)

(12)

• 방정식 를 풀어보자.

>> r = solve('y=3^2*x', 'y=5^x+1') r =

x: [2x1 sym]

y: [2x1 sym]

>> r.x(1) ans =

1/9*exp(-lambertw(-1/9*log(5)*5^(1/9))+1/9*log(5))+1/9 >> r.x(2)

ans =

1/9*exp(-lambertw(-1,-1/9*log(5)*5^(1/9))+1/9*log(5))+1/9

(13)

• 방정식을 하나의 변수로 할당한 다음 이 변수를 이용하여 solve를 호출할 수 있다.

>> w = 'x^2 + 8*x - 10 = 0';

>> solve(w) ans =

-4+26^(1/2) -4-26^(1/2)

(14)

• 5개의 근을 갖는 방정식

을 풀어보기로 하자.

>> f = 'x^5-6*x^4+4*x^3-7*x^2+x-3';

>> r = solve(f);

>> a = double(r(1)) a =

5.5015

>> b = double(r(2)) b =

0.4272 + 0.9228i

>> c = double(r(3)) c =

-0.1779 + 0.7041i

>> d = double(r(4)) d =

-0.1779 - 0.7041i

>> e = double(r(5)) e =

0.4272 - 0.9228i

(15)

• 다수의 방정식들로 구성되는 방정식 시스템들도 쉽게 풀 수 있다.

방정식 시스템의 해를 구하여 보기로 한다.

(16)

>> f1 = 'x_1 +2*x_2 +4*x_3 -3*x_4 = 5';

>> f2 = '-2*x_1 +3*x_2 -x_3 -6*x_4 = 2';

>> f3 = 'x_1 +5*x_2 -3*x_3 +2*x_4 = 4';

>> f4 = 'x_1 -3*x_2 -5*x_3 = 1';

>> r = solve(f1,f2,f3,f4);

>> a = r.x_1 a =

720/337

>> b = r.x_2 b =

397/674

>> c = r.x_3 c =

-85/674

>> d = r.x_4 d =

-246/337

(17)

기호식을 이용한 풀이

• solve에 대한 입력은 기호식이 될 수 있지만 이 경우 방정식의 우변을 0으로 만들어 주어야 한다. 실제로

을 풀기 위한 코드는 다음과 같다.

>> syms x

>> solve(x^2 - 3*x + 7) ans =

3/2+1/2*i*19^(1/2) 3/2-1/2*i*19^(1/2)

(18)

• 기호식을 이용하여 2차 방정식

을 풀어보자.

• 먼저 방정식의 계수 a, b, c와 변수 x를 기호변수로 선언하고 solve를 호출한다.

>> syms a b c x

>> y = solve(a*x^2+b*x+c) y =

1/2/a*(-b+(b^2-4*a*c)^(1/2)) 1/2/a*(-b-(b^2-4*a*c)^(1/2))

(19)

• MATLAB은 두 개의 해를 저장하는 2 x 1 기호객체 y를 생성한다. 동일한 방정식을 다 음과 같이 a에 대해서 풀 수 있다.

>> syms a b c x

>> solve(a*x^2+b*x+c, a) ans =

-(b*x+c)/x^2

(20)

• 기호식을 이용한 방정식 풀이의 다른 보기를 들어 보기로 한다. x와 y의 두 함수 f와 g를 각각 다음과 같다.

다음 그림은 수준곡선 및 의 그래프를 보인 것이다. 수준 곡선 가 수준곡선 와 교차하는 점 A, B, C, D에서 4개의 해 가 존재함을 알 수 있다.

• 및 의 0 수준곡선

(21)

• x와 y의 기호함수 f와 g를 정의한 다음 두 인수를 갖는 solve 명령어를 적용한다.

>> syms x y

>> f = y - 4*x^2 + 3;

>> g = 0.25*x^2 + y^2 - 1;

>> [a b] = solve(f,g);

>> [a b]

ans =

[ -1/16*(190+14*17^(1/2))^(1/2), -1/32+7/32*17^(1/2)]

[ 1/16*(190+14*17^(1/2))^(1/2), -1/32+7/32*17^(1/2)]

[ -1/16*(190-14*17^(1/2))^(1/2), -1/32-7/32*17^(1/2)]

[ 1/16*(190-14*17^(1/2))^(1/2), -1/32-7/32*17^(1/2)]

>> double([a b]) ans =

-0.9837 0.8707 0.9837 0.8707 -0.7188 -0.9332 0.7188 -0.9332

(22)

fzero 함수

• MATLAB의 수치근 탐색기 fzero는 Newton 방법만큼 아주 빠르지는 않지만 매우 신 뢰할 수 있는 방법들의 조합으로 구성된다. fzero는 f의 부호가 변하는 f(x)=0의 근을 구하는 데에만 사용할 수 있다. (즉 함수 fzero는 단일변수 함수에만 작용한다). fzero 는 다음과 같은 두 가지 방법으로 사용할 수 있다.

 원하는 근에 매우 가깝다고 생각되는 하나의 시작값 를 이용한다. 원하는 근이 함수 의 특이점에 매우 가까이 위치한다면 수렴에 이르지 못할 수도 있다. 호출은 fzero(f,x0)와 같이 한다.

 f의 부호가 변하는 곳을 대괄호로 묶는다.

(23)

• fzero는 을 만족하는 추정이 이루어질 때까지 반복계산을 계 속하는데 이 값은 기본적인 오차 허용한계이다.

fzero 함수를 이용하여 의 근을 구하여 보자. (x의 범위는 [1, 3]으로 한다.)

>> f = inline('sin(x) - 0.5*x');

>> root = fzero(f,[1 3]) root =

1.89549426703398

(24)

• fzero의 가장 간단한 호출방식은 x = fzero(f, x0)로서 스칼라인 x0 근처에서 f의 근을 찾는다. f는 위에서와 같이 inline 함수로 정의되는 것 외에 다음의 두 가지 방법들 가 운데 어느 한 가지 방법으로 전달될 수 있다(예: 인 경우).

 익명함수에의 핸들: fzero(@(x)cos(x)-x, x0)

 함수 M-파일에의 핸들: fzero(@myf, x0)

• myf는 다음과 같이 함수 M-파일로 정의된다.

function f = myf(x) f = cos(x)-x;

(25)

• fzero와 익명함수를 이용하여 의 근을 구하려면 다음을 수행한다.

>> [x,fval] = fzero(@(x) x-tan(x), 1) x =

1.5708 fval =

1.2093e+015

(26)

• fzero를 이용하는 다른 보기로서

을 고려하여 보자.

• f는 다음과 같은 함수 M-파일 f.m으로 정의한다.

% f.m : f(x,y)-1의 정의 function z = f(y,x)

z = sin(x) + y.*exp(x.*y) - 1;

• x의 변화에 따른 근 y는 다음의 스크립트 M-파일 fxyzero.m에 의하여 계산된다.

% fxyzero.m : 2변수 방정식의 풀이

% y를 수치적으로 추정할 x 값들을 선택 x = -0.2:0.01:1;

% y 값들을 위한 저장공간을 부여 y = zeros(size(x));

% 추측값을 이용하여 첫 번째 y값을 계산 x1 = -0.2;

y(1) = fzero(@(y) f(y,x1), 1.8);

% 나머지 y 값들의 계산을 위한 loop for n = 2:121

y(n) = fzero(@(y) f(y,x(n)), y(n-1));

end

plot(x,y)

• -1=0의 수준곡선

(27)

• fzero에서 수렴한계와 출력의 제시는 세 번째 인수인 options 구조체로 제어할 수 있는데 이는 optimset를 사용하여 정의할 수 있다. options 구조체의 필드들 가운데에서 다음과 같은 4개 필드가 사용된다.

 Display: 결과제시 수준을 지정하는데 off 값을 가지면 결과가 제시되지 않으며 iter일 때에는 각 반복단계에서의 출력값, final일 때에는 마지막 출력값 만이 제시되고, notify일 때에는 반복과정이 수렴하지 못했을 때에만 출력이 제시된다.

 TolX: 수렴한계이다.

 FunValCheck: 함수값이 복소수인지 NaN인지의 여부를 조사할 것인지를 결정한다.

 OutputFcn: 각 반복단계에서 호출되는 사용자 정의 함수를 지정한다.

(28)

• 다음은 사용 예이다.

fzero(fun, x0, optimset('Display','iter')) fzero(fun, x0, optimset('TolX',1e-4))

• 기본적인 사용은 다음과 같다:

optimset('Display','notify','TolX',eps,‘FunValCheck','off','OutputFcn',[])

optimset에 전달되는 필드 이름들은 임의의 대문자 및 소문자들의 조합이 될 수 있 으며 필드를 구별하여 주기에 충분한 글자들의 이름이면 된다.

(29)

다항식 근의 계산

• p의 근들은 z = roots(p)로부터 얻어진다. 물론 p가 실수계수의 다항식이라 할지라도 근 들의 일부는 복소수가 될 수 있다. 함수 poly는 반대의 계산을 수행하는데 주어진 근들로부터 다항식을 구성한다. 따라서 만일 z가 n-벡터이면 p=poly(z)로부터 다음과 같은 다항식의 계수를 얻는다.

위에서는 언제나 로 정규화된다. 함수 poly는 또한 행렬 인수의 처리도 가능하다. 즉 정방행렬 A에 대하여 p = poly(A)는 행렬 A의 특성 다항식 det(xI-A)의 계수들을 반 환한다.

(30)

• 함수 polyder은 다항식의 미분의 계수들을 계산하지만 다항식 자체를 계산하지는 않 는다. 예로서 2차 함수 을 고려하여 보자. 먼저 근을 구하여 본 다.

>> format short g, p = [1 -1 -1]; z = roots(p) z =

1.618 -0.61803

• 다음 코드는 위의 값들이 반올림 오차 범위에서 근들임을 입증하고 있다:

>> polyval(p,z) ans =

2.2204e-016 -1.1102e-016

(31)

• 방정식

의 근은 다음으로부터 얻는다.

>> p = [1 -6 4 -7 1 -3];

>> roots(p) ans =

5.5015

0.4272 + 0.9228i 0.4272 - 0.9228i -0.1779 + 0.7041i -0.1779 - 0.7041i

(32)

2차원 Newton 방법

• 2차원에서의 Newton 방법은 1차원에서와 동일한 방식으로 유도된다. 1차원에서는 점 으로 시작하여 접선 을 이용하여 함수 f를 근사한다. 다음에 식 의 근 를 해에 대한 보다 나은 근사로 취한다.

식 . 은 다음과 같이 쓸 수 있다.

대개 이 식을 으로 나누어 1차원 Newton 방법을 얻는다.

(33)

• 이제 한 쌍의 식 및 에서 유사한 선형 근사를 수행하여 근들을 구할 수 있다. 이제 F(x,y)가 한 쌍의 함수 f, g를 나타낸다고 하면

나아가 을 다음과 같은 편미분의 2 x 2 행렬이라고 하자.

J는 점 에서 F의 Jacobian 행렬이라고 불린다.

(34)

• J의 첫 번째 행은 기울기 벡터 이며 두 번째 행은 이다.

와 를 열벡터로 쓰면 다음과 같이 나타낼 수 있다.

이 시스템의 해는 이다. 따라서 2차원에서 Newton 방법에 대한 반복 법은

이 된다. 계산에 있어서는 이를 다음과 같이 구분한다.

 방정식들의 선형 시스템 을 푼다. s는 Newton 스텝이라고 불린다.

 다음 반복항 를 계산한다.

(35)

• 2차원 Newton 방법의 보기로서 및 을 고려하여 보자. 위 함수들에 대한 Jacobian 행렬은

과 같다. 다음은 이 함수들에 대하여 Newton 방법을 수행하는 M-파일들이다. 먼저 f(x,y), g(x,y) 및 J(x,y)들에 대한 함수 M-파일들을 작성한다.

% f.m : f(x,y)의 정의 function z = f(y,x) z = y - sin(x);

% g.m : g(x,y)의 정의 function z = g(y,x) z = y - x.^2 + 1;

(36)

• 함수 m-파일 jacob.m은 2 x 2 행렬을 출력으로 반환한다.

% jacob.m : Jacobian J의 정의 function z = jacob(y,x)

z = [-cos(x) 1; -2*x 1];

• 2차원 Newton 방법은 다음의 스크립트 M-파일 newton2.m에 의하여 수행된다

% newton2.m : 2차원 Newton 방법

p = input('시작값 p1 = [x1; y1]을 입력: ');

N = input('최대 반복계산 횟수: ');

x = p(1); y = p(2);

disp(' iterate x y f(x,y) g(x,y)') [1, x, y, f(x,y), g(x,y)]

for n = 2:N

s = -jacob(x,y)\[f(x,y); g(x,y)];

p = p + s;

x = p(1); y = p(2);

[n, x, y, f(x,y), g(x,y) ] end

참조

관련 문서

이어 뉴욕에 거주하는 여자 친구에게 냄새 문자를 보내면, 여자 친구는 오폰 (OPhone)이라는 스마트폰을 통해 향기를 맡을 수 있습니다... What are

방추사 미세소관이 염색체에 붙으면 (많은 미세소관이 각각의 방추사부착점에 붙는다) 두 개의 방추사부착점 중 어느 쪽에 얼마나 많은 미세소관이 붙었는가에 따라

제품의 소비로부터 얻을 수 있는 사회적, 심리적 편익에

제품의 소비로부터 얻을 수 있는 사회적, 심리적 편익에

이처럼 시장가격지지 계산에 따라 많은 편차를 보이는데 일반 적으로 농업에 대한 보조 수준을 언급할 때에는 정부의 재정지출을 기준으로 판단 하는 것이 널리 쓰이는 기준이라

○ 낙찰자가 소정의 기간내에 계약을 체결하지 않을 때에는 국가를당사자로하는계약에 관한법류시행령 제 38조의 규정에 의해 입찰보증금은 우리대학에 귀속하고,

○ 낙찰자가 소정의 기간내에 계약을 체결하지 않을 때에는 국가를당사자로하는계약에 관한법류시행령 제 38조의 규정에 의해 입찰보증금은 우리대학에 귀속하고, 이로부터

자금예산을 초과하거나 목적외에 사용할 수 없으며 동일 관내, 항내 전용을 할 때에는 사후적으로 이사회에 보고하여야 하고, 목간 전용을 할