添加正性约束后SymPy solve返回空集,如何获取正解?
解决SymPy求解正约束方程返回空集的问题
当你为符号设置positive=True后,solve函数处理乘积类方程(如x^2*y^2、x*y)时会返回空集,这是因为符号正性约束下solve的求解逻辑存在限制。你可以通过以下两种方式修改代码以获取正解:
方法一:先求解再过滤正解
先不设置符号的正性约束,获取所有解后再筛选出满足正性要求的解:
from sympy import * x, y, u = symbols('x y u') utility = sympify(input()) utility_function = Eq(u, utility) all_solutions = solve(utility_function, y) # 筛选正解:利用x、u为正的假设验证解的正负 positive_solutions = [] for sol in all_solutions: if refine(sol > 0, And(x > 0, u > 0)): positive_solutions.append(sol) print(positive_solutions)
方法二:使用solveset指定正实数域
solveset比solve更适配带域约束的求解场景,结合符号的positive=True和正实数域限制,可直接得到正解:
from sympy import * x, y, u = symbols('x y u', positive=True) utility = sympify(input()) utility_function = Eq(u, utility) # 限定求解域为正实数集 solutions = solveset(utility_function, y, domain=S.PositiveReals) print(solutions)
例如输入x*y时,方法二会直接返回{u/x};输入x^2*y^2时,会返回{sqrt(u)/x},均符合正解要求。
内容的提问来源于stack exchange,提问作者KTSB
相关产品推荐
相关产品推荐

