8

我是使用 python 和 Sympy 的新手......并且遇到了使用 sympy 解决多元不等式的问题。

假设我在一个文件中有很多函数,如下所示:

    cst**(sqrt(x)/2)/cst
    exp(sqrt(cst*x**(1/4)))
    log(log(sqrt(cst + exp(x))))
    (y**(1/4) + y)**cst
    sqrt(y/log(x))/cst
    sqrt(cst**log(cst) + x)
    (y**2)**(x/4)
    sqrt(y*sqrt(cst**y))
    log(sqrt(2)*sqrt(cst)*x)

我需要推导它们,设置常量的值并检查每个函数 f,

    df/dx > 0
    df/dy < 0 

x 在 [0, +oo) 中,y 在 [0, 1] 中。

要推导我使用:

    dx = diff(f, x)
    dy = diff(f, y)

然后当我尝试:

    cst = 2 #(for example) 
    solve(dx > 0) 

我收到了这个错误:

    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    File "/usr/local/lib/python2.7/dist-packages/sympy/solvers/solvers.py", line 634, in solve
symbols=symbols)
    File "/usr/local/lib/python2.7/dist-packages/sympy/solvers/inequalities.py", line 374, in reduce_inequalities
    raise NotImplementedError("only univariate inequalities are supported")
    NotImplementedError: only univariate inequalities are supported

但是,如果我尝试这样做:

    x=Symbol('x', real=True, postive=True, nonzero=True)
    y=Symbol('y', real=True, postive=True, nonzero=True)
    solve(x**2+y > 0)

我有 :

    True

这是一个很好且可行的答案。有没有办法解决多元不等式并总能得到一个可行的答案?

例如我想得到:solve(x**2-y>0) Or(x>-sqrt(y), x>sqrt(y))

4

2 回答 2

8

尝试使用 SymPy 解决此问题时,您会收到一条非常清晰的错误消息:NotImplementedError: only univariate inequalities are supported. 请注意,这意味着如果您提供解决此问题的算法,SymPy 团队将非常高兴。

现在很明显它sympy.solve不够强大,您可以尝试另一种方法。最近(在 0.7.2 中)一个隐式绘图例程被添加到 sympy 中,它可以绘制表达式计算为True. 遗憾的是,它只是一个数字解决方案,而不是您可以从中获得的象征性解决方案,solve但它可能就足够了:

在此处输入图像描述

从图像中您可以看到表达式更改符号的位置只有一行,因此求解expr==0可能会给您想要的结果。确实是这样:

在此处输入图像描述

于 2013-06-11T15:59:05.873 回答
4

中有一个多元不等式求解器mystic,它建立在sympy. 它使用优化和集合的(数学)映射来提供此功能。它并不完美,但适用于许多情况。

>>> equations = '''
... 2*A + 3*B >= C
... A*B > D
... C < 4*A    
... D == 0
... '''
>>> 
>>> import mystic.symbolic as ms
>>> var = list('ABCD')
>>> eqns = ms.simplify(equations, variables=var)
>>> print eqns
D == 0
B > 0
A > C/4
A >= -3*B/2 + C/2
A > D/B
>>> 
>>> # generate a constraints function, which maps one space to another
>>> constrain = ms.generate_constraint(ms.generate_solvers(eqns, var))
>>> solution = constrain([1,2,3,4])
>>> print solution
[1, 2, 3, 0] 
>>> # here's the solution...
>>> dict(zip(var,solution))
{'A': 1, 'C': 3, 'B': 2, 'D': 0}
>>>
>>> A=1; C=3; B=2; D=0
>>> 2*A + 3*B >= C
True
>>> A*B > D
True
>>> C < 4*A
True
>>> D == 0
True
>>> 

让我们再做一次,使用建议的测试:

>>> equations = """x**2 - y >= 0
... x + y = 0
... """
>>> eqns = ms.simplify(equations, variables=var)
>>> constrain = ms.generate_constraint(ms.generate_solvers(eqns, var))
>>> solution = constrain([1,3])
>>> solution
[-3, 3]
>>> dict(zip(var, solution))
{'y': 3, 'x': -3}
>>> y=3; x=-3
>>> x**2 - y >= 0
True
>>> x+y == 0
True
>>>

mystic使用组合sympy和数值优化来简化不等式;并且当出现初始猜测解时,可以(大部分时间,但并非总是)生成方程的有效解。 mystic实际上不会解决不等式本身,但它会(通常)为不等式生成一个有效的解决方案。

于 2015-09-30T16:20:34.243 回答