【发布时间】:2019-07-25 17:16:35
【问题描述】:
要找到使(c + x) / 2 服从0 <= x <= c <= 1 的x 在数学上是微不足道的:解决方案是x = c,无论c 的值是什么。
如何在 Python 中表达这一点?
- 我可以求解具有不等式约束的方程,例如使用
scipy.optimize.linprog,但我很难理解如何以x = c当c没有固定数值时的方式来表述问题。 - 也许
sympy之类的符号工具箱适合这项任务,但是,我该如何表述呢?
以上是一个简单的示例方程。我有很多这样的方程,比如1 - (x + c) / 2 等等。它们都是线性的。还有一些未知值较多的方程,如c1 和c2。我可以轻松地制定它们,但每次的问题都是一样的:我如何让 Python 求解(最大化/最小化)这样的方程?
试试 1,scipy.optimize.linprog:
from scipy.optimize import linprog
f = [-.5, -.5, 0] # columns: c, x, 1
A_ub = [[0,-1,0], [-1,1,0], [1,0,-1]]
b_ub = [0, 0, 0]
bounds = ((0, 1), (0, 1), (1, 1))
res = linprog(f, A_ub, b_ub, bounds=bounds)
res.x(即[1., 1., 1.])的值如何暗示x = c?
尝试 2,sympy
from sympy import symbols, solve, Max
x, c = symbols('x,c')
exp = (c + x) / 2
res = solve([Max(exp), 0 <= x, x <= c, c <= 1], x)
答案是:(0 <= x) & (c <= 1) & (x <= c) & (-oo < c) & (-oo < x) & (x < oo) & Eq(x, -c),它提出的问题比它回答的要多。
【问题讨论】:
-
也许你会在this question 的答案中找到一些有用的东西。请注意,我并不是说这是重复的,只是指出来
-
写出问题本身,注意这个表达式很简单,因为它是线性的。在这种情况下,如果您想在某个范围内最大化值,您始终可以在两个范围内选择值并取最大值。然而,非线性表达式变得复杂得多,解决它的能力很大程度上取决于具体的表达式。
-
@jdehesa 如果您能发布一段简单的演示代码作为答案,那就太好了。在我所有的情况下,方程都是线性的,但我仍然不知道查询解的原则方法,因为边界
x = c没有数值解。 -
关于 SymPy 的尝试,
Max只是传递参数的最大值,这里只是exp,所以它与exp相同。solve将尝试求解给定的方程和不等式;在这种情况下,它假设Max(exp)(即exp)应该是0,然后还有其他不等式。结果只是告诉你所有这些都是真的(最后的重要一点,Eq(x, -c))。 -
@Paul 因为这个问题被搁置了,这就是我在 SymPy pastebin.com/bbQQUbDX987654322@中“选择具有最高值的界限”的意思。
标签: python scipy sympy mathematical-optimization symbolic-math