Python中插值函数绕Y轴旋转的体积计算及逆函数求解
问题解答
一、怎么求逆函数g(y)
你用的是线性插值interp1d,要得到逆函数其实很简单——直接把x和y的位置互换,再做一次线性插值就行。不过有个前提:原函数f(x)必须是单调的,不然一个y会对应多个x,逆函数就不是单值的,这种情况得考虑横截面的对称性或者分段处理。
具体代码实现:
# 先对y值排序,避免插值出错(如果原f(x)单调,yvals应该本身就是单调的,排序是保险操作) sorted_indices = np.argsort(yvals) sorted_y = yvals[sorted_indices] sorted_x = xvals[sorted_indices] # 创建逆插值函数g(y),也就是x关于y的函数 g = interpolate.interp1d(sorted_y, sorted_x, kind='linear')
拿到g(y)后,就能代入积分公式算体积了:
# 确定y的上下限 a = np.min(yvals) b = np.max(yvals) # 定义被积函数 def integrand(y): return np.pi * (g(y))**2 # 计算积分得到体积 volume, error = quad(integrand, a, b, limit=200) print(f"绕Y轴旋转的体积: {volume},误差: {error}")
二、更省心的计算方法:壳层法(圆柱壳法)
其实完全不用求逆函数,用壳层法计算绕Y轴旋转的体积反而更简单,尤其是当f(x)不单调或者逆函数不好处理的时候。
壳层法的公式是:
$V = 2\pi \int_{x=0}^{x=10} x \cdot f(x) dx$
这里x是圆柱壳的半径,f(x)是壳的高度,积分后乘以2π就是体积。
这个方法直接用你已经得到的插值函数f(x),不用折腾逆函数,哪怕横截面不是单调的也能直接处理。
代码实现:
# 定义壳层法的被积函数 def shell_integrand(x): return 2 * np.pi * x * f(x) # 计算积分,x的范围是0到10(你的x定义域) volume_shell, error_shell = quad(shell_integrand, 0, xvals[-1], limit=200) print(f"壳层法计算的体积: {volume_shell},误差: {error_shell}")
几点注意
- 如果你的横截面不是单调的(比如一个y对应多个x),逆函数法得分段:把数据集拆成单调递增和递减的部分,分别求逆后计算积分再相加;但壳层法不用这么麻烦,直接对x积分就行。
- 记得给
interp1d加上fill_value="extrapolate"参数,避免x超出原数据范围时报错:f = interpolate.interp1d(xvals, yvals, fill_value="extrapolate")
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

