【问题标题】:Best approach for solving equation with truncations in Python在 Python 中用截断解方程的最佳方法
【发布时间】:2021-09-24 11:03:52
【问题描述】:

我正在尝试用数值方法求解一个可以在 Python 中包含截断的方程。我想知道最好的图书馆和方法是什么?以下是有关该问题的更多详细信息:

等式每次都会改变。从人类的角度来看,方程式应该非常简单;它们包括常见的运算符,例如 +、-、*、/,并且它们有时还具有截断函数(截断为整数)或限制函数(将括号中的值限制在两个提供的边界之间)或(很少)多个变量。几个例子(这些是单独的例子而不是方程组)将是:

  1. TRUNCATE(VAR_1 + 300) - 50.4 = 200
  2. (VAR_2 + VAR_3)*3 = 35
  3. LIMIT(3,5)(VAR_4) = 8
  4. VAR_5 = 34

(这不是方程式的样子,因为我用后缀表示法编写它们,但我有一个计算器可以用提供的输入值来确定它们的值。)

对于这些方程,我所需要的只是每个变量的一些值,它可以解决每个方程;我不需要知道每个解决方案。

需要注意的一些额外事项是 a) 这些变量都有最大值和最小值,b) 虽然完美会很好,偶尔的错误是可以接受的,以及 c) 一些变量是整数,我认为这真的很复杂事物。现在,我正在处理这个非常草率的问题,但对于我的情况来说,通过将整数值四舍五入到最接近的 int 也是可以接受的。

为了解决这个问题,我尝试使用 Sympy 进行解析求解(正如您所料,它不适用于截断并且难以实现),并且我还尝试使用 Scipy 最小化,如下所示:

minimize(minimization, x0, method = 'SLSQP', constraints = cons, tol = 1e-3, options={'ftol': 1e-3, 'disp':True, 'maxiter': 100, "eps":.1}, args = (x_vals, postfix, const_values, value))

这个卡在截断上,大概是因为它不知道移动的方向,除非我将步长设置为 1,这会降低准确性。出于某种原因,它似乎也没有遵循 ftol,因为它会在公差范围内给出可接受的答案,但只会继续迭代限制。

我正在考虑使用诸如“马尔可夫链蒙特卡罗”方法之类的随机游走方法,但我对此真的了解不多,很想听听其他想法。

【问题讨论】:

  • 请注意,截断或 ceil 函数不可微,因此不能使用 SLSQP 方法。相反,您可以尝试像鲍威尔这样的无导数方法。根据文档:函数不必是可微分的,并且不采用任何导数

标签: python scipy truncate equation-solving numerical-analysis


【解决方案1】:

我最终以两种略有不同的方式解决了这个问题。他们两人都使用了 joni 在原始问题的 cmets 中建议的 Powell 求解器,对于他们两人,我必须将传递给“fun”参数的函数的输出相乘(我命名为最小化的函数) 100,因为我永远无法在求解器函数调用中调整容差。

  1. 当方程只有一个变量时,我从最小化函数中删除了截断。这对我的目的有效,因为我使用的方程被截断的原因是它们(通常)等于一个整数值。所以,当方程输出是一个整数并且只有一个变量时,我相信只要假装解算器中不存在截断函数就可以得到正确的解(尽管记住要警惕浮点数学)。 (如果截断之外的任何数字都是整数,那么方程可能无论如何都没有解。)

  2. 在有多个变量的情况下,我的解决方案是 a) 在最小化函数中包含截断函数 b) 对求解器建议的 x 值进行四舍五入,因为我计划最终将它们四舍五入(例如,将它们四舍五入如果它们是整数值,则为整数)。

无论如何,这个解决方案适用于上面定义的问题,但它有一些限制。不能保证总能找到正确的输出,尤其是第二部分。有这个问题的人可能希望考虑的另一种方法是某种整数规划,如果他们有线性方程的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2015-04-30
    相关资源
    最近更新 更多