Parametryzacje i wykresy uwikłane#

W tym pliku omówimy podstawy generowania wymiernych parametryzacji krzywych.

Wykres parametryczny może być generowany w SageMath za pomocą komendy parametric_plot.

Do narysowania wykresu funkcji uwikłanej służy komenda implicit_plot.

#Równanie okręgu x^2+y^2=1 oraz hiperboli x^2-y^2=1, y^2-x^2=1 i dwóch lini y^2=x^2
x,y,t=var('x,y,t')
lieq=[x^2+y^2-1==0,x^2-y^2-1==0,x^2-y^2==0,-x^2+y^2-1==0]
sum([implicit_plot(eq,(x,-2,2),(y,-2,2)) for eq in lieq])
_images/a3d1111dabd0ce2e1ade93b037952aec3a752f3a13208cf2eaf5e06b3d4e227c.png

Okrąg \(x^2+y^2=1\)#

Do sparametryzowania okręgu przeprowadzamy przez punkt \((1,0)\) pęk prostych z nachyleniem \(t\) i przechodzących przez zadany punkt.

a,b=var('a,b')
print(solve([x==1,y==0,a*x+b==y],a,b,y,x))
t=var('t')
print(solve([x^2+y^2==1,t*x-t==y],x,y))
[
[a == r1, b == -r1, y == 0, x == 1]
]
[
[x == 1, y == 0],
[x == (t^2 - 1)/(t^2 + 1), y == -2*t/(t^2 + 1)]
]
parametric_plot(((t^2 - 1)/(t^2 + 1),-2*t/(t^2 + 1)),(t,-10,10),figsize=[3,3],color='red')
_images/a726f3ca7f43afe9eeafcfd1f9fb7660382f8837de1f461ef5a2fd5e702f9cac.png
r=var('r')
sum([parametric_plot((r*(t^2 - 1)/(t^2 + 1),r*-2*t/(t^2 + 1)),(t,-10,10),
                     figsize=[3,3],color=(r/10,0,1-r/10)) for r in srange(0,10,0.1)])
_images/7d994619109eb843511a2c2beafdceff9189ab9958e314252d4f5833d8eaaff3.png

Kubika ostrzowa \(y^2=x^3\)#

implicit_plot(y^2==x^3,(x,-2,2),(y,-2,2))
_images/ea9d086409a7f37df484afc36d64cc461b38212955d95947ae3131404fc48ba2.png

Parametryzujemy pękiem prostych przechodzących przez punkt \((0,0)\) i wsp. nachylenia \(t\).

t=var('t')
solve([y^2==x^3,y==x*t],x,y)
[[x == t^2, y == t^3], [x == 0, y == 0]]
#inna parametryzacja (przechodząca przez inny punkt) y^2==x^3
p=(4,8)
(y-(a*x+b)).subs({x:4,y:8})
-4*a - b + 8
solve(-4*a - b + 8,b)
[b == -4*a + 8]
solve([y^2==x^3,y==t*x+(-4*t + 8)],x,y) #this does not lead to a rational parametriozation
[[x == 1/2*t^2 - 1/2*sqrt(t^2 + 4*t - 12)*(t - 2) - 2, y == 1/2*t^3 - 1/2*sqrt(t^2 + 4*t - 12)*(t^2 - 2*t) - 6*t + 8], [x == 1/2*t^2 + 1/2*sqrt(t^2 + 4*t - 12)*(t - 2) - 2, y == 1/2*t^3 + 1/2*sqrt(t^2 + 4*t - 12)*(t^2 - 2*t) - 6*t + 8], [x == 4, y == 8]]
parametric_plot((t^2,t^3),(t,-1,1))
_images/b5168f1611191782596e03c0a93af55e072796154cbf6b3616c6a7473d5a9c19.png

Kubika węzłowa \(y^2=x^2(x+1)\)#

