使用Sympy plot_implicit绘制球形水箱水位隐式方程时显示异常
解决Sympy plot_implicit绘制球形水箱水位曲线的空白问题
我来帮你排查下为啥你的绘图总是空白或者显示异常——主要是两个关键问题,一个是语法错误,另一个是容易忽略的单位统一问题:
1. 函数调用的括号语法错误
你写的代码里,plot_implicit的括号闭合位置错了,把t和h的范围参数放到了函数调用的外面。正确的写法应该是把方程和所有范围参数都放在plot_implicit的括号内:
# 错误写法(括号位置错误) plot_implicit(Eq(-pi/3*h**3 + pi*R*h**2 + I*t - 4/3*pi*R**3, 0)), (t, 0, 5000), (h, 0, 2)) # 正确写法 plot_implicit(Eq(-pi/3*h**3 + pi*R*h**2 + I*t - 4/3*pi*R**3, 0), (t, 0, 5000), (h, 0, 2))
原来的错误会让范围参数被当成独立的表达式,plot_implicit只能使用默认的极小绘图范围,自然看不到曲线。
2. 单位不统一导致数值范围严重偏差
这是更核心的问题:你的隐式方程里,体积相关项(比如4/3*pi*R**3)的单位是立方米,但你设置的I=1升/秒是升的单位——1升=0.001立方米,这就导致I*t的数值比实际体积小了1000倍!
举个例子,水箱总容积是4/3*pi*1³≈4.188立方米,按1升/秒的速率排水,总时间应该是约4188秒,但你用I=1代入方程的话,I*t在t=5000时才是5(单位是升),也就是0.005立方米,和其他项的量级差了三个数量级,方程根本不可能在你设定的范围内满足,所以绘图自然看不到曲线。
修正后的完整代码
把I转换成立方米每秒,同时修正语法问题:
from sympy import plot_implicit, Eq, symbols, pi R = 1 # 水箱半径(米) I = 0.001 # 排水速率(立方米/秒,1升/秒=0.001m³/s) t, h = symbols('t h') # 定义隐式方程 water_level_eq = Eq(-pi/3 * h**3 + pi * R * h**2 + I * t - 4/3 * pi * R**3, 0) # 绘制曲线,t的范围对应总排水时间(约4188秒) plot_implicit( water_level_eq, (t, 0, 4200), (h, 0, 2), title="球形水箱水位高度随时间变化", xlabel="时间 t(秒)", ylabel="水位高度 h(米)" )
额外验证
你可以手动验证初始条件:当t=0时,h=2R=2米,代入方程计算结果为0,符合满水状态;当t≈4188秒时,h=0,代入方程也能满足,说明方程本身是正确的。
内容的提问来源于stack exchange,提问作者Neph
相关产品推荐
相关产品推荐

