如何用python和sympy求解多元不等式?
我对使用python和Sympy很陌生。。。得到了一个利用辛解多元不等式的问题 假设我在一个文件中有很多函数,如下所示:如何用python和sympy求解多元不等式?,python,sympy,inequalities,Python,Sympy,Inequalities,我对使用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
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
然后当我尝试时:
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
我得到:
True
这是一个好的和可行的答案。
有没有办法解决多元不等式,并总是得到一个可行的答案
例如,我想得到:
求解(x**2-y>0)
或者(x>-sqrt(y),x>sqrt(y))当尝试使用Symphy解决此问题时,您会得到一条非常清楚的错误消息:
未实现错误:仅支持单变量不等式。请注意,这意味着如果您提供一种算法来解决此问题,Symphy团队将非常高兴
现在很明显,sympy.solve
功能不够强大,您可以尝试另一种方法。最近(在0.7.2中),Symphy中添加了一个隐式绘图例程,可以在表达式的计算结果为True
时进行绘图。遗憾的是,它只是一个数值解,而不是一个符号解,您可以从solve
获得,但它可能已经足够了:
从图像中,您可以看到只有一行表达式改变了符号,因此求解expr==0
可能会得到您想要的结果。事实确实如此:
在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
>>>
mystic
使用了sympy
和数值优化的组合来简化不等式;当给出初始猜测解时,可以(大部分时间,但不总是)生成方程的有效解mystic
实际上不会解决不等式本身,但它(通常)会生成不等式的有效解。欢迎!别忘了,这里的礼节是解释你尝试了什么,以及为什么在提问时它不起作用。aïe,下次我不会忘记的!我试过和你一样的代码。。。然后得到同样的答案:“NotImplementedError”。谢谢你的回答,但这对我所需要的并不好。我必须生成所有可能的函数f(x,y),例如10个字符,然后计算所有导数,以检查:df/dx>0和df/dy<0。有太多的可能性可以自己检查一切。。。你知道吗?我真的不明白你在评论中提出的问题与你在上述问题中提出的问题有什么关系?随便问一个新问题,或者如果你坚持要修改原来的问题,那么就清楚你想要什么。如果你发现一个答案有用,请投票。非常好且彻底的答案。这个解释有助于我的博弈论核心分配计算。
True
>>> 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
>>>