Najlepszy sposób na rozwiązanie głupio skomplikowanego parametrycznego równania nieliniowego z redukcją / rozwiązaniem itp

Aug 16 2020

Mam parametryczną funkcję nieliniową, która jest dosłownie koszmarem. Wiem, że korzenie istnieją, są prawdziwe, a oba parametry p,esą pozytywne. To, czego oczekiwałem od Mathematica, to dostać rozwiązanie (w postaci korzenia, bez formy zamkniętej), ale nawet pozwalając programowi działać przez całą noc, poddałem się. Nie mogę zrozumieć, czy to ja nie opisuję problemu w efektywny sposób, czy to mój komputer wymaga poważnych ulepszeń, czy też problem jest po prostu zbyt trudny dla metod takich jak Reduce lub Solve. Jeśli sprawa jest druga, myślę, że jestem skazany ... Jakaś wskazówka dotycząca pozostałych dwóch? Dzięki za pomoc.

Moje próby i równanie:

f[x_]:=(1/(8 (p^2+x^2)^3))p^2 (-2 p^6+p^5 (4-8 x)+2 p^3 (3-8 x) x^2-6 p x^4+p^4 (80000+2 x-9 x^2)+2 p^2 x (40000+60000 x+x^2-5 x^3)-3 x^3 (-80000+40000 x+x^3)+(4 Sqrt[10] e x (p^2+x^2)^2 (2 p x^3+p^4 (-2+3 x)+2 p^3 x (-3+4 x)+x^2 (-80000+40000 x+x^3)+2 p^2 (40000-60000 x-x^2+2 x^3)))/Sqrt[-e p^2 (-1+x) x^2 (p^2+x^2)^2 (-40000+p^2+2 p x+x^2)])
Reduce[f[x]==0 && x>=0 &&p>=0 && e>=0,x,Reals] (*stuck running*)
Solve[f[x]==0 && x>=0 &&p>=0 && e>=0,x,Reals] (*stuck running*)

Odpowiedzi

2 CarlWoll Aug 18 2020 at 04:31

Jeśli przybliżona odpowiedź jest zadowalająca, możesz spróbować użyć NDSolveValue. Twoja funkcja:

f[x_] := (1/(8 (p^2+x^2)^3))p^2 (-2 p^6+p^5 (4-8 x)+2 p^3 (3-8 x) x^2-6 p x^4+p^4 (80000+2 x-9 x^2)+2 p^2 x (40000+60000 x+x^2-5 x^3)-3 x^3 (-80000+40000 x+x^3)+(4 Sqrt[10] e x (p^2+x^2)^2 (2 p x^3+p^4 (-2+3 x)+2 p^3 x (-3+4 x)+x^2 (-80000+40000 x+x^3)+2 p^2 (40000-60000 x-x^2+2 x^3)))/Sqrt[-e p^2 (-1+x) x^2 (p^2+x^2)^2 (-40000+p^2+2 p x+x^2)])

Aby użyć NDSolveValue, musimy znać warunek brzegowy. Na przykład, oto wartość xwhen pto 1:

x1 = x /. Block[{p=1}, First @ Solve[f[x] == 0, x]]

