Python中的迭代函数生成

2024-05-03 05:43:12 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下想法:我想生成一个函数序列f_k, 并将它们存储在Python字典中。 举一个具体的例子

f_k(x)  = f_{k-1}(x) * sqrt(x)

这只是一个例子,我的问题更复杂,但这与我的问题无关。 因为在我的实际问题中f_{k-1}非常嘈杂并且包含舍入错误,所以我不想直接从f_{k-1}构建{},而是相反 我首先通过一个样条曲线近似来近似f_{k-1},然后从该样条曲线近似中确定{}。奇怪的是,这会导致一条错误消息,指出超过了最大递归深度。下面是一个代码示例:

^{pr2}$

这会导致错误

RecursionError: maximum recursion depth exceeded

我的问题一定与Python有关。它一定和interp1d的插值有关。 例如。如果我更换线路

spline_approx = lambda x: interp1d( args,fdict[k-1](args) )(x)

用一个塑料袋

coefs = np.polyfit(args,fdict[k-1](args),10) # polyfit coefficients
spline_approx = lambda x: np.polyval(coefs,x) # approximation of f_{k-1} 

代码运行良好。我怀疑问题的出现是因为fdict[k-1]不是直接求值的,而是作为引用传递的。但我如何解决这个问题呢?在


Tags: lambda函数错误npargs序列曲线例子
1条回答
网友
1楼 · 发布于 2024-05-03 05:43:12

引发RecursionError的那一行确实是:

spline_approx = lambda x: interp1d( args,fdict[k-1](args) )(x)

这行意味着spline_approx是给定x,返回{}在{}中求值的函数。在

由于interp1d返回要放入spline_approx中的函数,因此这一行可以简化为:

^{pr2}$

它将停止抛出RecursionError。在


为什么原始代码抛出RecursionError?在

在原始行中,interp1d(args, fdict[k-1](args))没有计算的,因为它在lambda表达式的内部。此计算推迟到调用lambda表达式。在

换句话说,每次从fdict调用函数时,前面所有的函数都必须计算interp1d(args, fdict[k-1](args))。问题是args是一个序列,因此fdict[k-1]被调用的次数与{}的元素相同。在

调用的数量当然是指数级的,因为每个函数都必须计算先例函数len(args)次。结果是RecursionError。在

另一方面,新表达式的值是interp1d(args, fdict[k-1](args))。在这个计算之后,对fdict[k]的调用将不再触发对fdict[k-1]的调用。在

相关问题 更多 >