微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Python 中求解带截断方程的最佳方法

如何解决在 Python 中求解带截断方程的最佳方法

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

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

  1. 截断(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) 一些变量是整数,我认为这真的很复杂事物。现在,我通过将整数值四舍五入到最接近的整数来处理这个非常草率但对我的情况来说也是可以接受的。

为了解决这个问题,我尝试使用 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,因为它会在容差范围内给出可接受的答案,但只会继续迭代限制。

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

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。