어떻게 복잡한 방정식의 솔루션을 얻을 수 있습니까?

소개

업데이트 6/2014

원래 세 가지 솔루션을 찾았습니다. 방정식을 합리화하면 다항식 24 와NSolve이 24 개의 뿌리를 찾은 다음 원래 방정식의 0 이 아닌 뿌리를 제거하기 때문에 3 개가 있다는 것을 알았습니다. 이 방정식은 숫자의 관점에서 골칫거리였다 밝혀 나는 세 놓쳤다.

기타 수정:

  • 이 경우SetPrecision보다Rationalize을 사용하여 계수를 정확한 숫자로 변환하는 것이 더 자연스러운 것 같습니다.

  • 마찬가지로First @ eqSubtract @@ eq로 대체했습니다.

방정식을 합리화

하나는 염두에 두어야 그 문서에 따라NSolve

NSolve 주로 선형 및 다항식 방정식을 다룹니다.

연산 방정식은 다항식 방정식으로 전환 할 수있는 대수 방정식이며,NSolve은 쉽게 풀 수 있습니다. NSolve은 독자적으로 이것을 하지 않기 때문에,우리는 손으로 합리화해야 한다.”합리화는 외부 솔루션을 도입하는 경향이 있으므로NSolve이 반환 한 답변을 확인해야합니다. eq의 다소 불쾌한 계수는eq을 합리화 할 때 반올림 오류로 인해 일부 제곱근이 정상적으로 취소되지 않기 때문에 더 어려워집니다. eq의 정밀도를Infinity로 설정하여 해결할 수 있습니다.

DeleteDuplicates @ Cases, Infinity]

각 제곱근에 대해expr에 제곱근을 음수로 대체 한 식으로 곱하고 단순화 할 수 있습니다.

아래는eqEqual에서SubtractApply(@@)로 대체하여 얻은 함수에 이 방법을 적용한 결과입니다. 우리는 방정식을 정확하게 풀 수 있습니다.

eqExact = Rationalize;rationalized = Simplify @ Fold &, eqExact, DeleteDuplicates@Cases, Infinity]];rootsRatExact = Solve;rootsRat = NSolve(* 24 roots {{ζ -> -24559.6 + 24559.6 I}, <<22>>, {ζ -> 24559.6 - 24559.7 I}}*)

두 솔루션 간에는 몇 가지 중요한 차이점이 있습니다:

(ζ /. rootsRat) - (ζ /. rootsRatExact) // Abs // Max(* 3.15226*10^-10*)

주어진 방정식의 뿌리 선택

업데이트:여기에 0 을 놓친 곳이 있습니다.

Pick을 사용하여 원래 방정식eq10^-1과 같은 작은 임계 값보다 작은 값을 갖는 루트를 선택했습니다. 우리는 각각의 루트 것을 나중에 확인할 수 있습니다,하지만 난 다른 뿌리를 확인하지 않았다. 원래 뿌리는 다음과 같습니다:

rootsEq = Pick < 10^-1 /. rootsRat](* {{ζ -> -3.78042 - 5.50655 I}, {ζ -> -3.20562 + 5.39914 I}, {ζ -> 6.98478 + 0.493405 I}}*)

이들은 뿌리에 해당 7,9,과 20…에서rootsRat:

Position < 10^-1 &)](* {{7}, {9}, {20}}*)

나는PossibleZeroQ와 0 에 대한 정확한 방정식을 확인하면,나는 더 많은 뿌리를 얻을:

Position(* {{1}, {7}, {9}, {14}, {20}, {21}}*)

이러한 잠재적 인 뿌리에 영원히 걸리거나 적어도 내가 기꺼이 기다렸던 것보다 오래 걸립니다.]

흥미롭게도 이러한 추가 루트는NSolveSolve:

Position, _?Positive](* {{1}, {2}, {3}, {14}, {21}, {22}, {23}, {24}}*)

의 우리의 새로운 뿌리는 다음과 같이하자 우리는 아래를 확인할 수 있습니다:

rootsEqNew = Pick];rootsEqNew // N(* {{ζ -> -24559.6 + 24559.6 I}, {ζ -> -3.78042 - 5.50655 I}, {ζ -> -3.20562 + 5.39914 I}, {ζ -> -0.0832786 - 722.827 I}, {ζ -> 6.98478 + 0.493405 I}, {ζ -> 722.642 - 0.100823 I}}*)

검사

처음에,에서 새로운 추가에 대한 너무 좋아 보이지 않는다:

eqExact /. rootsEqNew // N(* { 0. + 9.7614*10^12 I, (* {1} *) -1.49012*10^-8 + 3.91155*10^-8 I, (* {7} *) -1.39698*10^-8 - 3.63216*10^-8 I, (* {9} *) -2. + 1536. I, (* {14} *) 1.49012*10^-8 + 1.11759*10^-8 I, (* {20} *) 0. + 1024. I} (* {21} *)*)

문제는 기계 정밀도로 방정식을 평가하는 것입니다.

N(* N::meprec warning about $MaxExtraPrecision being reached *)(* {0``69.62973568978663 + 0``69.69302870899077 I, 0``90.5174054423328 + 0``90.55817837498498 I, 0``90.50250822096415 + 0``90.54414468499085 I, 0``80.1824915073549 + 0``79.76650578675965 I, 0``90.47483650216002 + 0``90.49782363232914 I, 0``80.17292602755023 + 0``79.76710897249409 I}*)

경고가 중요하지 않은 것으로 보입니다. $MaxExtraPrecision에서2000까지 부딪치면 여전히2020에서2040까지의 정확도로 경고와 0 이 생성됩니다. 0 인 경우Precision(MachinePrecision제외)을 가질 수 없으므로N은 항상 경고를 생성합니다.

답글 남기기

이메일 주소는 공개되지 않습니다.