Thanks a lot, Nils, for your quick and detailed reply during XMas! It's working fine. A bit of background of my question:: I am working on a Math repetitorium for high school math for prospective university students which makes systematic use of Sage. But there is no time (and students are not motivated) for a systematic introduction into Sage, therefore the concept is to introduce Sage syntax step-by-step as needed, so I am looking always for the most simple solution. In fact, what I like most with Sage is that one can do many thigs with simple commands. Ingo
Am Montag, 26. Dezember 2016 15:55:56 UTC+1 schrieb Nils Bruin: > > On Monday, December 26, 2016 at 2:55:16 AM UTC-8, Ingo Dahn wrote: >> >> Hi, >> the following code works in SageCell if I remove the argument of the >> anonymous function and uncomment line 3. >> >> @interact >> def _(f=('$f$',x^2)): >> # f(x)=x^2 >> x0=1 >> def tangent(g,z): >> return derivative(g,x)(z)*(x-z)+g(z) >> pf=plot(f,-5,5) >> t=tangent(g=f,z=x0) >> pt=plot(t,-5,5) >> show(pf+pt) >> >> But in this form I get the deprecation warning >> >> sagemathcell.py:8: DeprecationWarning: Substitution using function-call >> syntax and unnamed arguments is deprecated and will be removed from a future >> release of Sage; you can use named arguments instead, like EXPR(x=..., y=...) >> See http://trac.sagemath.org/5930 for details. >> t=tangent(g=f,z=x0) >> >> >> None of my experiments after reading related posts helped. >> >> Any hints? >> >> Ingo >> >> > The input parameter as set by f=('$f',x^2) makes f the *expression* x^2. > When > > t=tangent(g=f,z=x0) > > gets executed, you end up evaluating f(1) and derivative(f,x)(1), which > trigger the warning. You could avoid this by sticking with expressions all > the way and using "named" substitution instead of the deprecated evaluation > syntax: > > def tangent(g,z): > return derivative(g,x)(x=z)*(x-z)+g(x=z) > > Note that no generality is lost, since you're hardcoding the name with > respect to which you take the derivative anyway. For your purposes, this is > probably the easiest solution: just don't use "functions" and stick with > "expressions". > > Alternatively, you can turn "f" into a properly defined one argument > function: > > def _(f_in=('$f$',x^2)): > f=f_in(x) > ... > > and then your original works properly. > > The specification of your "tangent" function gets a bit funny then, > though: its input parameter "g" should be a one argument function, and the > argument should be "x". > > Writing a "tangent" function that takes as input a one argument function > and returns the corresponding tangent line as a one argument function is a > little more work, but can be done too: > > from sage.symbolic.operators import FDerivativeOperator > def tangent(g,z): > der_g=FDerivativeOperator(g,[0]) > T=der_g(z)*(x-z)+g(z) > return T.function(x) > > @interact > def _(f_in=('$f$',x^2)): > f=f_in.function(x) > x0=1 > pf=plot(f,-5,5) > t=tangent(g=f,z=x0) > pt=plot(t,-5,5,color="red") > show(pf+pt) > > -- You received this message because you are subscribed to the Google Groups "sage-support" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-support+unsubscr...@googlegroups.com. To post to this group, send email to sage-support@googlegroups.com. Visit this group at https://groups.google.com/group/sage-support. For more options, visit https://groups.google.com/d/optout.