Comment puis-je augmenter la précision du résultat de RegionPlot pour cette fonction?
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
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
RegionPlot
a évolué depuis l'introduction de la Region
fonctionnalité. RegionPlot
semble utiliser cette fonctionnalité pour générer le tracé, et il ignore l' WorkingPrecision
option, 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 MaxRecursion
semble 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é.
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]