Comment puis-je augmenter la précision du résultat de RegionPlot pour cette fonction?

Aug 17 2020

J'ai cette fonction

f := 1024 (1 - (9 x^2)/4)^2 Cosh[(π x)/
    3]^2 Sinh[π x]^2 (8 (16 - 216 x^2 + 
        81 x^4 + (4 + 9 x^2)^2 Cosh[(2 π x)/3]) Sinh[π x]^2 - 
     1/256 ((4 + 9 x^2)^2 Sinh[x (2 π - y)] + 
        2 (64 - 144 x^2 + (4 + 9 x^2)^2 Cosh[(2 π x)/3]) Sinh[
          x y] - 9 (4 - 3 x^2)^2 Sinh[x (2 π + y)])^2);

Je veux voir dans quelle plage de variables, cette fonction est négative. Utilisation de RegionPlot

RegionPlot[ f < 0, {y, 2, 2.25}, {x, 1.15, 1.17}, 
 WorkingPrecision -> 30, PlotPoints -> 50]

J'obtiens ce complot

Ensuite, quand je diminue les plages comme

RegionPlot[ 
 f < 0, {y, Rationalize[2.1299849, 0], Rationalize[2.1299855, 0]}, {x,
   Rationalize[1.15970110, 0], Rationalize[1.15970113, 0]}, 
 WorkingPrecision -> 90, PlotPoints -> 150]

j'obtiens

Ici, il n'est pas clair si les parties bleues se touchent ou non. Comment puis-je entrer plus en détail pour voir si la partie bleue est continue ou non?

Réponses

3 MichaelE2 Aug 17 2020 at 20:00

Solution de traçage la plus simple

ContourPlot[f,
 {y, Rationalize[2.1299849, 0],  Rationalize[2.1299855, 0]},
 {x, Rationalize[1.15970110, 0], Rationalize[1.15970113, 0]},
 ContourShading ->
  {RGBColor[0.368417, 0.506779, 0.709798, 0.4], None},
 Contours -> {{0}},
 PlotPoints -> 25, WorkingPrecision -> 32,
 Method -> {"TransparentPolygonMesh" -> True}
 ]

Mais les intrigues ne sont pas toujours très convaincantes, étant conçues pour ne donner qu'une idée approximative de ce qui se passe.

Solution analytique

Comme je l'ai montré dans cette réponse à une question similaire , nous pouvons montrer analytiquement qu'il y a un nœud:

jac = D[f, {{x, y}}];
cpsol = FindRoot[jac == {0, 0}, {{x, 1.15}, {y, 2.13}}, 
   WorkingPrecision -> 50];
cpt = {x, y} /. cpsol
f /. cpsol      (* shows cpt is on curve *)
f /. N[cpsol]   (* show numerical noise at cpt is substantial *)
(*
  {1.1597011139328870007473930523093558428367204499142, 
   2.1299852028277681162523681416937176426970454505325}
  0.*10^-36
  0.0119859
*)

Apprivoisement RegionPlot

RegionPlota évolué depuis l'introduction de la Regionfonctionnalité. RegionPlotsemble utiliser cette fonctionnalité pour générer le tracé, et il ignore l' WorkingPrecisionoption, qui est évidente à partir du bruit numérique. Je pense que la fonctionnalité de région est basée sur la fonctionnalité FEM, qui n'est disponible qu'en précision machine. (De même, l'option MaxRecursionsemble caduque.)

Voici un moyen de contrôler la précision de travail:

ClearAll[fff];
fff[x0_Real, y0_Real] := 
  Block[{x = SetPrecision[x0, Infinity], 
    y = SetPrecision[y0, Infinity]},
   N[
    1024 (1 - (9 x^2)/4)^2 Cosh[(π x)/
        3]^2 Sinh[π x]^2 (8 (16 - 216 x^2 + 
          81 x^4 + (4 + 9 x^2)^2 Cosh[(2 π x)/
             3]) Sinh[π x]^2 - 
       1/256 ((4 + 9 x^2)^2 Sinh[x (2 π - y)] + 
           2 (64 - 144 x^2 + (4 + 9 x^2)^2 Cosh[(2 π x)/3]) Sinh[
             x y] - 9 (4 - 3 x^2)^2 Sinh[x (2 π + y)])^2),
    $MachinePrecision]
   ];

RegionPlot[
 fff[x, y] < 0,
 {y, Rationalize[2.1299849, 0],  Rationalize[2.1299855, 0]},
 {x, Rationalize[1.15970110, 0], Rationalize[1.15970113, 0]},
 PlotPoints -> 100]

Mais une hirondelle ne fait pas un été.

2 Hausdorff Aug 17 2020 at 20:05

Puisque vous souhaitez savoir si les deux régions se rencontrent, vous pouvez également utiliser ContourPlot, qui semble un peu plus stable:

ContourPlot[f == 0, {y, 2.1299849, 2.1299855}, {x, 1.15970110, 1.15970113}, 
    WorkingPrecision -> 40, MaxRecursion -> 6]