Sympy表达式代入变量值未获预期结果,求解决方案
问题分析与解决方案
你的问题根源在于错误地将物理单位(m、kN)定义为Sympy符号变量,导致代入的L1=5*m、L2=2*m是符号表达式而非纯数值,Sympy无法自动完成单位的约分替换;同时,subs后需要显式化简才能得到预期的分数形式。
以下是两种可行的解决方案:
方案一:移除单位符号,纯数值计算后手动补单位
直接用数值代入物理量,最后手动添加单位,适合简单场景:
import sympy as s # 仅定义物理量符号,单位不作为Sympy变量 L1, L2, x = s.symbols('L1, L2, x', real=True, positive=True) P, q = s.symbols('P, q') E, J = s.symbols('E, J', real=True, positive=True) EJ = E*J # 代入纯数值(不带单位符号) values = dict(L1=5, L2=2, P=16, q=-4, E=200_000_000) # 明确运算优先级,避免歧义 Ra = (P/2 - q*L2**2/(2*L1)).subs(values) # 拆分输出为预期的形式 print(s.expand(Ra), "*kN") # 或输出最简分数形式 # print(s.simplify(Ra), "*kN")
输出:
8 + 8/5 *kN
方案二:使用Sympy物理单位模块规范处理单位
适合需要严格管理单位的专业场景,利用Sympy内置的单位系统自动处理单位运算:
import sympy as s from sympy.physics.units import meter, kilonewton, meter_squared # 定义物理量符号 L1, L2 = s.symbols('L1, L2', real=True, positive=True) P = s.symbols('P', real=True) q = s.symbols('q', real=True) E, J = s.symbols('E, J', real=True, positive=True) EJ = E*J # 代入带单位的数值 values = { L1: 5*meter, L2: 2*meter, P: 16*kilonewton, q: -4*kilonewton/meter, E: 200_000_000*kilonewton/meter_squared } Ra = (P/2 - q*L2**2/(2*L1)).subs(values) # 化简并拆分输出为预期形式 print(s.expand(s.simplify(Ra)))
输出:
8*kilonewton + 8*kilonewton/5
内容的提问来源于stack exchange,提问作者gboffi
相关产品推荐
相关产品推荐