implicit_plot(y^2==x^2*(x+1),(x,-2,2),(y,-2,2))
_images/1cd805fb8ac25e81f0731c0204f1dda2a1670195ba85ffd87988504dd134f266.png
t=var('t')
solve([y^2==x^2*(x+1),y==x*t],x,y)
[[x == t^2 - 1, y == t^3 - t], [x == 0, y == 0]]
#tacnode
implicit_plot(2*x^4 - 3*x^2*y + y^4 - 2*y^3 + y^2,(x,-2,2),(y,-2,2))
_images/9295c41c5507c6a9cf7c7a32f4cf95362d194cec94a9ed18ae6a00691103d4d3.png
(2*x^4 - 3*x^2*y + y^4 - 2*y^3 + y^2).subs({y:x*t}).factor()
(t^4*x^2 - 2*t^3*x + t^2 - 3*t*x + 2*x^2)*x^2
solve(t^4*x^2 - 2*t^3*x + t^2 - 3*t*x + 2*x^2,x)
[x == 1/2*(2*t^3 - sqrt(12*t^2 + 1)*t + 3*t)/(t^4 + 2), x == 1/2*(2*t^3 + sqrt(12*t^2 + 1)*t + 3*t)/(t^4 + 2)]
#12*t^2 + 1==c^2
#wybierz na start, t=0,c=1
c,r=var('c,r')
#pęl prostych c==t*r+1
(12*t^2 + 1-c^2).subs({c:t*r+1}).factor()
-(r^2*t + 2*r - 12*t)*t
solve(r^2*t + 2*r - 12*t,t)
[t == -2*r/(r^2 - 12)]
(2*x^4 - 3*x^2*y + y^4 - 2*y^3 + y^2).subs({y:x*(-2*r/(r^2 - 12))}).factor()
2*(r^4*x + 2*r^3 - 32*r^2*x - 24*r + 288*x)*(r^4*x + r^3 - 16*r^2*x - 12*r + 72*x)*x^2/(r^2 - 12)^4
solve(r^4*x + r^3 - 16*r^2*x - 12*r + 72*x,x)
[x == -(r^3 - 12*r)/(r^4 - 16*r^2 + 72)]
#znajdź współrzędną y
(x*(-2*r/(r^2 - 12))).subs({x:-(r^3 - 12*r)/(r^4 - 16*r^2 + 72)}).factor()
2*r^2/(r^4 - 16*r^2 + 72)
parametric_plot((-(r^3 - 12*r)/(r^4 - 16*r^2 + 72),2*r^2/(r^4 - 16*r^2 + 72)),(r,-30,30))
_images/5018543cf0e97c12500b7ce7508ae3afe6528763b435d20491abe67820cd5aa2.png

Lemniskata Bernoulliego \((x^2+y^2)^2=2(x^2-y^2)\)#

implicit_plot((x^2+y^2)^2==2*(x^2-y^2),(x,-2,2),(y,-2,2))
_images/e6926645a8d8551ec0db38bbe5aef0d034faee6f450f1ad429433ebd77c91fe5.png
t=var('t')
solve([(x^2+y^2)^2==2*(x^2-y^2),y==x*t],x,y)
[[x == -sqrt(-2*t^2 + 2)/(t^2 + 1), y == -sqrt(-2*t^2 + 2)*t/(t^2 + 1)], [x == sqrt(-2*t^2 + 2)/(t^2 + 1), y == sqrt(-2*t^2 + 2)*t/(t^2 + 1)], [x == 0, y == 0]]

Otrzymana parametryzacja nie jest wymierna! Zamienimy ją w parametryzację wymierna zastępując pierwiastek stosownym wyrażeniem.

c=var('c')
implicit_plot(-2*t^2 + 2==c^2,(t,-2,2),(c,-2,2))
_images/cb1e59c096e2cc29e994d2426557e9a65f7e85e7e92d06c099864b1b18cd5c17.png

Parametryzujemy elipsę prostymi \(c=r t-r\)

r,t,c=var('r,t,c')
solve([-2*t^2 + 2==c^2,c==r*t-r],t,c)
[[t == 1, c == 0], [t == (r^2 - 2)/(r^2 + 2), c == -4*r/(r^2 + 2)]]

Podstawiamy \(t=t(r)\)

x,y,r=var('x,y,r')
pretty_print(solve([(x^2+y^2)^2==2*(x^2-y^2),y==x*((r^2 - 2)/(r^2 + 2))],x,y))

Parametryzacja 1

solve([(x^2+y^2)^2==2*(x^2-y^2),y==x*((r^2 - 2)/(r^2 + 2))],x,y)[0]
[x == 2*(r^3 + 2*r)/(r^4 + 4), y == 2*(r^3 - 2*r)/(r^4 + 4)]
parametric_plot((2*(r^3 + 2*r)/(r^4 + 4),2*(r^3 - 2*r)/(r^4 + 4)),(r,0,5),figsize=[3,3])

Parametryzacja 2

solve([(x^2+y^2)^2==2*(x^2-y^2),y==x*((r^2 - 2)/(r^2 + 2))],x,y)[1]
parametric_plot((-2*(r^3 + 2*r)/(r^4 + 4),-2*(r^3 - 2*r)/(r^4 + 4)),(r,0,5),figsize=[3,3])
#wykres "uzupełnia się", gdy r zbliża się do +- nieskończonosci
parametric_plot((-2*(r^3 + 2*r)/(r^4 + 4),-2*(r^3 - 2*r)/(r^4 + 4)),(r,-10,10),figsize=[3,3])
expr1=(-2*(r^3 + 2*r)/(r^4 + 4));
print (-2*(r^3 + 2*r)/(r^4 + 4)).limit(r=oo)
print (-2*(r^3 - 2*r)/(r^4 + 4)).limit(r=oo)
print (-2*(r^3 + 2*r)/(r^4 + 4)).limit(r=-oo)
print (-2*(r^3 - 2*r)/(r^4 + 4)).limit(r=-oo)
#genus krzywej jest 0 wtw krzywa posiada wymierną parametryzację

Aff.<x,y>=AffineSpace(QQ,2)
S1=Aff.curve([(x^2+y^2)^2-2*(x^2-y^2)])
#Formuła Plueckera
S1.genus()
E1=Aff.curve([y^2-(x^3+1)])
E1.genus()
#to równanie y^2=x^3+1 nie ma wymiernej parametryzacji!