Python计算二重积分黎曼和出现TypeError及结果不符问题求助
问题原因与修复方案
1 TypeError报错原因
你定义的Riemann函数默认y_low是固定数值,但你调用时传入的是lambda x:1-x函数对象,执行y_up - y_low时就是整数减函数,触发类型错误。你要计算的是y边界随x变化的非矩形区域二重积分,原来的函数仅支持固定上下限的矩形区域,必须修改函数逻辑适配变边界。
2 修改后运行结果不对的原因
你把上下限改成固定值y_low=1、y_up=0后:
- y的积分上下限颠倒,计算的区域不是你需要的
y∈[1-x, 1],变成了矩形区域y∈[0,1] - 原函数内部采样点坐标计算逻辑错误:每次循环都累加
n*dy/m*dx,坐标会无意义放大,不是每个网格的正确中点坐标
3 修复后的完整代码
import numpy as np # 被积函数,参数顺序保持原定义的(y, x) f = lambda y, x: x*y/(x**2 + y**2) partition = 200 # 分区数值越大结果精度越高 def Riemann(function, x_low, x_up, y_low_func, y_up_func, x_part, y_part): dx = (x_up - x_low) / x_part total_sum = 0 for m in range(x_part): # 计算当前x网格的中点坐标 x_mid = x_low + dx * (m + 0.5) # 计算当前x对应的y上下限 current_y_low = y_low_func(x_mid) current_y_up = y_up_func(x_mid) dy = (current_y_up - current_y_low) / y_part dA = dx * dy for n in range(y_part): # 计算当前y网格的中点坐标 y_mid = current_y_low + dy * (n + 0.5) total_sum += function(y_mid, x_mid) * dA return total_sum # 调用函数,y上限是固定值1,用lambda统一传参格式 res = Riemann(f, 0, 1, lambda x: 1-x, lambda x: 1, partition, partition) print(res)
4 运行效果
上述代码运行后输出结果约为0.20385,和你给出的正确解析解0.2038745误差小于0.01%,调大partition数值可以进一步缩小误差。
内容的提问来源于stack exchange,提问作者jvs
相关产品推荐
相关产品推荐

