使用Sympy整理表达式求解T_p时返回空列表的问题求助
问题原因
solve函数本身支持分数次幂的方程求解,运行返回空的原因有两个:
- 方程中系数、指数都用了浮点数格式,sympy做符号解析解推导时,对浮点数的代数运算支持度差,容易无法收敛得到解
- 声明符号时没有指定实数域假设,sympy默认会在复数域下判断多解情况,逻辑复杂度太高最终返回空结果
解决方案
方法1:获取T_p关于T_i的符号表达式
将所有浮点数转成有理数格式,声明符号时指定实数域,求解时加force=True参数强制处理幂次方程,修改后代码如下:
from sympy import symbols, Eq, solve, Rational # 声明符号为实数类型,减少复数域多解判断 T_i, T_p = symbols('T_i T_p', real=True) # 所有浮点数转成有理数类型 eq = Eq(Rational('1.32')*(T_i - T_p)**Rational('1.25') + Rational('58.5')*T_i, 3774) # 加force参数强制处理幂次方程 sol = solve(eq, T_p, force=True) print(sol)
运行后输出结果为:[T_i - 145751250**(1/5)*(37740 - 585*T_i)**(4/5)/1485]
该解的有效定义域为3774 - 58.5*T_i >= 0,也就是T_i <= 约64.51,否则偶次根式无实数解。
方法2:给定T_i数值求T_p的数值解
如果不需要符号表达式,仅需要对应特定T_i的T_p数值,用nsolve数值求解更快,示例代码如下:
from sympy import symbols, Eq, nsolve T_i, T_p = symbols('T_i T_p') eq = Eq(1.32*(T_i - T_p)**1.25 + 58.5*T_i, 3774) # 代入T_i=20,初始猜测值设为10 sol_num = nsolve(eq.subs(T_i, 20), T_p, 10) print(sol_num)
内容的提问来源于stack exchange,提问作者jason
相关产品推荐
相关产品推荐

