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 Rationalizepentru a converti coeficienții în numere exacte în acest caz decât SetPrecision.

  • de asemenea, am înlocuit First @ eq cu Subtract @@ 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ă eqare 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).

Lasă un răspuns

Adresa ta de email nu va fi publicată.