La mejor manera de resolver una ecuación no lineal paramétrica estúpidamente complicada con reducir / resolver, etc.

Aug 16 2020

Tengo una función paramétrica no lineal que es literalmente una pesadilla. Sé que las raíces existen, son reales y los dos parámetros p,eson positivos. Lo que esperaba de mathica era obtener una solución (en forma de raíz, no de forma cerrada) pero incluso dejando que el programa funcionara toda la noche me rendí. No puedo entender si soy yo quien enmarca el problema de una manera no eficiente, es mi PC la que necesita actualizaciones serias o el problema que es simplemente demasiado difícil para métodos como Reducir o Resolver. Si el caso es el último, supongo que estoy condenado ... ¿Alguna pista sobre los otros dos? Gracias por la ayuda.

Mis intentos y la ecuación:

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*)

Respuestas

2 CarlWoll Aug 18 2020 at 04:31

Si está satisfecho con una respuesta aproximada, puede intentar usar NDSolveValue. Tu función:

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)])

Para usarlo NDSolveValue, necesitamos conocer una condición de límite. Por ejemplo, aquí está el valor de xwhen pes 1:

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

Raíz [256006399839996 + 1023948800640 e + (255942399200020 - 3071999998080 e) # 1 + (511955203840004 + 2304217598880 e) # 1 ^ 2 + (1279846402079976 - 2048025605760 e) # 1 ^ 3 + (-99340 + 10241684239 e) (192129617159615 + 4095897593600 e) # 1 ^ 5 + (-384151995680463 - 512486397600 e) # 1 ^ 6 + (-3455678391520375 + 2047846414080 e) # 1 ^ 7 + (2880427177039798 - 332788480 + (-1) # 1 ^ 256243 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]

Ahora podemos usar 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, nulo}

Verifique algunas muestras aleatorias:

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

Visualización:

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

2 MichaelE2 Aug 17 2020 at 04:15

FWIW, aquí hay media solución: toma el numerador, racionalízalo para que sea un polinomio y encuentra las raíces. Lo que queda por hacer es seleccionar los que son positivos cuando py eson positivos. Este paso lleva mucho tiempo (si es que se puede realizar), excepto cuando se dan valores numéricos específicos a py 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))
*)

Compruebe que hay dos términos (el primero que obviamente contiene el radical):

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> *)

Estas raíces contienen soluciones extrañas, y parece necesario sustituir valores numéricos por los parámetros para trabajar con ellos. Si tal enfoque es útil, entonces quizás sea mejor sustituir los parámetros f[x]y tratar con la ecuación resultante f[x] == 0.