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 [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sage-support.
For more options, visit https://groups.google.com/d/optout.