编写辛普森法则计算函数时遇TypeError:函数无法相加问题求助
解决辛普森法则函数参数导致的TypeError问题
问题根源
错误覆盖传入的函数参数
代码中f = lambda x : f这行是核心错误:它把传入的目标函数f替换成了一个返回自身的lambda表达式。执行f(x)时,得到的不是函数计算的数值结果,而是lambda函数对象本身,最终fvals变成了函数列表,自然无法执行加法运算。调用时传入的不是可调用函数
调用compSimpsons(0, 1, n, (1+exp(-2*x)))时,(1+exp(-2*x))是直接求值的表达式,此时x未定义,且就算定义了,传入的也是单个数值,而非可调用的函数对象。
修复步骤
1. 删除错误的lambda覆盖行
直接移除f = lambda x : f这一行,保留传入的原始函数f。
2. 正确传入目标函数
调用时必须传入可调用的函数对象,两种方式可选:
- 使用lambda表达式直接传入:
compSimpsons(0, 1, n, lambda x: 1 + exp(-2*x)) - 提前定义函数再传入:
def target_func(x): return 1 + exp(-2*x) compSimpsons(0, 1, n, target_func)
3. 可选优化:用numpy向量化操作提升效率
借助numpy的向量化特性,直接对整个endpts数组调用函数,替代列表推导:
fvals = f(endpts)
生成的numpy数组在后续求和等操作中效率更高。
修复后的完整代码
# Imports from numpy import sum, exp, linspace def compSimpsons(a, b, n, f): endpts = linspace(a, b, n+1) # 生成区间端点 fvals = f(endpts) # 向量化计算函数值 h = (b - a) / n h4 = h ** 4 h5 = h ** 5 sum_even = sum(fvals[2:(n-1):2]) sum_odd = sum(fvals[1::2]) Sn = (h/3) * (fvals[0] + fvals[-1] + 2 * sum_even + 4 * sum_odd) result_actual = 1.5 - 0.5 * exp(-2) print("%5g | %.16f | %.16f | %.16f | %.16f" % (n, h4, h5, Sn, abs(Sn - result_actual))) # 正确调用示例 for n in range(2, 41, 2): compSimpsons(0, 1, n, lambda x: 1 + exp(-2*x))
内容的提问来源于stack exchange,提问作者delon15
相关产品推荐
相关产品推荐

