You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写辛普森法则计算函数时遇TypeError:函数无法相加问题求助

解决辛普森法则函数参数导致的TypeError问题

问题根源

  1. 错误覆盖传入的函数参数
    代码中f = lambda x : f这行是核心错误:它把传入的目标函数f替换成了一个返回自身的lambda表达式。执行f(x)时,得到的不是函数计算的数值结果,而是lambda函数对象本身,最终fvals变成了函数列表,自然无法执行加法运算。

  2. 调用时传入的不是可调用函数
    调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 06:20:52