# Special-case a particular value of an interact slider

This slider seems to work perfectly with one exception: the line does not change aspect when z is exactly z1.

I wonder why? It is annoying since I would like to add some dashed lines and comments (labels, values...) in the case it is exactly at this value.

f(x) = (3/2) - (1/2)*x
g(x) = (11/2) - 2*x
h(x) = -1 + x
gr = plot(f(x), (x, 0, 3),thickness=1.5, color="#4b59ea",legend_label='$f(x)=\\frac{3}{2} - \\frac{1}{2}x$')
gr+= plot(g(x), (x, 0, 3),thickness=1.5, color="#e52411",legend_label='$g(x)=\\frac{11}{2} - 2x$')
gr+= plot(h(x), (x, 0, 3),thickness=1.5, color="#2ea012",legend_label='$h(x)=-1 + x$')
gr.axes_labels(['$x_1$','$x_2$'])
fs1=solve(f(x) == h(x), x)
fs2=solve(f(x) == g(x), x)
fs3=solve(f(x) == 0, x)
gs1=solve(g(x) == h(x), x)
gs2=solve(g(x) == f(x), x)
gs3=solve(g(x) == 0, x)
hs1=solve(h(x) == 0,x)
pint=[(0,f(0)),(fs1[0].rhs(),f(fs1[0].rhs())),(fs2[0].rhs(),f(fs2[0].rhs())),(fs3[0].rhs(),f(fs3[0].rhs())),(0,g(0)),(gs1[0].rhs(),g(gs1[0].rhs())),(gs2[0].rhs(),g(gs2[0].rhs())),
(gs3[0].rhs(),g(gs3[0].rhs())),(0,h(0)),(hs1[0].rhs(),h(hs1[0].rhs()))]
c=[circle(x, .05,fill=true,edgecolor='#ff9933', facecolor='#ff9933') for x in pint]
poly=polygon2d([(hs1[0].rhs(),h(hs1[0].rhs())),(fs1[0].rhs(),f(fs1[0].rhs())),(gs2[0].rhs(),g(gs2[0].rhs())),(gs3[0].rhs(),g(gs3[0].rhs()))],fill=true,rgbcolor=(.75,.75,.75))
show(pint)
z1=solve(f(gs2[0].rhs())==z - (0.3333) *gs2[0].rhs(),z)[0].rhs()
@interact
def _(z=slider(z1-(5*0.1),z1+(5*0.1),step_size=0.333333)):
if z!=z1:
zplot=plot(z - (0.3333) *x, (x, 0,5),color="#4b26ea",linestyle='-.')
show(sum(c)+gr+poly+zplot,figsize=8)
elif z==z1:
zplot=plot(z - (0.3333) *x, (x, 0,5),color="#4b26ea",linestyle='--')
show(sum(c)+gr+poly+zplot,figsize=8)

edit retag close merge delete

Sort by ยป oldest newest most voted

The test whether z == z1 is too sensitive for floating point values.

Replace it by an approximate equality test such as abs(z - z1) < 1e-2.

Here is a rewrite implementing that change (and a little polishing).

f(x) = (3/2) - (1/2)*x
g(x) = (11/2) - 2*x
h(x) = -1 + x
opt = {'thickness': 1.5}
xx = (x, 0, 3)
gr = plot(f(x), xx, color="#4b59ea", legend_label=fr'$y = f(x) = {latex(f(x))}$', **opt)
gr += plot(g(x), xx, color="#e52411", legend_label=fr'$y = g(x) = {latex(g(x))}$', **opt)
gr += plot(h(x), xx, color="#2ea012", legend_label=fr'$y = h(x) = {latex(h(x))}$', **opt)
gr.axes_labels(['$x_1$', '$x_2$'])
fs1 = solve(f(x) == h(x), x)
fs2 = solve(f(x) == g(x), x)
fs3 = solve(f(x) == 0, x)
gs1 = solve(g(x) == h(x), x)
gs2 = solve(g(x) == f(x), x)
gs3 = solve(g(x) == 0, x)
hs1 = solve(h(x) == 0, x)
xf = [0, fs1[0].rhs(), fs2[0].rhs(), fs3[0].rhs()]
xg = [0, gs1[0].rhs(), gs2[0].rhs(), gs3[0].rhs()]
xh = [0, hs1[0].rhs()]
pts = [(x, F(x)) for F, xF in [(f, xf), (g, xg), (h, xh)] for x in xF]
c = [circle(x, .05, fill=True, edgecolor='#ff9933', facecolor='#ff9933') for x in pts]
poly = polygon2d([(x, F(x))
for Fs, F in  [(hs1, h), (fs1, f), (gs2, g), (gs3, g)]
for x in [Fs[0].rhs()]],
fill=True, color=(.75, .75, .75))

# show(pts)

z1 = solve(f(gs2[0].rhs()) == x - 1/3 * gs2[0].rhs(), x)[0].rhs()
print(f'z1 = {z1} = {z1.n()}', flush=True)

@interact
def _(z=slider(z1 - 0.5, z1 + 0.5, step_size=1/30.)):
if (z - z1).abs() < 1e-8:  # consider z is at z1
zplot = plot(z - 1/3 * x, (x, 0, 5), color="#4b26ea", linestyle='--')
show(sum(c) + gr + poly + zplot, figsize=8)
else:
zplot = plot(z - 1/3 * x, (x, 0, 5), color="#4b26ea", linestyle='-.')
show(sum(c) + gr + poly + zplot, figsize=8)


Check the result on SageCell:

more