Hogyan kaphatom meg a bonyolult egyenlet megoldását?
Bevezetés
frissítés 6/2014
eredetileg három megoldást találtam; most hat. Azt hittem, tudom, hogy három van, mert az egyenlet racionalizálása 24-es fokú polinomot eredményez, és NSolve
24 gyökeret talál, majd megszünteti azokat a gyökereket, amelyek nem voltak nullák az eredeti egyenletben. Kiderült, hogy az egyenlet zavaró volt a számok szempontjából, én pedig kihagytam hármat.
egyéb módosítások:
-
természetesebbnek tűnik a
Rationalize
használata az együtthatók pontos számokká konvertálására ebben az esetben, mint aSetPrecision
. -
Hasonlóképpen a
First @ eq
– etSubtract @@ eq
– re cseréltem.
racionalizálja az egyenletet
szem előtt kell tartani, hogy a dokumentáció szerint NSolve
NSolve
elsősorban lineáris és polinom egyenletekkel foglalkozik.
az OP egyenlete egy algebrai egyenlet, amely polinom egyenletgé alakítható, amelyet NSolve
ezután könnyen megoldhat. Mivel NSolve
nem ezt a saját, meg kell racionalizálni “kézzel.”A racionalizálás idegen megoldásokat vezet be, ezért ellenőriznünk kell a NSolve
által visszaadott válaszokat. A eq
kissé csúnya együtthatói megnehezítik, mivel a eq
racionalizálásakor a kerekítési hiba azt eredményezi, hogy a négyzetgyökek egy része nem törlődik ki, ahogy kellene. Ezt úgy tudjuk kijavítani, hogy a eq
pontosságát Infinity
– re állítjuk.
megtalálhatjuk a négyzetgyökeket egy kifejezésben expr
val vel
DeleteDuplicates @ Cases, Infinity]
majd minden négyzetgyöknél megszorozhatjuk expr
kifejezéssel a négyzetgyököt negatívval helyettesítve és egyszerűsíthetjük.
az alábbiakban a módszer alkalmazásának eredménye a Equal
eq
– ben Subtract
– vel Apply
– vel (@@
) történő helyettesítésével kapott függvényre. Pontosan meg tudjuk oldani az egyenletet.
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}}*)
a két megoldás között jelentős különbségek vannak:
(ζ /. rootsRat) - (ζ /. rootsRatExact) // Abs // Max(* 3.15226*10^-10*)
az adott egyenlet gyökereinek kiválasztása
frissítés: itt hiányoztam néhány nullát.
a Pick
– ot használtam olyan gyökerek kiválasztásához, amelyeknél a eq
eredeti egyenletnek kis értéke van, kevesebb, mint néhány kis küszöbérték, mondjuk 10^-1
. Később ellenőrizhetjük, hogy mindegyik gyökér, de nem ellenőriztem más gyökereket. Az eredeti gyökerek a következők voltak:
rootsEq = Pick < 10^-1 /. rootsRat](* {{ζ -> -3.78042 - 5.50655 I}, {ζ -> -3.20562 + 5.39914 I}, {ζ -> 6.98478 + 0.493405 I}}*)
ezek megfelelnek a 7., 9. és 20. gyökereknek rootsRat
:
Position < 10^-1 &)](* {{7}, {9}, {20}}*)
ha ellenőrzöm a nullák pontos egyenletét PossibleZeroQ
értékkel, akkor több gyökeret kapok:
Position(* {{1}, {7}, {9}, {14}, {20}, {21}}*)
örökké tart ezeken a potenciális gyökereken, vagy legalábbis hosszabb ideig, mint amennyit hajlandó voltam várni.]
érdekes módon ezek a további gyökerek kapcsolódnak a NSolve
által visszaadott eredmények közötti különbségekhez Solve
:
Position, _?Positive](* {{1}, {2}, {3}, {14}, {21}, {22}, {23}, {24}}*)
hagyjuk, hogy új gyökereink a következők legyenek, és alább ellenőrizhetjük őket:
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}}*)
ellenőrzések
eleinte az at nem néz ki túl jól az új kiegészítésekhez:
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} *)*)
a probléma az egyenlet gépi pontossággal történő értékelésében rejlik.
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}*)
a figyelmeztetés nem tűnik jelentősnek. A $MaxExtraPrecision
– tól 2000
– ig történő felugrás még mindig a figyelmeztetést és a nullákat eredményezi a 2020
– től 2040
– ig terjedő pontossággal. Ha nullák ,akkor a N
valószínűleg mindig előadja a figyelmeztetést, mivel a nem lehet
Precision
(a MachinePrecision
kivételével).