Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

Github repo cloud-examples: https://github.com/sagemath/cloud-examples

Views: 8060
License: MIT
%auto typeset_mode(True, display=False)

Real projective plane RP2\mathbb{RP}^2

This worksheet demonstrates a few capabilities of SageManifolds (version 0.8) in computations regarding the real projective plane.

It is released under the GNU General Public License version 3.

(c) Eric Gourgoulhon, Michal Bejger (2015)

The corresponding worksheet file can be downloaded from here


Constructing the manifold

We start by declaring the real projective plane as a 2-dimensional differentiable manifold:

 
RP2 = Manifold(2, 'RP^2', r'\mathbb{RP}^2') ; RP2
RP2\mathbb{RP}^2

Then we provide RP2\mathbb{RP}^2 with some atlas. A minimal atlas on RP2\mathbb{RP}^2 must have at least three charts. Such an atlas is easy to infer from the common interpretation of RP2\mathbb{RP}^2 as the set of lines of R3\mathbb{R}^3 passing through the origin (x,y,z)=(0,0,0)(x,y,z)=(0,0,0). Let U1U_1 be the subset of lines that are not contained in the plane z=0z=0; this is an open set of RP2\mathbb{RP}^2, so that we declare it as:

U1 = RP2.open_subset('U_1') ; U1
U1U_1

Any line in U1U_1 is uniquely determined by its intersection with the plane z=1z=1. The Cartesian coordinates (x,y,1)(x,y,1) of the intersection point lead to an obvious coordinate system (x1,y1)(x_1,y_1) on U1U_1 by setting (x1,y1)=(x,y)(x_1,y_1)=(x,y):

X1.<x1,y1> = U1.chart() ; X1
(U1,(x1,y1))\left(U_1,(x_{1}, y_{1})\right)

Note that since we have not specified any coordinate range in the arguments of chart(), the range of (x1,y1)(x_1,y_1) is R2\mathbb{R}^2.

Similarly, let U2U_2 be the set of lines through the origin of R3\mathbb{R}^3 that are not contained in the plane x=0x=0. Any line in U2U_2 is uniquely determined by its intersection (1,y,z)(1,y,z) with the plane x=1x=1, leading to coordinates (x2,y2)=(y,z)(x_2,y_2)=(y,z) on U2U_2:

U2 = RP2.open_subset('U_2') X2.<x2,y2> = U2.chart() ; X2
(U2,(x2,y2))\left(U_2,(x_{2}, y_{2})\right)

Finally, let U3U_3 be the set of lines through the origin of R3\mathbb{R}^3 that are not contained in the plane y=0y=0. Any line in U3U_3 is uniquely determined by its intersection (x,1,z)(x,1,z) with the plane y=1y=1, leading to coordinates (x3,y3)=(z,x)(x_3,y_3)=(z,x) on U3U_3:

U3 = RP2.open_subset('U_3') X3.<x3,y3> = U3.chart() ; X3
(U3,(x3,y3))\left(U_3,(x_{3}, y_{3})\right)

We declare that the union of the three (overlapping) open domains U1U_1, U2U_2 and U3U_3 is RP2\mathbb{RP}^2:

RP2.declare_union(U1.union(U2), U3) U1.union(U2).union(U3)
RP2\mathbb{RP}^2

Finally, to fully specify the manifold RP2\mathbb{RP}^2, we give the transition maps between the various charts; the transition map between the charts X1=(U1,(x1,y1))(U_1,(x_1,y_1)) and X2=(U2,(x2,y2))(U_2,(x_2,y_2)) is defined on the set U12:=U1U2U_{12} := U_1 \cap U_2 of lines through the origin of R3\mathbb{R}^3 that are neither contained in the plane x=0x=0 (x1=0x_1=0 in U1U_1) nor contained in the plane z=0z=0 (y2=0y_2=0 in U2U_2):

