【发布时间】:2021-09-24 11:03:52
【问题描述】:
我正在尝试用数值方法求解一个可以在 Python 中包含截断的方程。我想知道最好的图书馆和方法是什么?以下是有关该问题的更多详细信息:
等式每次都会改变。从人类的角度来看,方程式应该非常简单;它们包括常见的运算符,例如 +、-、*、/,并且它们有时还具有截断函数(截断为整数)或限制函数(将括号中的值限制在两个提供的边界之间)或(很少)多个变量。几个例子(这些是单独的例子而不是方程组)将是:
- TRUNCATE(VAR_1 + 300) - 50.4 = 200
- (VAR_2 + VAR_3)*3 = 35
- LIMIT(3,5)(VAR_4) = 8
- 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