728x90

방정식의 해법

1. 시작법

2. 이등분법

3. 가위치기법

4. 수정 가위치기법

 

 

 

근에 가까운 시작접을 잡는것과 하지 않는 것의 차이

- 반복법 사용시 오차를 최대한 줄일 수 있음

 

 

 

시작점

- 반복법으로 방정식의 근을 구하기 위해 대략적으로 추측한 근사값 x0에서부터 시작대로 x1, x2 ..를 구해가는 기법으로 x0를 시작점이라 함.

- 시작점 x0을 어떻게 잡느냐에 따라 -> x1, x2, ...가 근에 -> 수렴하는 속도가 빠르거나/느리거나 발산하는 경우가 존재

=> 가능한 주어진 함수의 성질로 근에 가까운 시작점 x0을 잡는 것이 바람직함.

* x_0가 근에 멀리 떨어진 값이라면 x_100의 근을 취하더라도 큰 오차 발생 가능

 

 

반복법

- 어떤 정해진 과정을 차례대로 되풀이하여 구하는 방법

- x0부터 시작하여 x1, .. 를 정해진 방법으로 구하여 최대한 오차를 줄여가면서 방정식의 근을 구하는것

 

 

 

반복법 사용 예시

- f(x) = 13.42 x^2 - 14.21x + 34.45 = 0

 ->근의 공식으로 쉽게 구할 수 있음.

- f(x) = 3x^8 + 5x^5 + 7x - 21 = 0

- f(x) = e^x ln x + sin x - 1.2 = 0

 -> 구하기 어려운 방정식의 근은 반복법으로 구함

 -> 위 방정식의 근을 구하는 공식이 없음

 

 

매트랩으로 시작점 구하기

 

clc;
clear all;


N=5;
x0 = -2;

y(1) = x0*x0;
x(1) = x0;
z(1) = x0/2 + 2;
x1(1) = x0;

for n=1:4
	x(n+1) = x(n) + 1;
    y(n+1) = x(n+1) * x(n+1);
end
plot(x, y);
hold on

for n=1:4
	x1(n+1) = x1(n) + 1;
    z(n+1) = x1(n+1)/2 +2;
end
plot(x1,z);

- 두 곡선 사이 교점은 -2과 -1 사이 하나와 1과 2 사이 하나가 존재함

-> 시작점은 -1, 2

 

 

 

이등분법에서 중간값 정리를 사용하는 이유

- 폐구간 함수일 경우 구간에 적어도 근이 하나 존재한다고 함

 

 

이등분법

- 구간 (a, b)를 P점을 포함하도록 계속 이등분 하는것

- 아래의 가정이 필요

 1. 구간 (a, b)에서 연속 함수 f(x)가 주어지고, f(a), f(b)가 반대 부호를 갖는다고 가정

 2. 중간값 정리에 의해 f(p)=0을 만족하는 점 P가 a, b 사이에 존재함

 3. 구간 (a, b)안에 2개 이상의 근이 있는 경우도 있으나 근이 한개만 있다고 가정

 

중간값 정리

- f(x)가 폐구간 [a, b]에서 연속일 때 f(a) < f(b)라 하면, f(a) < a< f(b)인 임의의 값 a에 대하여 f(c) = a가 되는 c가 구간 (a, b)에 적어도 하나 존재한다고 하는 정리

 

 

이등 분법 bisection method

- p1 = (a1 + b1)/2라 하고, f(p1) = 0이면, p=p1이고 f(p1) != 0이면 f(p1)은 f(a1)이나 f(b1)중 하나와 같은 부호를 가짐

- f(p1)이 f(a1)과 같은 부호를 갖는 경우 -> p는 p1과 b1사이에 존재하게 되므로 a2= p1, b2=b1라 가정

- f(p1)이 f(b1)과 같은 부호를 가지는 경우 -> p는 a와 p1 사이에 존재하므로, a2 = a1, b2 = p1이라 놓고 구간 (a2, b2)에서 앞의 과정을 반복

 

 

멈춤 과정

-매트랩을 이용할 때 시행되는 반복 횟수에 대한 조건을 결정하는 것이 좋음

- 코딩을 잘못한 경우 무한번 반복 시행에 대한 가능성을 제거하기 위해 N은 최대 한계치를 결정하고 횟수를 더 초과하면 멈춤 과정을 실시함

 

 

매트랩으로 근사해 구하기

- f(x) = x^2 - 4

clc;
clear all;
f='x^2 - 4';
n =0;
a=1;
b=2;
c = (a+b)/2;
eps = 0.000001;
fprintf(' n a b c f(c) \n');

while b-c >= eps
	n = n + 1;
    x = b;
    fb = eval(f);
    x = c;
    fc = eval(f);
    if fb * fc <= 0
    	a = c;
        c = ( a + b)/2;
    else
    	b=c;
        c = (a+b)/2;
    end
    fprintf("%2.0f %2.10f %2.10f %2.10f %2.5f \n", n, a, b, c, fc);
end

 

 

 

 

 

 

 

300x250

+ Recent posts