먼저 다항식의 근을 계산하는것부터 시작하자
평소에 인수분해등 다양한 방법으로 근을 구했던 2차 3차....다항식의 근의 계산을 매트랩으로 매우 쉽게 구할 수 있다.
solver를 이용하면 더 쉽지만 먼저 solver를 이용하지 않고 풀어보도록 하자
방정식은 x^5+6x^4-5x^3+4x^2-3x+2=0를 풀어보자.
매트랩에는 정말 다항식의 근을 구해주는 정말 다양한 명령어들이 있다.
그 중에서 가장 많이 사용하는 기능은 당연히 solve 기능이겠지만 간단한 다항식은
아래와 같은 roots(계수)를 이용하는것이 편리한 경우가 많다.
계수만 배열로 정의해주고 roots를 사용하면 된다.
정말 쉽다.
그렇다면 조금 더 근본적으로 이러한 값이 어떻게 추출되는지 알 필요가 있다.
우리는 이차방정식은 근의 공식을 사용한다.
그러나 3차 4차 방정식은?? 물론 근의 공식이 있긴하다. 그러나 누가 근의 공식을 이용하여 다차다항식의 근을 구하는가?
인수분해를 할 수 없다면 다차 다항식의 근을 구하기란 쉽지 않다.
하지만 컴퓨터는 완전 정확하지는 않지만 상당히 정확한 범위로 근을 근사 할 수 있는 방법이 있다.
깊게 공부하면 수치해석이라는 과목이 따로 있을 정도로 컴퓨터가 연산을 하는 과정은 어렵고 복잡하다.
대표적인 방법으로는 뉴턴방법이 있다. 뉴턴 방법은 임의의 점에서 함수의 그래프의 접선을 그리고, 이 접선이 x 축과 만나는 점을 계속 반복하면서 정하는 방법이다.
자세한 이론은 정말 간단하니 한번 생각해보고 식을 구해보면 좋을것 같다.
1차원 뉴턴 방법 ( 변수 1개 )
1차원 뉴턴 방법에서 사용할 식은
x_2 = x_1-f(x_n)/f'(x_n) 이다
간단한 이차방정식의 근을 구해보자
식은 x^2 + 5x -8 = 0 이다. 그리고 시작하는 초기 x 값은 10으로 하도록 하겠다.
결론부터 말하자면 초기값을 10으로 설정했으므로 10에 가까운 근이 1.2749로 구해졌다.
roots를 이용한 이차방적식의 해와 비교해보아도 같은 값이 나오는것을 알 수 있다.
그리고 반복계산되는 값을 보기 위해 빈 배열인 iteration value를 만들었다.
이 배열을 보면 7번 계산되었음을 알 수 있고, 매번 계산된 값이 나와있다.
반복적인 계산을 하기에 while 문을 사용하였다.
해와 현재 위치와의 차이가 매트랩이 계산할 수 있는 가장 작은수에 도달 할때 까지 구문을 반복하여 근사하는 프로그램이다.
수치해석의 기본인 뉴턴 방법은 알아두면 유용하다.
2차원 뉴턴 방법 ( 2개의 변수를 가지는 방정식 )
위에서 다룬 내용은 y=f(x)인 형태의 방정식의 풀이법이고 이번에는 z = f(x,y) 와 z = g(x,y)의 식을 연립하는 2차원 뉴턴
방법을 해보도록 하자. 이때 자코비안 행렬이 나오는데, 자세한 이론은 생략하도록 하겠다.
Jacobian =
[f.x(p1) f.y(p1)
g.x(p1) g.y(p1) ] 의 형태를 가지는 행렬이다
F(x,y) =
[f(x,y)
g(x,y)] 이다
p_n = (x_n,y_n)
s = p_n+1 - p_n
일때 반복되는 식은
J(p_n) * (p_n+1 - p_n ) = -F(p_n) 이다.
f = y - cos(x)
g = 2*y - x.^2 인 함수라고 하자
먼저 xy 평면에 투영된 그림을 확인해보자. 2개의 점에서 만난다.
초기 좌표는 p1 = (10,20) 으로 하도록 하겠다.
위에서 보는것 처럼 초기값에 가까운 교차점의 좌표를 구할 수 있다.
f 와 g 에 구한 x,y 좌표를 넣었을때 거의 근사한 값을 얻을 수 있었다.
for loop를 사용하지 않고 while 루프를 사용하는 코드를 작성해도 좋다.
그러나 매트랩을 사용할떄 매번 이렇게 newton 방법을 통해 근을 구하는것은....매트랩을 사용하지 않는것과 다르지 않다.
다음부터는 매트랩에 내장된 solver를 이용하는 방법을 알아보도록 하겠다.
fzero , fsolve (0) | 2021.02.02 |
---|---|
solve 기능 이용하기 (0) | 2021.02.02 |
댓글 영역