理解教授提供的未注释SymPy示例代码运行逻辑
SymPy代码段运行逻辑解答
这段代码不是未完成的示例,所有方程组构建、求解、积分操作都会在运行时完整执行,没有隐藏的后台操作,只是缺少结果输出语句,导致普通脚本模式下运行看不到输出。
逐行运行逻辑如下:
from sympy import *:导入SymPy符号计算库的全部接口,为后续符号推导做准备。- 符号定义部分:
v = Function('v'):定义v为符号函数,对应物理意义是速度关于时间的函数t = Symbol('t',real=True,positive=True)、g = Symbol('g',real=True,positive=True)、D = Symbol('D',real=True,positive=True):分别定义时间、重力加速度、空气阻力系数为正实数类型的符号变量,和上方欧拉法数值仿真的物理量一一对应。
dsolve(Derivative(v(t),t)+g-D*v(t)**2,v(t)):这一行已经完成了微分方程的构建和求解:构建的方程为 $\frac{dv(t)}{dt} = Dv(t)^2 - g$,和欧拉法代码中加速度计算的物理规则完全一致,
dsolve会直接返回该一阶常微分方程的通解,结果保存在内存中,只是没有被赋值给变量、也没有被打印。-(sqrt(g)*tanh(sqrt(D*g)*t))/sqrt(D):这是手动代入初始条件v(0)=0(初始速度为0)得到的速度特解,代入t=0可验证tanh(0)=0,完全匹配初始条件,符号方向也和欧拉法中向上为正的坐标设定对齐。integrate(-(sqrt(g)*tanh(sqrt(D*g)*t))/sqrt(D),t):对得到的速度特解做不定积分,推导位移y关于时间t的解析表达式,对应欧拉法中迭代累加计算位移的步骤,区别是这里得到的是无近似误差的精确公式解,而非数值迭代的近似结果。
运行表现说明
- 如果你把这段代码保存为普通
.py脚本直接运行,所有计算都会正常执行完毕,但因为没有用print()包裹计算结果,终端不会显示任何输出,容易让人误以为代码没跑或者没写完。 - 如果你在Jupyter Notebook、IPython这类交互式环境中运行,这类环境会默认输出每个代码单元最后一行未赋值表达式的计算结果,你就能直接看到积分得到的位移解析解;如果给每一行计算语句都加
print(),在普通脚本里也能看到所有步骤的推导结果。 - 这段代码和上方注释的欧拉法代码是配套教学内容:前者是数值近似解法,后者是符号解析解法,是完整的对照示例,不存在未完成的部分。
内容的提问来源于stack exchange,提问作者user19252343
相关产品推荐
相关产品推荐

