2011-02-05 3 views
5

이것은 나에게 명백한 질문처럼 보입니다. 그러나 나는 어디에서나 그것을 발견 할 수 없었습니다. 저는 3 차 다항식을 가지고 있으며 함수의 실제 근원을 찾아야합니다. 이게 무슨 방법입니까?(입방) 다항식의 실제 근원을 찾는 간단한 방법은 무엇입니까?

입방 함수의 뿌리에 대해 여러 개의 닫힌 형식 수식을 찾았지만 모두 복소수 또는 많은 고니 오 메트릭 함수를 사용하며 마음에 들지 않습니다 (또한 선택할 수있는 모름도 있습니다) .

나는 간단한 것이 필요합니다. 더 빠르다. 그리고 결국에는 더 높은 차수의 다항식을 풀 필요가 있다는 것을 알고 있으므로 수치 해석을하면 아마도 도움이 될 것입니다. 나는 나를 위해 열심히 일하기 위해 도서관을 사용할 수 있다는 것을 알고 있지만, 나는 이것을 운동으로하고 싶다고 말하게한다.

저는 C로 코딩 했으므로, import magic_poly_solver이 아닙니다.

보너스 질문 : 주어진 간격 내에 뿌리 만 찾는 방법은 무엇입니까?

답변

8

입방 다항식의 경우 closed form solutions이 있지만 수치 계산에는 적합하지 않습니다.

큐빅의 경우 다음을 수행합니다. 모든 큐빅 다항식에 하나 이상의 실제 루트가 있습니다. 뉴턴의 방법으로 쉽게 찾을 수 있습니다. 그런 다음 deflation을 사용하여 나머지 2 차 다항식을 풀면이 후자의 단계를 올바르게 수행하는 방법은 내 대답 there을 참조하십시오.

한 단어의주의 : 판별자가 0에 가까울수록 숫자로 여러 개의 실제 루트가 생기며 뉴턴의 방법은 비참하게 실패합니다. 더구나, 근근까지 다항식은 (x - x0)^2와 같기 때문에 유효 자릿수의 절반을 잃게됩니다 (P (x)는 x - x0 일 때 < 엡실론이므로 < sqrt (ε)). 따라서 이것을 배제하고이 특별한 경우에 닫힌 폼 솔루션을 사용하거나 파생 다항식을 푸는 것이 좋습니다.

주어진 간격으로 뿌리를 찾으려면 Sturm's theorem을 확인하십시오.

일반 다항식 해결을위한보다 일반적인 (복잡한) 알고리즘은 Jenkins-Traub algorithm입니다. 이것은 분명히 여기에 지나치게 과장되어 있지만 입방체에서는 잘 작동합니다. 일반적으로 타사 구현을 사용합니다.

C를 사용하고 있으므로 GSL을 사용하는 것이 가장 확실한 방법입니다.

또 다른 일반적인 방법은 예를 들어 companion matrix의 고유 값을 찾는 것입니다. 균형 잡힌 QR 분해 또는 주택 소유자 형태로의 환원. 이것은 GSL이 취한 접근법입니다.

+0

해답을 가져 주셔서 감사합니다.하지만 한 가지 더 질문이 있습니다. 뉴턴의 방법에 대한 첫 번째 예상치는 어디서 얻습니까? 0을 입력해야합니까? – cube

+0

@ 큐브 : 좋은 지적. 0을 넣으면 작동하지 않을 때 1을 넣습니다. 또한 3 차 다항식을 풀면 3 차 변형을 얻을 수 있습니다. 오직 1 개의 근음이 있다면, 0은 할 것이고, 3이 있다면, 미분 다항식의 근간에서 임의의 수로 시작합니다. –

2

폐쇄 형 솔루션을 사용하지 않거나 (더 큰 순서의 다항식을 사용하려는 경우) 가장 확실한 방법은 Newton's method을 사용하여 근사치를 계산하는 것입니다.

시작 값에 따라 다르지만 반복 할 때 어떤 루트를 얻을지 결정할 수는 없습니다.

here도 참조하십시오.

+1

한 단어 : 뉴턴의 방법은 여러 개의 (또는 수치 적으로 다수의) 뿌리 비참하게 실패합니다. 더욱이, 일단 하나의 근음을 얻으면 다항식에서 제거해야합니다. 이것은 불안정 할 수 있습니다. –

1

D 허비슨 - 에반스 (D Herbison-Evans)의 Solving quartics and cubics for graphics, Graphics Gems V에 게시 됨.

+0

기사에 대한 링크가 죽었습니다. –

+0

@ 펌웨어 루거, 다른 링크를 찾았습니다. 감사. – lhf

0
/******************************************************************************* 
* FindCubicRoots solves: 
*  coeff[3] * x^3 + coeff[2] * x^2 + coeff[1] * x + coeff[0] = 0 
* returns: 
*  3 - 3 real roots 
*  1 - 1 real root (2 complex conjugate) 
*******************************************************************************/ 

int FindCubicRoots(const FLOAT coeff[4], FLOAT x[3]); 
하지만주의의

http://www.realitypixels.com/turk/opensource/index.html#CubicRoots