我有以下问题:
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尽可能低。
谢谢:)
答案 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 / 20
和x3 = x4 = Q / 20
,因此对于LP来说似乎有点轻量级。但我想这个问题更多的是关于这类问题,而不是这个问题。