t,y,z=var('t,y,z')
@interact
def smer_der(FUN=input_box('x*y',label="f(x,y)=",type=str),bod=input_grid(1, 2, default=[-1,-1],label="$[x_0,y_0]$"),vektor=input_grid(1, 2, default=[1,-3],label="$(u_1,u_2)$"),z_hr = input_grid(1, 2, default=[-9,9], label='Osa z pro rovinu určenou vektorem $(u_1,u_2)$ a bodem $[x_0,y_0]$'),t_hr = range_slider(-20, 20, 1, default=(-1,1), label='Parametr t'),x_hr = range_slider(-20, 20, 1, default=(-3,3), label='Osa x'),y_hr = range_slider(-20, 20, 1, default=(-3,3), label='Osa y')):
f=sage_eval('lambda x,y: ' + FUN)
bod3d = vector(bod[0]+[0])
bod = bod3d[0:2]
x0=bod[0];y0=bod[1]
vek3d = vector(vektor[0]+[0])
vektor = vek3d[0:2]
u1=vektor[0];u2=vektor[1]
z3d = vector(z_hr[0]+[0])
z_hr = z3d[0:2]
zmin=z_hr[0];zmax=z_hr[1]
tmin=t_hr[0];tmax=t_hr[1]
xmin=x_hr[0];xmax=x_hr[1]
ymin=y_hr[0];ymax=y_hr[1]
Gf=plot3d(f(x,y), (x,xmin,xmax),(y,ymin,ymax))
H0=point([x0,y0,f(x0,y0)],color='yellow',size=5)
rovinau=parametric_plot3d([x0+u1*t,y0+u2*t,z],(t,tmin,tmax),(z,zmin,zmax), opacity=0.25, color='red')
pruniku=parametric_plot3d([x0+u1*t,y0+u2*t,f(x0+u1*t,y0+u2*t)],(t,tmin,tmax),color='black')
fu=limit((f(x0+u1*t,y0+u2*t)-f(x0,y0))/t,t=0)
teu=parametric_plot3d([x0+u1*t,y0+u2*t,f(x0,y0)+t*fu],(t,tmin,tmax), color='green')
pretty_print( "$f_u$= ",fu.trig_reduce())
show(Gf+rovinau+pruniku+teu+H0)