用二元变量对多元非线性方程组进行数值求解的最快方法是什么?



如何求解具有三个方程和 5000-20000 个变量(可以是 0 或 1)的多元非线性方程组?

该系统可能有很多解决方案,但我只需要找到其中之一。

谢谢

如果你的方程是纯粹的布尔方程,你可以使用"满足性求解器",也称为SAT。 你的正是 SAT 求解器专为解决的问题而设计的。其中许多是开源的,最著名的是miniSAT。您只需实例化一个求解器,将方程(又名"子句")输入其中并请求解决方案。求解器将在找到第一个合适的变量组合时停止。

如果我理解正确,你的不是纯粹的布尔变量,而是带有布尔变量的算术。有一些技巧可以使它们适应 SAT。例如,将方程 x1x2+x3x4+x5x6x7=2 添加到 SAT 求解器的常用方法如下:引入新变量 v1=x1x2、v2=x3x4、v3=x5x6x7,然后添加一个子句"(v1,v2,v3) 中的两个为真"(miniSAT 有一个生成器用于此子句和类似类型的子句)。

如果某些系数不是 0 和 1,您可能需要 SAT 求解器的特殊扩展,称为 SMT(满足性模理论)。其中一些程序也可以作为开源提供。

二进制数(a = 0 或 1)的好处是 a^b = a 对于 b> 0 的所有值。因此,您的"非线性"方程将通过摆脱所有多项式项的简单利用而变得线性。

当你有许多线性方程时,问题就变成了:系数的哪个组合(我假设系数是线性的)给了我这个方程的常数项?原则上,您应该能够消除两个变量(因为您有三个方程),最终只得到一个方程。满足此条件的 1 和 0 的任何组合现在都将是您问题的解决方案。您必须查看系数 - 是否有一个系数等于常数?然后你有你的答案(那位 = 1,所有其他都是 0)。还是有一对系数加起来等于常数?当您开始组合更多术语时,要测试的排列数量会迅速增加。我想不出一种"聪明"的方法来超越这一点 - 你必须看看系数(例如,如果两个变量具有相同的系数,你可以相应地减少你的问题)。

更新 给定示例

x1 + x2 + x3 + x4 + x5 = s
x1x2 + x2x3 + x3x4 + x4x5 = t

我们可以注意到以下内容:

  1. 设置为 1 的位数必须为 == 5(从第一个等式开始)
  2. t 必须是 <s(因为没有出现新术语,并且我们有术语的乘积)>

在这样的玩具示例中,我们实际上可以进行详尽的搜索。当术语的数量变得更大时,st的大小将推动复杂性。需要注意的几点

总和为 s = n!/(n-s)!s! 的 n 位的可能组合数。值得考虑"复合"方程,使用最常作为常用术语出现的因子。在上面,你会看看

x2(x1+x3) + x4(x3+x5) = t

现在我们可以看到,如果t>2,我们必须同时具有x2=1x4=1;类似的简化在其他地方可能是可能的。

由于您实际上只有三个方程,因此我会寻找将最大可能数量的元素设置为零的方法(使用上述方法),然后对剩下的元素进行详尽搜索......

最新更新