【问题标题】:Solve for x in Python [closed]在 Python 中求解 x [关闭]
【发布时间】:2019-07-25 17:16:35
【问题描述】:

要找到使(c + x) / 2 服从0 <= x <= c <= 1x 在数学上是微不足道的:解决方案是x = c无论c 的值是什么。

如何在 Python 中表达这一点?

  • 我可以求解具有不等式约束的方程,例如使用scipy.optimize.linprog,但我很难理解如何以x = cc 没有固定数值时的方式来表述问题。
  • 也许sympy 之类的符号工具箱适合这项任务,但是,我该如何表述呢?

以上是一个简单的示例方程。我有很多这样的方程,比如1 - (x + c) / 2 等等。它们都是线性的。还有一些未知值较多的方程,如c1c2。我可以轻松地制定它们,但每次的问题都是一样的:我如何让 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 &lt;= x) &amp; (c &lt;= 1) &amp; (x &lt;= c) &amp; (-oo &lt; c) &amp; (-oo &lt; x) &amp; (x &lt; oo) &amp; 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


【解决方案1】:

考虑到xc 都是整数。 对于任何给定的c,解决方案将是:

d = {x: (c+x)/2 for x in range(0,c+1)}   
max(d, key=d.get)

【讨论】:

  • @TrebuchetMS 试图说明的一点是,xc 都不是整数。
  • @Paul 好的,现在我不明白你在问什么。我给了你一个数值解。但我不认为 Python 对分析解决方案有好处,这实际上是您要问的。
猜你喜欢
  • 2015-01-20
  • 2012-05-17
  • 1970-01-01
  • 2020-03-07
  • 2016-05-27
  • 2010-09-15
  • 2010-10-17
  • 2014-08-07
相关资源
最近更新 更多