考虑以下想法:我想生成一个函数序列f_k
,
并将它们存储在Python字典中。
举一个具体的例子
f_k(x) = f_{k-1}(x) * sqrt(x)
这只是一个例子,我的问题更复杂,但这与我的问题无关。
因为在我的实际问题中f_{k-1}
非常嘈杂并且包含舍入错误,所以我不想直接从f_{k-1}
构建{f_{k-1}
,然后从该样条曲线近似中确定{
这会导致错误
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]
不是直接求值的,而是作为引用传递的。但我如何解决这个问题呢?在
引发
RecursionError
的那一行确实是:这行意味着}在{}中求值的函数。在
spline_approx
是给定x
,返回{由于
^{pr2}$interp1d
返回要放入spline_approx
中的函数,因此这一行可以简化为:它将停止抛出
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]
的调用。在相关问题 更多 >
编程相关推荐