Korzeń [256006399839996 + 1023948800640 e + (255942399200020 - 3071999998080 e) # 1 + (511955203840004 + 2304217598880 e) # 1 ^ 2 + (1279846402079976 - 2048025605760 e) # 1 ^ 3 + (-9602799842) # 1 ^ 2 + (1279846402079976 - 2048025605760 e) # 1 ^ 3 + (-9602799842) 1 (192129617159615 + 4095897593600 e) # 1 ^ 5 + (-384151995680463 - 512486397600 e) # 1 ^ 6 + (-3455678391520375 + 2047846414080 e) # 1 ^ 7 + (2880427177039798 - 332788480 e) # 1 1024102385280 e) # 1 ^ 9 + (43199520578 + 256064008800 e) # 1 ^ 10 + (-14402879738 - 25598080 e) # 1 ^ 11 + (-359829 + 12802240 e) # 1 ^ 12 + 360087 # 1 ^ 13 + ( 9 + 160 e) # 1 ^ 14 + 9 # 1 ^ 15 &, 1]

Teraz możemy użyć NDSolveValue:

sol = NDSolveValue[
    {
    D[f[x[p,e]]==0, p], x[1, e] == x1},
    x,
    {p,.1,100},
    {e,.1,10000},
    MaxStepFraction->.0005,
    PrecisionGoal->10
]; //AbsoluteTiming

{19.2292, Null}

Sprawdź losowe próbki:

Block[{p = 50, e = 200}, f[sol[p, e]]]
Block[{p = 10, e = 2000}, f[sol[p, e]]]

6,42413 * 10 ^ -9

8,0893 * 10 ^ -9

Wyobrażanie sobie:

Plot3D[sol[p,e], {p,.1,100}, {e,.1,10000}]

2 MichaelE2 Aug 17 2020 at 04:15

FWIW, oto połowa rozwiązania: weź licznik, zracjonalizuj go tak, aby był wielomianem i znajdź pierwiastki. Pozostaje tylko wybrać te, które są pozytywne, kiedy są pi esą pozytywne. Ten krok zajmuje dużo czasu (jeśli w ogóle można to zrobić), z wyjątkiem sytuacji, gdy określone wartości liczbowe są podane dla pi e.

num = Simplify[ff, x >= 0 && p >= 0 && e >= 0] // Together // 
      Numerator // Simplify[#, x >= 0 && p >= 0 && e >= 0] & // 
    FactorList // #[[-1, 1]] & // Simplify
(*
p Sqrt[-e (-1 + x) (-40000 + p^2 + 2 p x + x^2)] (2 p^6 + 6 p x^4 + 
    p^5 (-4 + 8 x) + 2 p^3 x^2 (-3 + 8 x) + 
    p^4 (-80000 - 2 x + 9 x^2) + 3 x^3 (-80000 + 40000 x + x^3) + 
    2 p^2 x (-40000 - 60000 x - x^2 + 5 x^3)) - 
 4 Sqrt[10]
   e (2 p x^5 + 4 p^3 x^3 (-1 + 2 x) + p^6 (-2 + 3 x) + 
    2 p^5 x (-3 + 4 x) + p^2 x^3 (-80000 - 2 x + 5 x^2) + 
    x^4 (-80000 + 40000 x + x^3) + 
    p^4 (80000 - 120000 x - 4 x^2 + 7 x^3))
*)

Sprawdź, czy są dwa terminy (pierwszy oczywiście zawiera rodnik):

Length@num
(*  2  *)
rat = num*MapAt[-# &, num, 1] // Expand // Simplify
(*
e (p^2 (-1 + x) (-40000 + p^2 + 2 p x + x^2) (2 p^6 + 6 p x^4 + 
      p^5 (-4 + 8 x) + 2 p^3 x^2 (-3 + 8 x) + 
      p^4 (-80000 - 2 x + 9 x^2) + 3 x^3 (-80000 + 40000 x + x^3) + 
      2 p^2 x (-40000 - 60000 x - x^2 + 5 x^3))^2 + 
   160 e (2 p x^5 + 4 p^3 x^3 (-1 + 2 x) + p^6 (-2 + 3 x) + 
      2 p^5 x (-3 + 4 x) + p^2 x^3 (-80000 - 2 x + 5 x^2) + 
      x^4 (-80000 + 40000 x + x^3) + 
      p^4 (80000 - 120000 x - 4 x^2 + 7 x^3))^2)
*)
Solve[rat == 0, x]
(* <15 Root objects> *)

Te pierwiastki zawierają obce rozwiązania i wydaje się, że trzeba podstawić wartości liczbowe, aby parametry z nimi współpracowały. Jeśli takie podejście jest przydatne, być może zastąpienie parametrów w f[x]wynikowym równaniu i zajęcie się nim f[x] == 0mogłoby być lepsze.