Skip to main content

complex - Getting an Accurate Transformed Region (Part II)


I asked earlier about transforming a set of curves and getting an accurate plot when a curve goes to infinity:


Getting an Accurate Transformed Region


Here is an example where a transformed region should be the upper half plane, but instead Mathematica gives a strange result:


$\cal R$ = Region bounded by the circles $$x^2+ \left(y-\frac{1}{2}\right)^2=\frac{1}{4} \, \textit{ and } \, x^2+\left(y-\frac{1}{4}\right)^2=\frac{1}{16}$$


p[\[Alpha]_] := x^2 + (y - \[Alpha])^2 - \[Alpha]^2; 

Q = (p[1/2] < 0) && (p[1/4] > 0);
\[ScriptCapitalR] = ImplicitRegion[Q, {x, y}];
a = Region[\[ScriptCapitalR], GridLines -> Automatic, Frame -> True];
aa = Region[RegionBoundary[\[ScriptCapitalR]],
BaseStyle -> RGBColor[.25, .25, .75]];
\[Tau] = Show[a, aa];

$f(z) = \frac{1}{z},$ and $\cal E$ is the transformed region $\cal R$ under the mapping $f(z)$.


f = Evaluate[{x/(x^2 + y^2), -(y/(x^2 + y^2))}] &;
\[ScriptCapitalE] = TransformedRegion[\[ScriptCapitalR], f];



b = Region[\[ScriptCapitalE], BaseStyle -> RGBColor[1, 0, 0, .7],
Frame -> True];
bb = Region[RegionBoundary[\[ScriptCapitalE]], BaseStyle -> RGBColor[.75, 0, 0],
FrameTicks -> {{None, Range[-4, 0]}, {Automatic, Automatic} }];
\[Upsilon] = Show[b, bb, PlotRange -> {{-3, 3}, {-3, 0}}, AspectRatio -> 1/2];

$g(z) = \exp \pi z, $ and $\cal M$ is the transformed region $\cal E$ under the mapping $g(z)$.


 g = Evaluate[{E^(\[Pi] x) Cos[\[Pi] y], E^(\[Pi] x) Sin[\[Pi] y]}] &;

\[ScriptCapitalM] = TransformedRegion[\[ScriptCapitalE], g];


c = Region[\[ScriptCapitalM], BaseStyle -> RGBColor[.75, .75, .75], Frame -> True];
cc = Region[RegionBoundary[\[ScriptCapitalM]],
BaseStyle -> RGBColor[.75, .1, .1],
FrameTicks -> {{None, Range[-4, 0]}, {Automatic, Automatic} }];
\[Phi] = Show[c, cc];

Plot $\cal R$, the region bounded by circles, $\cal E$, the image of $\cal R$ under the transformation $f(z)=\frac{1}{z}$, an infinite strip and $\cal M$, the image of $\cal R$ under the transformation $g(f(z))=\exp \left( \pi / z \right)$: should be the upper-half plane!



Here is Mathematica's rendition. Any ideas how to get a more accurate picture for $\cal M $?


 GraphicsRow[{\[Tau], \[Upsilon], \[Phi]}]

enter image description here


Another related question: Why is there some of the light blue color missing at the bottom of region $\cal R$? Any way to improve this?


UPDATE


@Ulrich, thank you for the suggestions you made in the comment. Some questions:


I. As you've suggested, I've changed Region[] to RegionPlot[]. Now, the first figure is fully filled in, but the figure is incomplete where the circles are tangent. Not sure why.


 p[\[Alpha]_] := x^2 + (y - \[Alpha])^2 - \[Alpha]^2;
Q = (p[1/2] <= 0) && (p[1/4] >= 0);

\[ScriptCapitalR] = ImplicitRegion[Q, {x, y}];
a = RegionPlot[\[ScriptCapitalR],
PlotStyle -> RGBColor[.25, .75, .25, .5]];
aa = RegionPlot[RegionBoundary[\[ScriptCapitalR]],
BoundaryStyle -> Directive[Thickness[.01], RGBColor[0, .5, 0]]];
\[Tau] = Show[a, aa]

enter image description here


II. I think that I understand why we need to use the syntax you suggest. We want to explictly define the functions in terms of two variables, rather than in terms of one input, a two-vector (a list of two elements)? Do we need to use Evaluate[]? I've used it because it appeared in one of the examples in the documentation, but is it necessary?


The function definition syntax works well on the first transformation:



 f = Function[{x, y}, Evaluate[{x/(x^2 + y^2), -(y/(x^2 + y^2))}]];
\[ScriptCapitalE] = TransformedRegion[\[ScriptCapitalR], f];

b = RegionPlot[\[ScriptCapitalE],
PlotStyle -> RGBColor[.85, .85, .85, .7]];
bb = RegionPlot[RegionBoundary[\[ScriptCapitalE]],
BoundaryStyle -> RGBColor[.5, .5, .5],
FrameTicks -> {{None, Range[-4, 0]}, {Automatic, Automatic} }];
\[Upsilon] =
Show[b, bb, PlotRange -> {{-3, 3}, {-3, 0}}, AspectRatio -> 1/2]


enter image description here


Plotting the two figures together in a graphics row causes the "inner meshes" to be visible. Why is this?


 GraphicsRow[{\[Tau], \[Upsilon]}]

