lambda
rubbishemail at web.de
rubbishemail at web.de
Fri Apr 21 14:00:09 EDT 2006
Hello,
I need your help understanding lambda (and doing it a better way
without).
f = lambda x : x*x
# this is a list of functions
[f for y in range(1,5)]
[f for y in range(1,5)][0](2)
# returns 4, as expected
# ok now I want a list like
# [x^2, 2*x^2, 3*x^2,...]
[f*y for y in range(5)]
# this causes an unsupported operand type because it cannot multiply a
function and int
# the idea is now to give the definition of the multiplication of
functions and integers
# (f * c)(xx) := f(x)*c
[lambda xx: f(xx)*y for y in range(1,5)][0](1)
# returns 4
# I would expect 1*x*x = 1
# Where is my mistake and what would be the correct way to do this
without lambdas?
If you are interested in the reason for the code:
approxFunction gets a function and a list of x-values.
It computes func on these points and returns an interpolating
polynomial.
(this form of interpolation is often not stable, the code demonstrates
this)
def lagrangeBase(i, points):
"""returns the i-th lagrange polynomial on the nodes points (list
of xj)
In Symbolic notation the result should be
lagrangeBase(x)=\Pi_{j=0, j\ne i} (x-xj)/(xi-xj)
"""
xi = points[i]
# all points without xi
nums = [points[x] for x in range(len(points)) if x!=i ]
# unsupported operand type * for functions, therefore the lambda xx
# what is the proper way to do this ?
return reduce(lambda a,b: lambda xx: a(xx)*b(xx) , map(lambda xj:
lambda x: (x-xj)/(xi-xj), nums))
def approxFunction(func, points):
"""this returns an approximation polynomial for func on the nodes
points
\Sum lagrangeBase(x_i) func(x_i)
"""
funcValues = [func(x) for x in points]
# this is the problem mentioned above
# sumTerms = [lambda xx: lagrangeBase(i, points)(xx)*funcValues[i]
for i in range(len(points))]
# this works
sumTerms = map(lambda i: lambda xx : lagrangeBase(i, points)(xx) *
funcValues[i], range(len(points)))
return reduce(lambda a,b: lambda xx: a(xx)+b(xx), sumTerms)
I am using
Python 2.4.1 (#65, Mar 30 2005, 09:13:57) [MSC v.1310 32 bit (Intel)]
Type "copyright", "credits" or "license" for more information.
IPython 0.6.13 -- An enhanced Interactive Python.
Many thanks
Daniel
More information about the Python-list
mailing list