X1_to_X2 = X1.transition_map(X2, (y1/x1, 1/x1), intersection_name='U_{12}', \ restrictions1= x1!=0, restrictions2= y2!=0) X1_to_X2.display()
{x2=y1x1y2=1x1\left\{\begin{array}{lcl} x_{2} & = & \frac{y_{1}}{x_{1}} \\ y_{2} & = & \frac{1}{x_{1}} \end{array}\right.

The inverse of this transition map is easily computed by Sage:

X2_to_X1 = X1_to_X2.inverse() X2_to_X1.display()
{x1=1y2y1=x2y2\left\{\begin{array}{lcl} x_{1} & = & \frac{1}{y_{2}} \\ y_{1} & = & \frac{x_{2}}{y_{2}} \end{array}\right.

The transition map between the charts X1=(U1,(x1,y1))(U_1,(x_1,y_1)) and X3=(U3,(x3,y3))(U_3,(x_3,y_3)) is defined on the set U13:=U1U3U_{13} := U_1 \cap U_3 of lines through the origin of R3\mathbb{R}^3 that are neither contained in the plane y=0y=0 (y1=0y_1=0 in U1U_1) nor contained in the plane z=0z=0 (x3=0x_3=0 in U3U_3):

X1_to_X3 = X1.transition_map(X3, (1/y1, x1/y1), intersection_name='U_{13}', \ restrictions1= y1!=0, restrictions2= x3!=0) X1_to_X3.display()
{x3=1y1y3=x1y1\left\{\begin{array}{lcl} x_{3} & = & \frac{1}{y_{1}} \\ y_{3} & = & \frac{x_{1}}{y_{1}} \end{array}\right.
X3_to_X1 = X1_to_X3.inverse() X3_to_X1.display()
{x1=y3x3y1=1x3\left\{\begin{array}{lcl} x_{1} & = & \frac{y_{3}}{x_{3}} \\ y_{1} & = & \frac{1}{x_{3}} \end{array}\right.

Finally, the transition map between the charts X2=(U2,(x2,y2))(U_2,(x_2,y_2)) and X3=(U3,(x3,y3))(U_3,(x_3,y_3)) is defined on the set U23:=U2U3U_{23} := U_2 \cap U_3 of lines through the origin of R3\mathbb{R}^3 that are neither contained in the plane y=0y=0 (x2=0x_2=0 in U2U_2) nor contained in the plane x=0x=0 (y3=0y_3=0 in U3U_3):

X2_to_X3 = X2.transition_map(X3, (y2/x2, 1/x2), intersection_name='U_{23}', \ restrictions1= x2!=0, restrictions2= y3!=0) X2_to_X3.display()
{x3=y2x2y3=1x2\left\{\begin{array}{lcl} x_{3} & = & \frac{y_{2}}{x_{2}} \\ y_{3} & = & \frac{1}{x_{2}} \end{array}\right.
X3_to_X2 = X2_to_X3.inverse() X3_to_X2.display()
{x2=1y3y2=x3y3\left\{\begin{array}{lcl} x_{2} & = & \frac{1}{y_{3}} \\ y_{2} & = & \frac{x_{3}}{y_{3}} \end{array}\right.

At this stage, the manifold RP2\mathbb{RP}^2 is fully constructed. It has been provided with the following atlas:

RP2.atlas()
[(U1,(x1,y1))\left(U_1,(x_{1}, y_{1})\right), (U2,(x2,y2))\left(U_2,(x_{2}, y_{2})\right), (U3,(x3,y3))\left(U_3,(x_{3}, y_{3})\right), (U12,(x1,y1))\left(U_{12},(x_{1}, y_{1})\right), (U12,(x2,y2))\left(U_{12},(x_{2}, y_{2})\right), (U13,(x1,y1))\left(U_{13},(x_{1}, y_{1})\right), (U13,(x3,y3))\left(U_{13},(x_{3}, y_{3})\right), (U23,(x2,y2))\left(U_{23},(x_{2}, y_{2})\right), (U23,(x3,y3))\left(U_{23},(x_{3}, y_{3})\right)]

Note that, in addition to the three chart we have defined, the atlas comprises subcharts on the intersection domains U12U_{12}, U13U_{13} and U23U_{23}. These charts can be obtained by the method restrict():

U12 = U1.intersection(U2) U13 = U1.intersection(U3) U23 = U2.intersection(U3) X1.restrict(U12)
(U12,(x1,y1))\left(U_{12},(x_{1}, y_{1})\right)
X1.restrict(U12) is RP2.atlas()[3]
True\mathrm{True}

Non-orientability of RP2\mathbb{RP}^2

It is well known that RP2\mathbb{RP}^2 is not an orientable manifold. To illustrate this, let us make an attempt to construct a global non-vanishing 2-form ϵ\epsilon on RP2\mathbb{RP}^2. If we succeed, this would provide a volume form and RP2\mathbb{RP}^2 would be orientable. We start by declaring ϵ\epsilon as a 2-form on RP2\mathbb{RP}^2:

eps = RP2.diff_form(2, name='eps', latex_name=r'\epsilon') print eps
2-form 'eps' on the 2-dimensional manifold 'RP^2'

We set the value of ϵ\epsilon on domain U1U_1 to be dx1dy1\mathrm{d}x_1 \wedge \mathrm{d}y_1 by demanding that the component ϵ01\epsilon_{01} of ϵ\epsilon with respect to coordinates (x1,y1)(x_1,y_1)  is one, as follows:

e1 = X1.frame() ; e1
(U1,(x1,y1))\left(U_1 ,\left(\frac{\partial}{\partial x_{1} },\frac{\partial}{\partial y_{1} }\right)\right)
eps[e1,0,1] = 1 eps.display(e1)
ϵ=dx1dy1\epsilon = \mathrm{d} x_{1}\wedge \mathrm{d} y_{1}

If we ask for the expression of ϵ\epsilon in terms of the coframe (dx2,dy2)(\mathrm{d}x_2, \mathrm{d}y_2) associated with the chart X2 on U12=U1U2U_{12} = U_1\cap U_2, we get

eps.display(X2.frame().restrict(U12), chart=X2.restrict(U12))
ϵ=1y23dx2dy2\epsilon = \frac{1}{y_{2}^{3}} \mathrm{d} x_{2}\wedge \mathrm{d} y_{2}

Now, the complement of U12U_{12} in U2U_2 is defined by y2=0y_2=0. The above expression shows that it is not possible to extend smoothly ϵ\epsilon to the whole domain U2U_2. We conclude that starting from dx1dy1\mathrm{d}x_1\wedge\mathrm{d}y_1 on U1U_1, it is not possible to get a regular non-vanishing 2-form on RP2\mathbb{RP}^2. This of course follows from the fact that RP2\mathbb{RP}^2 is not orientable.

Steiner map (Roman surface)

Let us first define R3\mathbb{R}^3 as a 3-dimensional manifold, with a single-chart atlas (Cartesian coordinates Y):

R3 = Manifold(3, 'R^3', r'\mathbb{R}^3') Y.<x,y,z> = R3.chart()

The Steiner map is a map RP2R3\mathbb{RP}^2 \rightarrow \mathbb{R}^3 defined as follows:

Phi = RP2.diff_mapping(R3, {(X1,Y): [y1/(1+x1^2+y1^2), x1/(1+x1^2+y1^2), x1*y1/(1+x1^2+y1^2)], \ (X2,Y): [x2*y2/(1+x2^2+y2^2), y2/(1+x2^2+y2^2), x2/(1+x2^2+y2^2)], \ (X3,Y): [x3/(1+x3^2+y3^2), x3*y3/(1+x3^2+y3^2), y3/(1+x3^2+y3^2)]}, \ name='Phi', latex_name=r'\Phi') Phi.display()
Φ:RP2R3on U1:(x1,y1)(x,y,z)=(y1x12+y12+1,x1x12+y12+1,x1y1x12+y12+1)on U2:(x2,y2)(x,y,z)=(x2y2x22+y22+1,y2x22+y22+1,x2x22+y22+1)on U3:(x3,y3)(x,y,z)=(x3x32+y32+1,x3y3x32+y32+1,y3x32+y32+1)\begin{array}{llcl} \Phi:& \mathbb{RP}^2 & \longrightarrow & \mathbb{R}^3 \\ \mbox{on}\ U_1 : & \left(x_{1}, y_{1}\right) & \longmapsto & \left(x, y, z\right) = \left(\frac{y_{1}}{x_{1}^{2} + y_{1}^{2} + 1}, \frac{x_{1}}{x_{1}^{2} + y_{1}^{2} + 1}, \frac{x_{1} y_{1}}{x_{1}^{2} + y_{1}^{2} + 1}\right) \\ \mbox{on}\ U_2 : & \left(x_{2}, y_{2}\right) & \longmapsto & \left(x, y, z\right) = \left(\frac{x_{2} y_{2}}{x_{2}^{2} + y_{2}^{2} + 1}, \frac{y_{2}}{x_{2}^{2} + y_{2}^{2} + 1}, \frac{x_{2}}{x_{2}^{2} + y_{2}^{2} + 1}\right) \\ \mbox{on}\ U_3 : & \left(x_{3}, y_{3}\right) & \longmapsto & \left(x, y, z\right) = \left(\frac{x_{3}}{x_{3}^{2} + y_{3}^{2} + 1}, \frac{x_{3} y_{3}}{x_{3}^{2} + y_{3}^{2} + 1}, \frac{y_{3}}{x_{3}^{2} + y_{3}^{2} + 1}\right) \end{array}

Φ\Phi is a topological immersion of RP2\mathbb{RP}^2 into R3\mathbb{R}^3, but it is not a smooth immersion (contrary to the Apéry map below): its differential is not injective at (x1,y1)=(0,1)(x_1,y_1)=(0,1) and (x1,y1)=(1,0)(x_1,y_1)=(1,0). The image of Φ\Phi is a self-intersecting surface of R3\mathbb{R}^3, called the Roman surface:

g1 = parametric_plot3d(Phi.expr(X1,Y), (x1,-10,10), (y1,-10,10), plot_points=[100,100]) g2 = parametric_plot3d(Phi.expr(X2,Y), (x2,-10,10), (y2,-10,10), plot_points=[100,100]) g3 = parametric_plot3d(Phi.expr(X3,Y), (x3,-10,10), (y3,-10,10), plot_points=[100,100]) show(g1+g2+g3)
3D rendering not yet implemented
gX1 = X1.plot(Y, mapping=Phi, max_value=16, nb_values=24, plot_points=100) gX2 = X2.plot(Y, mapping=Phi, max_value=16, nb_values=24, plot_points=100, color='green') gX3 = X3.plot(Y, mapping=Phi, max_value=16, nb_values=24, plot_points=100, color='blue') show(gX1)
3D rendering not yet implemented
show(gX2)
3D rendering not yet implemented
show(gX3)
3D rendering not yet implemented
show(gX1+gX2+gX3)
3D rendering not yet implemented

Apéry map (Boy surface)

The Apéry map [Apéry, Adv. Math. 61, 185 (1986)] is a smooth immersion Ψ:RP2R3\Psi: \mathbb{RP}^2 \rightarrow \mathbb{R}^3. In terms of the charts X1, X2, X3 introduced above, it is defined as follows:

fx = ((2*x^2-y^2-z^2)*(x^2+y^2+z^2)+2*y*z*(y^2-z^2)+z*x*(x^2-z^2)+x*y*(y^2-z^2))/2 ; fx
12(y2z2)xy+12(x2z2)xz+(y2z2)yz+12(2x2y2z2)(x2+y2+z2)\frac{1}{2} \, {\left(y^{2} - z^{2}\right)} x y + \frac{1}{2} \, {\left(x^{2} - z^{2}\right)} x z + {\left(y^{2} - z^{2}\right)} y z + \frac{1}{2} \, {\left(2 \, x^{2} - y^{2} - z^{2}\right)} {\left(x^{2} + y^{2} + z^{2}\right)}
fy = sqrt(3)/2*((y^2-z^2)*(x^2+y^2+z^2)+z*x*(z^2-x^2)+x*y*(y^2-x^2)) ; fy
123((x2y2)xy+(x2z2)xz(x2+y2+z2)(y2z2))-\frac{1}{2} \, \sqrt{3} {\left({\left(x^{2} - y^{2}\right)} x y + {\left(x^{2} - z^{2}\right)} x z - {\left(x^{2} + y^{2} + z^{2}\right)} {\left(y^{2} - z^{2}\right)}\right)}
fz = (x+y+z)*((x+y+z)^3/4+(y-x)*(z-y)*(x-z)) ; fz
14((x+y+z)3+4(xy)(xz)(yz))(x+y+z)\frac{1}{4} \, {\left({\left(x + y + z\right)}^{3} + 4 \, {\left(x - y\right)} {\left(x - z\right)} {\left(y - z\right)}\right)} {\left(x + y + z\right)}
a = sqrt(1+x1^2+y1^2) fx1 = fx.subs(x=x1/a, y=y1/a, z=1/a).simplify_full() fy1 = fy.subs(x=x1/a, y=y1/a, z=1/a).simplify_full() fz1 = fz.subs(x=x1/a, y=y1/a, z=1/a).simplify_full()
a = sqrt(1+x2^2+y2^2) fx2 = fx.subs(x=1/a, y=x2/a, z=y2/a).simplify_full() fy2 = fy.subs(x=1/a, y=x2/a, z=y2/a).simplify_full() fz2 = fz.subs(x=1/a, y=x2/a, z=y2/a).simplify_full()
a = sqrt(1+x3^2+y3^2) fx3 = fx.subs(x=y3/a, y=1/a, z=x3/a).simplify_full() fy3 = fy.subs(x=y3/a, y=1/a, z=x3/a).simplify_full() fz3 = fz.subs(x=y3/a, y=1/a, z=x3/a).simplify_full()
Psi = RP2.diff_mapping(R3, {(X1,Y): [fx1, fy1, fz1], (X2,Y): [fx2, fy2, fz2], \ (X3,Y): [fx3, fy3, fz3]}, name='Psi', latex_name=r'\Psi') Psi.display()
Ψ:RP2R3on U1:(x1,y1)(x,y,z)=(2x14+(x1+2)y13y14+x13+(x122)y12+x12(x1+2)y1x112(x14+y14+2(x12+1)y12+2x12+1),3x13y13x12y123x1y133y14+3x13+3x123x1+32(x14+y14+2(x12+1)y12+2x12+1),x14+y14+6(x12+2x1+1)y12+8y13+6x12+4(2x13+3x12+3x1)y1+8x1+14(x14+y14+2(x12+1)y12+2x12+1))on U2:(x2,y2)(x,y,z)=(x24+(2x2+1)y23+y24x23+(2x22+x21)y22x22(2x23+1)y222(x24+y24+2(x22+1)y22+2x22+1),3x243y24+3x23+3y23+3x223y223x23y22(x24+y24+2(x22+1)y22+2x22+1),x24+y24+6(x22+2x2+1)y22+8y23+6x22+4(2x23+3x22+3x2)y2+8x2+14(x24+y24+2(x22+1)y22+2x22+1))on U3:(x3,y3)(x,y,z)=(x34x3y332y34+2x33(x32+1)y32+2x32+(x33+x321)y32x3+12(x34+y34+2(x32+1)y32+2x32+1),3x34+(3x3+3)y33+(3x323)y32(3x33+3)y332(x34+y34+2(x32+1)y32+2x32+1),x34+y34+6(x32+2x3+1)y32+8y33+6x32+4(2x33+3x32+3x3)y3+8x3+14(x34+y34+2(x32+1)y32+2x32+1))\begin{array}{llcl} \Psi:& \mathbb{RP}^2 & \longrightarrow & \mathbb{R}^3 \\ \mbox{on}\ U_1 : & \left(x_{1}, y_{1}\right) & \longmapsto & \left(x, y, z\right) = \left(\frac{2 \, x_{1}^{4} + {\left(x_{1} + 2\right)} y_{1}^{3} - y_{1}^{4} + x_{1}^{3} + {\left(x_{1}^{2} - 2\right)} y_{1}^{2} + x_{1}^{2} - {\left(x_{1} + 2\right)} y_{1} - x_{1} - 1}{2 \, {\left(x_{1}^{4} + y_{1}^{4} + 2 \, {\left(x_{1}^{2} + 1\right)} y_{1}^{2} + 2 \, x_{1}^{2} + 1\right)}}, -\frac{\sqrt{3} x_{1}^{3} y_{1} - \sqrt{3} x_{1}^{2} y_{1}^{2} - \sqrt{3} x_{1} y_{1}^{3} - \sqrt{3} y_{1}^{4} + \sqrt{3} x_{1}^{3} + \sqrt{3} x_{1}^{2} - \sqrt{3} x_{1} + \sqrt{3}}{2 \, {\left(x_{1}^{4} + y_{1}^{4} + 2 \, {\left(x_{1}^{2} + 1\right)} y_{1}^{2} + 2 \, x_{1}^{2} + 1\right)}}, \frac{x_{1}^{4} + y_{1}^{4} + 6 \, {\left(x_{1}^{2} + 2 \, x_{1} + 1\right)} y_{1}^{2} + 8 \, y_{1}^{3} + 6 \, x_{1}^{2} + 4 \, {\left(2 \, x_{1}^{3} + 3 \, x_{1}^{2} + 3 \, x_{1}\right)} y_{1} + 8 \, x_{1} + 1}{4 \, {\left(x_{1}^{4} + y_{1}^{4} + 2 \, {\left(x_{1}^{2} + 1\right)} y_{1}^{2} + 2 \, x_{1}^{2} + 1\right)}}\right) \\ \mbox{on}\ U_2 : & \left(x_{2}, y_{2}\right) & \longmapsto & \left(x, y, z\right) = \left(-\frac{x_{2}^{4} + {\left(2 \, x_{2} + 1\right)} y_{2}^{3} + y_{2}^{4} - x_{2}^{3} + {\left(2 \, x_{2}^{2} + x_{2} - 1\right)} y_{2}^{2} - x_{2}^{2} - {\left(2 \, x_{2}^{3} + 1\right)} y_{2} - 2}{2 \, {\left(x_{2}^{4} + y_{2}^{4} + 2 \, {\left(x_{2}^{2} + 1\right)} y_{2}^{2} + 2 \, x_{2}^{2} + 1\right)}}, \frac{\sqrt{3} x_{2}^{4} - \sqrt{3} y_{2}^{4} + \sqrt{3} x_{2}^{3} + \sqrt{3} y_{2}^{3} + \sqrt{3} x_{2}^{2} - \sqrt{3} y_{2}^{2} - \sqrt{3} x_{2} - \sqrt{3} y_{2}}{2 \, {\left(x_{2}^{4} + y_{2}^{4} + 2 \, {\left(x_{2}^{2} + 1\right)} y_{2}^{2} + 2 \, x_{2}^{2} + 1\right)}}, \frac{x_{2}^{4} + y_{2}^{4} + 6 \, {\left(x_{2}^{2} + 2 \, x_{2} + 1\right)} y_{2}^{2} + 8 \, y_{2}^{3} + 6 \, x_{2}^{2} + 4 \, {\left(2 \, x_{2}^{3} + 3 \, x_{2}^{2} + 3 \, x_{2}\right)} y_{2} + 8 \, x_{2} + 1}{4 \, {\left(x_{2}^{4} + y_{2}^{4} + 2 \, {\left(x_{2}^{2} + 1\right)} y_{2}^{2} + 2 \, x_{2}^{2} + 1\right)}}\right) \\ \mbox{on}\ U_3 : & \left(x_{3}, y_{3}\right) & \longmapsto & \left(x, y, z\right) = \left(-\frac{x_{3}^{4} - x_{3} y_{3}^{3} - 2 \, y_{3}^{4} + 2 \, x_{3}^{3} - {\left(x_{3}^{2} + 1\right)} y_{3}^{2} + 2 \, x_{3}^{2} + {\left(x_{3}^{3} + x_{3}^{2} - 1\right)} y_{3} - 2 \, x_{3} + 1}{2 \, {\left(x_{3}^{4} + y_{3}^{4} + 2 \, {\left(x_{3}^{2} + 1\right)} y_{3}^{2} + 2 \, x_{3}^{2} + 1\right)}}, -\frac{\sqrt{3} x_{3}^{4} + {\left(\sqrt{3} x_{3} + \sqrt{3}\right)} y_{3}^{3} + {\left(\sqrt{3} x_{3}^{2} - \sqrt{3}\right)} y_{3}^{2} - {\left(\sqrt{3} x_{3}^{3} + \sqrt{3}\right)} y_{3} - \sqrt{3}}{2 \, {\left(x_{3}^{4} + y_{3}^{4} + 2 \, {\left(x_{3}^{2} + 1\right)} y_{3}^{2} + 2 \, x_{3}^{2} + 1\right)}}, \frac{x_{3}^{4} + y_{3}^{4} + 6 \, {\left(x_{3}^{2} + 2 \, x_{3} + 1\right)} y_{3}^{2} + 8 \, y_{3}^{3} + 6 \, x_{3}^{2} + 4 \, {\left(2 \, x_{3}^{3} + 3 \, x_{3}^{2} + 3 \, x_{3}\right)} y_{3} + 8 \, x_{3} + 1}{4 \, {\left(x_{3}^{4} + y_{3}^{4} + 2 \, {\left(x_{3}^{2} + 1\right)} y_{3}^{2} + 2 \, x_{3}^{2} + 1\right)}}\right) \end{array}

The image of Ψ\Psi is a self-intersecting surface of R3\mathbb{R}^3, called the Boy surface, after Werner Boy (1879-1914):

g1 = parametric_plot3d(Psi.expr(X1,Y), (x1,-10,10), (y1,-10,10), plot_points=[100,100]) g2 = parametric_plot3d(Psi.expr(X2,Y), (x2,-10,10), (y2,-10,10), plot_points=[100,100]) g3 = parametric_plot3d(Psi.expr(X3,Y), (x3,-10,10), (y3,-10,10), plot_points=[100,100]) show(g1+g2+g3)
3D rendering not yet implemented
gX1 = X1.plot(Y, mapping=Psi, nb_values=40, plot_points=100) gX2 = X2.plot(Y, mapping=Psi, nb_values=40, plot_points=100, color='green') gX3 = X3.plot(Y, mapping=Psi, nb_values=40, plot_points=100, color='blue')
show(gX1)
3D rendering not yet implemented
show(gX2)
3D rendering not yet implemented
show(gX3)
3D rendering not yet implemented
show(gX1+gX2+gX3)
3D rendering not yet implemented