enter image description here


These lines seem okay:


 g = Function[{x, y}, 
Evaluate[{E^(\[Pi] x) Cos[\[Pi] y], E^(\[Pi] x) Sin[\[Pi] y]}]];
\[ScriptCapitalM] = TransformedRegion[\[ScriptCapitalE], g];


Both of these lines cause errors:


 c = RegionPlot[\[ScriptCapitalM], 
PlotStyle -> RGBColor[.15, .15, .85, .7]];

cc = RegionPlot[RegionBoundary[\[ScriptCapitalM]],
BoundaryStyle -> RGBColor[0, 0, .75],
FrameTicks -> {{None, Range[-4, 0]}, {Automatic, Automatic} }];

UPDATE #2 (In response to comments)



In Mathematica 11.2.0.0, this code:


 \[ScriptCapitalM] = TransformedRegion[\[ScriptCapitalE], g];

c = RegionPlot[\[ScriptCapitalM],
PlotStyle -> RGBColor[.15, .15, .85, .7]];
cc = RegionPlot[RegionBoundary[\[ScriptCapitalM]],
BoundaryStyle -> Directive[Thickness[.01], RGBColor[0, 0, .5]],
FrameTicks -> {{None, Range[-4, 0]}, {Automatic, Automatic} }];

runs, but produces a huge triangle in the lower half plane.



enter image description here


This same code crashes in Mathematica 12.0.0.0.


The result is the same, with and without the use of Evaluate[].


In both versions of Mathematica (On Mac OS Version 10.14), the first transformation produces a strip, without that extra piece above it.


UPDATE #3


The method BoundaryMeshRegion[] works, but only if the region is first computed via TransformedRegion[].


 Needs@"NDSolve`FEM`";

Show[BoundaryMeshRegion@
ToBoundaryMesh[\[ScriptCapitalE],

MaxCellMeasure -> {"Length" -> 0.02}], Frame -> True,
PlotRange -> {{-3, 3}, {-3, 0}}, AspectRatio -> 1/2]

enter image description here




Comments

Popular posts from this blog

front end - keyboard shortcut to invoke Insert new matrix

I frequently need to type in some matrices, and the menu command Insert > Table/Matrix > New... allows matrices with lines drawn between columns and rows, which is very helpful. I would like to make a keyboard shortcut for it, but cannot find the relevant frontend token command (4209405) for it. Since the FullForm[] and InputForm[] of matrices with lines drawn between rows and columns is the same as those without lines, it's hard to do this via 3rd party system-wide text expanders (e.g. autohotkey or atext on mac). How does one assign a keyboard shortcut for the menu item Insert > Table/Matrix > New... , preferably using only mathematica? Thanks! Answer In the MenuSetup.tr (for linux located in the $InstallationDirectory/SystemFiles/FrontEnd/TextResources/X/ directory), I changed the line MenuItem["&New...", "CreateGridBoxDialog"] to read MenuItem["&New...", "CreateGridBoxDialog", MenuKey["m", Modifiers-...

How to thread a list

I have data in format data = {{a1, a2}, {b1, b2}, {c1, c2}, {d1, d2}} Tableform: I want to thread it to : tdata = {{{a1, b1}, {a2, b2}}, {{a1, c1}, {a2, c2}}, {{a1, d1}, {a2, d2}}} Tableform: And I would like to do better then pseudofunction[n_] := Transpose[{data2[[1]], data2[[n]]}]; SetAttributes[pseudofunction, Listable]; Range[2, 4] // pseudofunction Here is my benchmark data, where data3 is normal sample of real data. data3 = Drop[ExcelWorkBook[[Column1 ;; Column4]], None, 1]; data2 = {a #, b #, c #, d #} & /@ Range[1, 10^5]; data = RandomReal[{0, 1}, {10^6, 4}]; Here is my benchmark code kptnw[list_] := Transpose[{Table[First@#, {Length@# - 1}], Rest@#}, {3, 1, 2}] &@list kptnw2[list_] := Transpose[{ConstantArray[First@#, Length@# - 1], Rest@#}, {3, 1, 2}] &@list OleksandrR[list_] := Flatten[Outer[List, List@First[list], Rest[list], 1], {{2}, {1, 4}}] paradox2[list_] := Partition[Riffle[list[[1]], #], 2] & /@ Drop[list, 1] RM[list_] := FoldList[Transpose[{First@li...

plotting - How to draw lines between specified dots on ListPlot?

I would like to create a plot where I have unconnected dots and some connected. So far, I have figured out how to draw the dots. My code is the following: ListPlot[{{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4,13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full] I have thought using ListLinePlot command, but I don't know how to specify to the command to draw only selected lines between the dots. Do have any suggestions/hints on how to do that? Thank you. Answer One possibility would be to use Epilog with Line : ListPlot[ {{1, 1}, {2, 2}, {3, 3}, {4, 4}, {1, 4}, {2, 5}, {3, 6}, {4, 7}, {1, 7}, {2, 8}, {3, 9}, {4, 10}, {1, 10}, {2, 11}, {3, 12}, {4, 13}, {2.5, 7}}, Ticks -> {{1, 2, 3, 4}, None}, AxesStyle -> Thin, TicksStyle -> Directive[Black, Bold, 12], Mesh -> Full, Epilog -> { Line[ ...