Hi Jason,

Thanks a lot for that! This brings me back to the original problem. I 
expected plot and find_root to replace the variable with a float and 
call the function, but it does not seem to do that. For example, it 
would be nice if the following worked:

var('a b c d x dummy')
F = fast_float(a*x^3 + b*x^2 + c*x + d, 'a', 'b', 'c', 'd', 'x')
ff = lambda a,b,c,d,x: F(a,b,c,d,x)
plot(ff(a=1,b=2,c=3,d=4,x=dummy),(dummy,0,6))
     

Traceback (click to the left for traceback)
...
TypeError: a float is required

This works:
[ff(a=1,b=2,c=3,d=4,x=dummy) for dummy in srange(6)]

[4.0, 10.0, 26.0, 58.0, 112.0, 194.0]

Why don't plot and find_root just replace 'dummy' with a float and run 
ff just like in the list?

The example taken from your post:

ff = partial(lambda a,b,c,d,x: F(a,b,c,d,x), a=1,b=2,d=5,x=-2)
ff(c=3)
            
-1.0

plot(ff,(c,0,3))

verbose 0 (2949: plot.py, generate_plot_points) WARNING: When plotting,
failed to evaluate function at 400 points.
verbose 0 (2949: plot.py, generate_plot_points) Last error message:
'<lambda>() got multiple values for keyword argument 'a''

However, implicit calling works (the other example from  you post):

gg = partial(lambda a,b,c,d,x: F(a,b,c,d,x), 1,2,d=5,x=-2)
gg(3)
            
-1.0

plot(gg,-1,1)
<plots fine>

I hoped that the lambda function would provide a way for using 
fast_float with explicit variable calling, but it did not work out. Do 
you know of another way? This is especially important for find_root as 
it makes it sooo much faster.

Anyway, your suggestions helped a lot already and I can solve my current 
problems now.

Cheers,
Stan


Jason Grout wrote:
> Stan Schymanski wrote:
>   
>> Hi Jason,
>>
>> That's awesome, thanks a lot! I had a bit of trouble understanding the 
>> documentation of partial, but your example helped tremendously. This 
>> should definitely be included in any upcoming documentation on 
>> fast_float. As far as I understand, partial(F,1) just replaces the first 
>> variable in F by 1. If I define something like F = fast_float(a*x^3 + 
>> b*x^2 + c*x + d, 'a', 'b', 'c', 'd', 'x'), could I then use partial to 
>> replace a, b, d and x and leave c as a variable, or would I have to 
>> re-define F to take c as the last argument?
>>
>>     
>
> Apparently fast_float things don't take keyword arguments, so you have 
> to use a lambda function (that will take keyword arguments) to put 
> things in the right order.
>
> sage: var('a,b,c,d,x')
> (a, b, c, d, x)
> sage: F = fast_float(a*x^3 + b*x^2 + c*x + d, 'a', 'b', 'c', 'd', 'x')
> sage: ff=partial(lambda a,b,c,d,x: F(a,b,c,d,x), a=1,b=2,d=5,x=-2)
> sage: ff(c=3)
> -1.0
>
> alternatively, since arguments to gg (below) are just appended to the 
> non-keyword arguments, you can have one "hole" in the non-keyword 
> arguments.  To have more than this, you need to do something more special.
>
> sage: gg=partial(lambda a,b,c,d,x: F(a,b,c,d,x), 1,2,d=5,x=-2)
> sage: gg(3)
> -1.0
>
>
> It would be nice (and pretty straightforward to write) a partial 
> function that took a dictionary like:
>
> partial(f, {0: 10, 'x': 3, 2: 20})
>
> which would make a function that behaved like:
>
> f(10, *, 20, *args, x=3)
>
> (i.e., the keys above are the places in the non-keyword arguments; since 
> we don't have a value specified for the position 1 in the non-keyword 
> arguments, it is left blank.)  Then your example above would be 
> something like:
>
> sage: ff=partial(F, {0:1, 1: 2, 4: 5, 5: -2})
> sage: ff(3)
> -1.0
>
> Thanks,
>
> Jason
>
>
>
>
> >
>   


--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-support@googlegroups.com
To unsubscribe from this group, send email to 
sage-support-unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sage-support
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to