gpt4 book ai didi

algorithm - 确定比率以达到 3 个值的平均值

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:14:03 25 4
gpt4 key购买 nike

我有常数 A、B、C 和 N,我想弄清楚如何“混合”A、B 和 C 的数量以创建 N 的平均值。

在公式中,它看起来像这样:

(xA + yB + zC)/(x+y+z) = N

我如何计算出 x、y、z 的值?

编辑:我不是在寻找一个有限的解决方案,我在寻找一个最适合的算法,它将返回 x、y 和 z 之和的最低值。

最佳答案

我觉得你的问题很有道理。处理此类问题的一种方法是寻找最小长度的解决方案(p1,p2,p3)。这样做有一个明确的程序,它会给出一个明确的、单一的结果。假设我们的系统是

|A B C| |p1|   |N|
|1 1 1| |p2| = |1|
|p3|

其中p1, p2, p3 是混合中A, B, C 的三个权重。我们可以将这三个矩阵命名如下

    |A B C|      |p1|      |N|
M = |1 1 1|, x = |p2|, y = |1|
|p3|

然后构造M的伪逆,求解方程如下:

x = M^T (M M^T)^{-1} y

向量 x 然后求解系统,并且是求解该方程组的最小长度向量。上面的方程可以通过拉格朗日乘数计算得到,但你不需要知道它就可以使用它。

在你的情况下,我手工计算了一点难度,并得到了解决方案

p1 = ( (3*A-S)*N - A*S+T ) / ( (A-B)^2 + (B-C)^2 + (C-A)^2 )
p2 = ( (3*B-S)*N - B*S+T ) / ( (A-B)^2 + (B-C)^2 + (C-A)^2 )
p3 = ( (3*C-S)*N - C*S+T ) / ( (A-B)^2 + (B-C)^2 + (C-A)^2 )

其中 S=A+B+CT=A^2+B^2+C^2。您可以检查它是否满足您问题的所有要求,并且可以与其他解决方案进行比较以了解我的解决方案是最小的。请参阅下面的 Java 实现,它在命令行上获取 A、B、C 和 N,并以百分比形式打印出最佳混合物的权重。请注意,接近极端(当 N 接近 min(A,B,C)max(A,B,C) 时)伪逆法给出负权重。在这种情况下,您应该将相应的权重设置为 0,并使用标准线性代数技术计算其他两个变量。如果 N 超出从 min(A,B,C)max(A,B,C) 的区间,则不可能得到一个非负的混合,所以实现打印出一个负权重的答案。

一般来说,如果您有矩阵库,计算会快速而直接。有关更多信息,请搜索伪逆或伪逆。

public class Mixture {
public static void main(String[] args) {
// calculate an optimal mixture of A, B, C to make N
double A = Double.parseDouble(args[0]);
double B = Double.parseDouble(args[1]);
double C = Double.parseDouble(args[2]);
double N = Double.parseDouble(args[3]);

// these formulas were derived from calculations of the pseudo-inverse
// of the matrix {{A,B,C},{1,1,1}}
double S = A + B + C;
double T = A*A + B*B + C*C;
double D = (A-B)*(A-B) + (B-C)*(B-C) + (C-A)*(C-A);

double p1 = ( (3*A-S)*N + (-A*S+T)) / D;
double p2 = ( (3*B-S)*N + (-B*S+T)) / D;
double p3 = ( (3*C-S)*N + (-C*S+T)) / D;

// if pseudo-inverse calculation gives a negative weight, set weight to 0
// and calculate exact solution
if (p1<0) { p1 = 0; p2 = (N-C)/(B-C); p3 = (B-N)/(B-C); }
if (p2<0) { p2 = 0; p1 = (N-C)/(A-C); p3 = (A-N)/(A-C); }
if (p3<0) { p3 = 0; p1 = (N-B)/(A-B); p2 = (A-N)/(A-B); }

p1 = Math.round(p1*1000)/10.0;
p2 = Math.round(p2*1000)/10.0;
p3 = Math.round(p3*1000)/10.0;

System.out.println("Mixture weights: " + p1 + "%, " + p2 + "%, " + p3 + "%");
System.out.println("Check p1*A+p2*B+p3*C = " + ((p1*A+p2*B+p3*C)/100));
System.out.println("Check p1 + p2 + p3 = " + (p1+p2+p3) + "%");
}
}

关于algorithm - 确定比率以达到 3 个值的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29685316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com