SymPy中无需预知最终单位将物理常量表达式转为数值的解决方案
SymPy物理常量表达式快速取数值的解决方案
问题原因
直接调用
evalf()、simplify()无法得到数值的核心原因是:SymPy的physics.units模块下的物理常量同时存储了数值和单位量纲两个属性,符号运算阶段不会自动代入常量数值,也不会自动做单位归一化,必须显式完成单位转换后才能提取纯数值。
最简解决方法
你可以直接调用convert_to方法将表达式转换为对应物理量的目标单位,再除以单位本身即可得到纯数值,示例代码如下:
from IPython.display import display, Latex from sympy import * import sympy.physics.units as U c = U.speed_of_light G = U.gravitational_constant hb = U.hbar expr = sqrt(hb*G/(c**3)) # 转换为普朗克长度对应的单位:米,再提取数值 expr_m = U.convert_to(expr, U.meter) result = N(expr_m / U.meter) print(f"带单位结果:{expr_m}") print(f"纯数值结果:{result}")
运行后可直接得到普朗克长度的近似数值:1.61625502442370e-35
通用封装方案
如果不想每次手动指定目标单位,可以封装自动识别量纲的工具函数,实现一键取值:
def get_phys_value(expr, unit_sys=U.si): # 自动识别表达式量纲,匹配对应单位后返回纯数值 dim = U.Dimension(unit_sys.get_dimensional_expr(expr)) base_unit = U.convert_to(U.Quantity(dimension=dim), unit_sys._base_units) return N(U.convert_to(expr, base_unit) / base_unit) # 测试调用 print(get_phys_value(expr))
内容的提问来源于stack exchange,提问作者Gergely Nagy
相关产品推荐
相关产品推荐

