Sympy求解不等式时,如何假设符号因子为正以分离变量?
用SymPy求解含符号系数的不等式
要得到分离出t的分式形式解,有两种可靠方法:
方法一:定义符号时添加预设条件
在创建符号时直接指定正性及大小关系假设,让SymPy提前知晓系数符号:
from typing import Final import sympy as sym # 定义符号时添加正性假设,同时指定tau_f > tau_O的关系 tau_S : Final[sym.Symbol] = sym.Symbol('\\tau_\\mathrm{S}', positive=True) tau_f : Final[sym.Symbol] = sym.Symbol('\\tau_f', positive=True) tau_O : Final[sym.Symbol] = sym.Symbol('\\tau_\\mathrm{O}', positive=True) t : Final[sym.Symbol] = sym.Symbol('t') tau_on_min : Final[sym.Symbol] = sym.Symbol('\\tau_\\mathrm{on,min}', positive=True) assumption = sym.Q.greater(tau_f, tau_O) eq = tau_O*(-t-1)-tau_S + tau_f*t >= tau_on_min # 使用solveset并传入假设条件 solution = sym.solveset(eq, t, domain=sym.Reals, assumptions=assumption) print(solution)
运行后会得到t >= (tau_O + tau_S + tau_on_min)/(tau_f - tau_O)的分式形式解。
方法二:先求解再用条件细化
如果不想在定义符号时加假设,可以先得到初步结果,再用refine函数应用系数符号条件:
from typing import Final import sympy as sym tau_S : Final[sym.Symbol] = sym.Symbol('\\tau_\\mathrm{S}') tau_f : Final[sym.Symbol] = sym.Symbol('\\tau_f') tau_O : Final[sym.Symbol] = sym.Symbol('\\tau_\\mathrm{O}') t : Final[sym.Symbol] = sym.Symbol('t') tau_on_min : Final[sym.Symbol] = sym.Symbol('\\tau_\\mathrm{on,min}') eq = tau_O*(-t-1)-tau_S + tau_f*t >= tau_on_min # 获取初步求解结果 pre_sol = sym.solve(eq, t, dict=True)[0] # 定义系数为正的条件 cond = sym.Q.greater(tau_f, tau_O) # 应用条件细化解 final_sol = sym.refine(pre_sol, cond) print(final_sol)
注意事项
直接给solve函数额外传入条件会报错,因为solve没有对应参数。必须通过符号定义时的假设、solveset的assumptions参数或refine函数这三种方式传递条件,让SymPy明确系数符号后,才能完成除法分离t的操作。
内容的提问来源于stack exchange,提问作者mef.user1
相关产品推荐
相关产品推荐

