# A parametric plot with branches for which restricting the range with xmin, xmax doesn't work

Hi The following plot

var('t')
parametric_plot( (8*(6+t)/(t^2-16), 2*(8+ 3 *t)/(t^2-16)), (t, -6, 6),xmin=-3,xmax=3,detect_poles=True)


has three branches. 1) For some reason, the plot is not correct. Also

var('t')
parametric_plot( (8*(6+t)/(t^2-16), 2*(8+ 3 *t)/(t^2-16)), (t, -6, 6),xmin=-3,xmax=3,ymin=-3,ymax=3)


fails. 2)How to plot the branches in different colors? 3) Can I add a point moved by a cursor when t increases, like with the Mathematica command Manipulate? Or make an animation to show how a point traverses the three branches?

edit retag close merge delete

Sort by » oldest newest most voted

For some reason, the plot is not correct.

You mean that xmin and xmax are not honored ? See Trac#16686 and the ticket-chain referenced...

Workaround :

sage: def ininterval(x,l,u):return float(x) if x>l and x<u else float("NaN")
sage: plot([lambda t:ininterval(8*(6+t)/(t^2-16),-3,3),lambda t:ininterval(2*(8+ 3 *t)/(t^2-16),-3,3)], (t,-6,6), axes_labels=["x","y"], parametric=True)
verbose 0 (3839: plot.py, generate_plot_points) WARNING: When plotting, failed to evaluate function at 130 points.
verbose 0 (3839: plot.py, generate_plot_points) Last error message: 'Unable to compute f(6.0)'
Launched png viewer for Graphics object consisting of 2 graphics primitives


has three branches.

Nope.

What are the possible values of x and y for $t\in[-6~6]$ ? An analytical solution is possible by solving x and y for t then solving the inequations for $t\in|-5~6]$, but is somewhat painful... A graphical solution is easier to grasp :

sage: plot([lambda t:ininterval(8*(6+t)/(t^2-16),-30,30),lambda t:ininterval(2*(8+ 3 *t)/(t^2-16),-30,30)], (t,-6,6), axes_labels=["t",""], legend_label=["x","y"])+plot([-3, 3],(-6,6),color=["green","red"])
verbose 0 (3839: plot.py, generate_plot_points) WARNING: When plotting, failed to evaluate function at 14 points.
verbose 0 (3839: plot.py, generate_plot_points) Last error message: 'Unable to compute f(4.325615967306306)'
Launched png viewer for Graphics object consisting of 8 graphics primitives


The most limiting variable is x, which is positive and <3 for t>-6, t> -9/2 approximately, and slightly superior to -3 for t>-3, t<0 approximately.

How to plot the branches in different colors ?

The painful analytical solution I studiously avoided above is necessary to define the different regions; the color= argument can then be built around this definition (left tothe reader as an exercise;-)...

EDIT : after addition of another question...

A static version of your chronogram could be :

var("t")
fx(t)=8*(6+t)/(t^2-16)
fy(t)=2*(8+ 3 *t)/(t^2-16)
def ininterval(x,l,u):return float(x) if x>l and x<u else float("NaN")
P=plot([lambda t:ininterval(fx(t),-3,3), lambda t:ininterval(fy(t),-3,3)],
(t,-6,6), axes_labels=["x","y"], parametric=True)
Pts=[]
T=[]
xmin=P.xmin()
xmax=P.xmax()
ymin=P.ymin()
ymax=P.ymax()
for t in srange(-6,6.1,0.1):
px=fx(t)
py=fy(t)
if px>=xmin and px<=xmax and py>=xmin and py<=ymax:
Pts+=[(px,py)]
T+=[text("%4.1f"%t,(px,py),
vertical_alignment="bottom",
horizontal_alignment="left",
color="black")]
sage: show(P+points(Pts)+sum(T))
Launched png viewer for Graphics object consisting of 43 graphics primitives


An animated/interactive version is left to the reader of the documentation as an exercise...

HTH,

more

Thanks for the fixup of parametricplot ! indeed the three branches appear only after enlarging the t range to say -8,8, and indeed, before doing animations, I should start with static version :)
One more question : why doesn't just composing ininterval(fx(t),-3,3)" , without lambda t: , work? I know what lambda does, but is there also a way to use the syntax of the composition of functions?

( 2021-12-08 07:40:47 +0200 )edit