Cum pot obține soluția ecuației complicate?
Introducere
actualizare 6/2014
inițial, am găsit trei soluții; acum e șase. Am crezut că știu că există trei, deoarece raționalizarea ecuației are ca rezultat un polinom de gradul 24 și NSolve
găsește 24 de rădăcini și apoi elimină rădăcinile care nu erau zerouri ale ecuației originale. Se pare că ecuația a fost supărătoare din punct de vedere numeric și am ratat trei.
alte modificări:
-
pare mai natural să folosiți
Rationalize
pentru a converti coeficienții în numere exacte în acest caz decâtSetPrecision
. -
de asemenea, am înlocuit
First @ eq
cuSubtract @@ eq
.
raționalizați ecuația
trebuie să rețineți că, conform documentației privind NSolve
NSolve
se ocupă în primul rând de ecuații liniare și polinomiale.
ecuația OP este o ecuație algebrică care poate fi transformată într-o ecuație polinomială, pe care NSolve
o poate rezolva cu ușurință. Deoarece NSolve
nu face acest lucru pe cont propriu, trebuie să raționalizăm “manual.”Raționalizarea tinde să introducă soluții străine, așa că trebuie să verificăm răspunsurile returnate de NSolve
. Coeficienții oarecum urâți de eq
o îngreunează, deoarece în raționalizarea eq
, eroarea rotundă duce la faptul că unele dintre rădăcinile pătrate nu se anulează așa cum ar trebui. Putem rezolva asta prin setarea preciziei eq
la Infinity
.
putem găsi rădăcinile pătrate într-o expresieexpr
cu
DeleteDuplicates @ Cases, Infinity]
apoi pentru fiecare rădăcină pătrată, putem înmulți expr
cu expresia cu rădăcina pătrată înlocuită de negativul său și simplificați.
mai jos este rezultatul aplicării metodei la funcția obținută prin înlocuirea Equal
în eq
cu Subtract
cu Apply
(@@
). Putem rezolva ecuația exact.
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}}*)
există unele diferențe semnificative între cele două soluții:
(ζ /. rootsRat) - (ζ /. rootsRatExact) // Abs // Max(* 3.15226*10^-10*)
selectarea rădăcinilor ecuației date
actualizare: aici am ratat câteva zerouri.
am folosit Pick
pentru a selecta rădăcinile la care ecuația originală eq
are o valoare mică, mai mică decât un prag mic, să zicem 10^-1
. Putem verifica mai târziu că fiecare este o rădăcină, dar nu am verificat alte rădăcini. Rădăcinile originale au fost:
rootsEq = Pick < 10^-1 /. rootsRat](* {{ζ -> -3.78042 - 5.50655 I}, {ζ -> -3.20562 + 5.39914 I}, {ζ -> 6.98478 + 0.493405 I}}*)
acestea corespund rădăcinilor 7, 9 și 20 în rootsRat
:
Position < 10^-1 &)](* {{7}, {9}, {20}}*)
dacă verific ecuația exactă pentru zerouri cu PossibleZeroQ
, obțin mai multe rădăcini:
Position(* {{1}, {7}, {9}, {14}, {20}, {21}}*)
ia pentru totdeauna pe aceste rădăcini potențiale, sau cel puțin mai mult decât am fost dispus să aștepte.]
interesant, aceste rădăcini suplimentare sunt legate de diferențele dintre rezultatele returnate de NSolve
și Solve
:
Position, _?Positive](* {{1}, {2}, {3}, {14}, {21}, {22}, {23}, {24}}*)
să lăsăm noile noastre rădăcini să fie următoarele și le putem verifica mai jos:
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}}*)
controale
la început, la nu arata prea bine pentru noile completări:
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} *)*)
problema este în evaluarea ecuației cu precizia mașinii.
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}*)
avertismentul nu pare a fi semnificativ. Ridicarea $MaxExtraPrecision
la 2000
produce în continuare avertismentul și zerourile cu precizii în jurul 2020
la 2040
. Dacă sunt zerouri, N
probabil va produce întotdeauna avertismentul, deoarece nu poate avea un
Precision
(altul decât MachinePrecision
).