配比计算器——混合比例和数量
配比计算器使用经典的配比法(十字交叉法),计算把便宜和昂贵的两种成分,或者低浓度和高浓度的两种溶液,按什么比例混合才能得到目标价格或目标浓度。输入两个原始值和目标值后,工具会给出混合比例,并进一步算出在总量固定的情况下各自需要的精确数量,常用于药剂配制、饲料配方和成本核算。
配比计算器
输入便宜成分的价值、昂贵(更贵)成分的价值和目标混合值。该工具返回混合它们的比例——如果你给出总数量,还会返回精确数量。
输入值
结果
混合比例
数量
配比十字
配比公式
10.00 : 10.00 = (30.00 − 20.00) : (20.00 − 10.00)
混合成分
文档
这个计算器的作用(用简单的话说)
你有两样价值不同的东西——一个便宜的和一个昂贵的——你想把它们混合成一个介于两者之间的目标价值的混合物。配比法告诉你每个需要用多少。
想象一个跷跷板。目标值是支点。价值远离目标的成分必须少一点,而接近目标的必须多一点,这样两边才能平衡。配比法就是那个平衡的算术。
输入三个数字——便宜值、昂贵值和目标值——该工具会给你:
- 混合比例(例如 1 : 2,表示便宜成分1份配昂贵成分2份),
- 一旦你输入总数量,每种成分的精确数量,
- 一个十字图和一个成分图表,这样你可以看到混合物。
"价值"可以是价格、百分比浓度或浓度(%、mg/mL、w/v)——任何用一个一致的标度测量的东西。
公式
设便宜值为 C、昂贵值为 D、目标混合值为 M,其中 C < M < D:
每种成分的份数来自相反的差值——目标离某个成分越远,你需要的另一个成分越多。如果你也知道总数量 Q:
配比十字
经典的布局方式是"十字":把两个成分值放在左边,目标放在中间,沿对角线相减。每个差值落在相反的角上,成为那个成分的份数。
1 昂贵 (D) ───────┐ ┌─────── (M − C) = 昂贵份数
2 ╲ ╱
3 目标 (M)
4 ╱ ╲
5 便宜 (C) ───────┘ └─────── (D − M) = 便宜份数
6完整示例
混合一个30的成分,以$20的价格出售:
等份。对于100个单位的总量,这是50个便宜成分和50个昂贵成分——混合值正好是25,比例变为5 : 15 = 1 : 3:目标离昂贵值越近,你需要的昂贵成分越多。
配比法替代 vs. 配比法中位
- 配比法替代(这个工具做的)——你知道两个成分值和目标,你解出比例。
- 配比法中位——你知道成分的数量和值,你解出得到的混合值。那只是加权平均:。
两者互为反函数,这是检查你的工作的一个方便方法:把这个工具给你的数量代入加权平均,你应该会得到你的目标。
它在哪里被使用
- 药学配制——混合一个高强度和一个低强度的制剂(例如70%和20%的溶液)到规定的浓度。值是百分比或mg/mL而不是美元;算术是相同的。
- 业务和定价——混合一个便宜和一个高级库存以达到目标单位成本或销售价格。
- 化学和食品/饮料——稀释或强化到目标浓度、酒精度或糖度。
因为这个规则只需要一个一致标度上的单个值,同样的三个输入涵盖了所有这些。
如何使用它
- 输入便宜值、昂贵值和目标混合值(任何一致的单位)。
- 可选地输入总数量以获得每种成分的精确数量。
- 读取比例、简化的比例和数量;十字图和甜甜圈图显示分割。
输入与页面URL同步,所以你可以书签或共享一个确切的设置。目标必须严格位于两个成分值之间——否则它们的任何混合都无法达到,该工具会说明这一点。
用代码计算它
每个片段取便宜值 c、昂贵值 d、目标 m 和总数量 q,并返回两个部分和两个数量。
Excel
假设 C2 = 便宜、D2 = 昂贵、M2 = 目标、Q2 = 总数量:
1=D2-M2 ' 便宜份数 (D − M)
2=M2-C2 ' 昂贵份数 (M − C)
3=(D2-M2)/((D2-M2)+(M2-C2))*Q2 ' 便宜数量
4=(M2-C2)/((D2-M2)+(M2-C2))*Q2 ' 昂贵数量
51def alligation(c, d, m, q=None):
2 if not (c < m < d):
3 raise ValueError("need cheaper < target < dearer")
4 cheaper_parts, dearer_parts = d - m, m - c
5 total = cheaper_parts + dearer_parts
6 if q is None:
7 return cheaper_parts, dearer_parts
8 return cheaper_parts / total * q, dearer_parts / total * q
91function alligation(c, d, m, q) {
2 if (!(c < m && m < d)) throw new Error("need cheaper < target < dearer");
3 const cheaper = d - m, dearer = m - c, total = cheaper + dearer;
4 return q == null
5 ? { cheaper, dearer }
6 : { cheaperAmount: (cheaper / total) * q, dearerAmount: (dearer / total) * q };
7}
81double[] alligation(double c, double d, double m, double q) {
2 if (!(c < m && m < d)) throw new IllegalArgumentException("need c < m < d");
3 double cheaper = d - m, dearer = m - c, total = cheaper + dearer;
4 return new double[] { cheaper / total * q, dearer / total * q };
5}
61(double cheaper, double dearer) Alligation(double c, double d, double m, double q)
2{
3 if (!(c < m && m < d)) throw new ArgumentException("need c < m < d");
4 double cp = d - m, dp = m - c, total = cp + dp;
5 return (cp / total * q, dp / total * q);
6}
71#include <stdexcept>
2#include <utility>
3std::pair<double, double> alligation(double c, double d, double m, double q) {
4 if (!(c < m && m < d)) throw std::invalid_argument("need c < m < d");
5 double cheaper = d - m, dearer = m - c, total = cheaper + dearer;
6 return { cheaper / total * q, dearer / total * q };
7}
81func Alligation(c, d, m, q float64) (float64, float64, error) {
2 if !(c < m && m < d) {
3 return 0, 0, errors.New("need c < m < d")
4 }
5 cheaper, dearer := d-m, m-c
6 total := cheaper + dearer
7 return cheaper / total * q, dearer / total * q, nil
8}
91fn alligation(c: f64, d: f64, m: f64, q: f64) -> Option<(f64, f64)> {
2 if !(c < m && m < d) { return None; }
3 let (cheaper, dearer) = (d - m, m - c);
4 let total = cheaper + dearer;
5 Some((cheaper / total * q, dearer / total * q))
6}
71function alligation($c, $d, $m, $q) {
2 if (!($c < $m && $m < $d)) throw new InvalidArgumentException('need c < m < d');
3 $cheaper = $d - $m; $dearer = $m - $c; $total = $cheaper + $dearer;
4 return [$cheaper / $total * $q, $dearer / $total * $q];
5}
61def alligation(c, d, m, q)
2 raise ArgumentError, "need c < m < d" unless c < m && m < d
3 cheaper, dearer = d - m, m - c
4 total = cheaper + dearer
5 [cheaper / total * q, dearer / total * q]
6end
71alligation <- function(c, d, m, q) {
2 stopifnot(c < m, m < d)
3 cheaper <- d - m; dearer <- m - c; total <- cheaper + dearer
4 c(cheaper = cheaper / total * q, dearer = dearer / total * q)
5}
6常见问题
如果目标不在两个值之间怎么办? 那么它们的任何混合都无法达到——一个30物品的混合总是在30之间。该工具标示这个而不是返回虚假的比例。
单位重要吗? 不重要。比例只取决于一个一致标度上的差值,所以价格、百分比和mg/mL都可以用——只需保持所有三个输入在同一单位。
我能用它处理三个或更多成分吗? 这个工具处理两个成分的情况。有三个或更多成分的问题有很多有效的答案,通常通过配对成分或线性方程求解。
配比法和加权平均是一样的吗? 它们互为反函数。加权平均(配比法中位)把数量转成混合值;配比法替代把目标值转成数量。
资源
- Alligation — Wikipedia — 配比法替代和中位的定义及底层规则。
- Alligation Calculator — Omni Calculator — 用于药学的基于浓度的形式,带有完整示例。
- Pharmaceutical calculations by alligation method — EGPAT — 配比十字的一阶原理演练以进行配制。