Algorithm 求解方程组:

Algorithm 求解方程组:,algorithm,function,Algorithm,Function,我有以下问题: f(x)定义为介于0和10之间的f1(x),f2(x)定义为介于10和20之间的f1(x),否则定义为0。f(x)在0和20之间的积分需要大于或等于一个值K g(x)被定义为g1(x)介于0和5之间,g2(x)介于5和20之间,否则为0。g(x)在0和20之间的积分需要大于或等于值Q 对于任何x,f(x)和g(x)之和不能超过值R 我想这背后有一些复杂的理论,我想知道是否有人能给我指出一个正确的方向,设计出一个可以生成f1(x)、f2(x)、g1(x)和g2(x)的算法 编辑:我

我有以下问题:

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

g(x)被定义为g1(x)介于0和5之间,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保持在尽可能低的水平


谢谢:)

解方程组不同于许多编程任务。当你解方程时,你需要一种方法来象征性地对待变量,而不是像对待值一样对待变量。所以你需要一种方法来表示一个数学符号,而不仅仅是一个值。所以我认为如果你想实现你自己的,你必须从这里开始

如果您不想实现自己的,可以使用Python实现的符号数学解算器。你可以浏览他们的源代码,看看他们如何处理方程组的求解

具体来说:,在第341行附近,有一个函数叫做
solve
,它求解方程组。你可以看看他们是如何用这种方法解一般方程组的


用数值方法求解方程组要容易得多。在这种情况下,你可以强制执行它:你只需不断修改参数,直到找到有效的值。

根据问题的陈述方式,我假设f1(x)、f2(x)、g1(x)和g2(x)是(非负)常量函数。然后这是一个(LP)问题,例如可以使用

以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

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

这个问题看起来更适合它似乎OP没有指定f1(x)、f2(x)、g1(x)和g2(x)是常数、非负的甚至是线性的?也许OP可以澄清一下。@cklin:如果f1(x)等不是常数,那么为什么还要麻烦指定“f(x)定义为介于0和10之间的f1(x),f2(x)定义为介于10和20之间的f1(x),否则为0。”。如果f1(x)可以是任何函数,f2(x)可以是任何函数,那么该定义相当于[0;20]中的“supp(f)”,x=10没有任何特殊之处。然而:在这个例子中,如果f(x)和g(x)可以是任何函数,那么
f(x)=K/20
g(x)=Q/20
仍然是最优解。
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;
...
Result: 1.150000 1.150000 2.100000 2.100000 3.250000