我是一个使用python和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))
发布于 2013-06-11 23:59:06
在尝试使用SymPy解决这个问题时,您会得到一个非常明确的错误消息:NotImplementedError: only univariate inequalities are supported。请注意,这意味着如果您贡献了一个解决此问题的算法,SymPy团队将非常高兴。
现在很明显,sympy.solve还不够强大,您可以尝试另一种方法。最近(在0.7.2中),一个隐式绘制例程被添加到渐近,它可以绘制表达式求值为True的位置。遗憾的是,这只是一个数值解决方案,而不是您可以从solve获得的符号解决方案,但它可能已经足够了:

从图像中可以看到,只有一行表达式更改了符号,因此求解expr==0可能会得到您想要的结果。事实的确如此:

发布于 2015-10-01 00:20:34
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实际上不会解决不等式本身,但它(通常)会生成一个有效的解不等式。
https://stackoverflow.com/questions/17048180
复制相似问题