解方程组:

时间:2014-04-05 15:50:44

标签: algorithm function

我有以下问题:

f(x)定义为f1(x)在0和10之间,f2(x)在10和20之间,否则为0。 f(x)在0和20之间的积分需要大于或等于值K.

g(x)定义为0和5之间的g1(x),g2(x)在5和20之间,否则为0。 g(x)在0和20之间的积分需要大于或等于值Q.

对于任何x,f(x)和g(x)之和不能超过R值。

我认为它背后有一些精心设计的理论,并且想知道是否有人能指出我正确的方向来设计一个能产生f1(x),f2(x),g1(x)和g2的算法( x)的

编辑:我想补充一点,对于给定的K和Q,兴趣是保持R尽可能低。

谢谢:)

2 个答案:

答案 0 :(得分:1)

求解方程组与许多编程任务不同。当您解决方程时,您需要一种方法来处理变量符号而不仅仅是。因此,您需要一种方法来表示数学符号,而不仅仅是一个值。所以,如果你想实现自己的话,我认为你必须开始。

如果您不想实现自己的,Sympy是符号数学解算器的Python实现。您可以浏览它们的来源,看看它们如何处理求解方程组。

具体来说:solvers.py,在第341行附近,有一个名为solve的函数,它解决了方程组。您可以查看它们如何通过这种方式求解通用方程组。

解决方程系统数字要容易得多。在这种情况下你可以强制它:你只需要修改参数,直到找到有用的值。

答案 1 :(得分:1)

从陈述问题的方式来看,我假设f1(x),f2(x),g1(x)和g2(x)是(非负)常数函数。那么这是一个linear programming(LP)问题,例如可以使用simplex algorithm来解决。

表达为LP问题的问题是:

10*x1 + 10*x2 >= K
5*x3 + 15*x4 >= Q
x1 + x3 <= R
x1 + x4 <= R
x2 + x4 <= R

Variables: x1, x2, x3, x4, R
Minimize R

您可以自己实施LP解算器,也可以使用现有的库或工具。例如,使用GNU线性编程套件(GLPK)解决K = 23和Q = 42的问题:

var x1;
var x2;
var x3;
var x4;
var R;

s.t. rel1: 10*x1 + 10*x2 >= 23;
s.t. rel2: 5*x3 + 15*x4 >= 42;
s.t. rel3: x1 + x3 <= R;
s.t. rel4: x1 + x4 <= R;
s.t. rel5: x2 + x4 <= R;

minimize obj: R;

solve;

printf "Result: %f %f %f %f %f\n", x1, x2, x3, x4, R;

end;

使用glpsol --math q22883102.mod

执行
...
Result: 1.150000 1.150000 2.100000 2.100000 3.250000

PS:这个特殊问题总是产生x1 = x2 = K / 20x3 = x4 = Q / 20,因此对于LP来说似乎有点轻量级。但我想这个问题更多的是关于这类问题,而不是这个问题。