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 a SetPrecision.

  • Hasonlóképpen a First @ eq – et Subtract @@ 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 eqeredeti 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 MachinePrecisionkivételével).

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.