SymPy使用assuming限定变量为正求解方程不生效问题
问题解答
assuming 上下文的实际运行逻辑
assuming属于SymPy的新假设体系,它的作用是给当前上下文提供一个临时假设池,仅对ask()查询生效,不会修改符号变量本身的属性,也不会被SymPy的大部分内置运算函数主动读取。- 它的设计初衷是做零散的逻辑判断,不需要修改符号本身的固有属性,比如临时判断某个表达式是否为正、是否为实数,不属于全局生效的配置。
为什么solve函数无法识别临时假设
solve函数目前只适配了SymPy的旧假设体系,旧假设体系的所有属性都是绑定在符号对象本身的,也就是你创建符号时指定的positive=True这类参数,会作为符号的固有属性被solve读取,用来过滤不符合条件的根。- 目前
solve没有对接新假设体系的临时假设池,自然感知不到assuming上下文里加的限制,所以会返回所有数学上成立的根。
替代解决方案
如果你不想修改符号x的固有属性,可以先拿到所有解,再用ask()在assuming上下文里过滤符合条件的结果:
from sympy import solve, Eq from sympy.assumptions import assuming, Q, ask from sympy.abc import x sol = solve(Eq(x**2, 4)) with assuming(Q.positive(x)): positive_sol = [s for s in sol if ask(Q.positive(s))] print(positive_sol) # 输出 [2]
如果没有动态修改假设的需求,直接在创建符号时指定positive=True是目前效率最高的方案。
内容的提问来源于stack exchange,提问作者Maksim Surov
相关产品推荐
相关产品推荐

