Оценить стоимость монет в денежном мешке
Мешок новых монет США украден из банка. Не открывая мешок, что можно сказать о денежной стоимости его содержания? Одним из очевидных и легко измеримых физических характеристик является вес мешка. Предполагая, что мешок монет весит один фунт, нововведение Wolfram Knowledgebase по валютам, а также встроенные способности решать линейные уравнения могут быть использованы для определения примерной стоимости украденных монет.
Для начала изучим список монет США в текущем обращении с помощью неявно определенного класса сущностей в Wolfram Knowledgebase.

EntityClass["CurrencyDenomination", {EntityProperty[
"CurrencyDenomination", "IssuingCountry"] ->
Entity["Country", "UnitedStates"],
EntityProperty["CurrencyDenomination", "Format"] -> "coin"}]

Разверните класс сущностей, нажав [+], чтобы найти его составляющие, а также отсортировать их по значению.

coinsUS = EntityList[
EntityClass[
"CurrencyDenomination", {
EntityProperty[
"CurrencyDenomination", "IssuingCountry"] -> Entity[
"Country", "UnitedStates"],
EntityProperty["CurrencyDenomination", "Format"] -> "coin"}]] //
SortBy[#[EntityProperty["CurrencyDenomination", "Value"]] &]

Теперь создадим коллаж из изображений монет.

ImageCollage[
EntityValue[coinsUS,
EntityProperty["CurrencyDenomination", "Image"]],
Background -> White]

Обобщим свойства монет в таблице.

TextGrid[{ImageResize[#2, 60], #1,
Row[Riffle[#3, Style[" | ", Gray]]]} & @@@
EntityValue[
coinsUS, {EntityProperty["CurrencyDenomination", "Entity"],
EntityProperty["CurrencyDenomination", "Image"],
EntityProperty["CurrencyDenomination", "PeopleOnCurrency"]}],
Alignment -> {Left, Center}, Dividers -> All] // TraditionalForm

Рассмотрим номиналы монет (в центах) и массы (в граммах) и преобразуем массы рациональные числа.

{values, masses} =
Transpose[EntityValue[coinsUS, {"Value", "Weight"}]]


coinsandweights = Transpose[{
QuantityMagnitude[UnitConvert[values, "USCents"]],
Rationalize[QuantityMagnitude[N[UnitConvert[masses, "Grams"]]]]
}]


lcm = LCM @@ Denominator[Rationalize[coinsandweights][[All, 2]]];

rationalcoinweights = lcm #2 & @@@ Rationalize[coinsandweights]

Найдем все распределения монет, которые сопоставимы с весом в однин фунт с допустимым пределом ошибки в ± 0,1% (предположим, что вес мешка не значителен).

meanWeight =
QuantityMagnitude[UnitConvert[Quantity[1, "Pounds"], "Grams"]];

error = Normal[Quantity[0.1, "Percent"]];

{minScaledWeight,
maxScaledWeight} = {Floor[lcm meanWeight (1 - error/2)],
Ceiling[lcm meanWeight (1 + error/2)]}

Воспользуемся функцией FrobeniusSolve чтобы определить все возможные комбинации монет, дающие необходимый общий вес.

Flatten[allSolutions, 1] // Length

Найти минимальное, среднее, и максимальное значения общей денежной стоимости монет в сумке (предполагается, что все комбинации монет одинаково вероятны).

Создадим гистограмму распределения общей стоимости монет.

Histogram[dollarValues, Automatic, "PDF",
AxesLabel -> {Quantity[None, "USDollars"], "fraction"}]

Распределение веса довольно однородно.

Histogram[weightvalues, 50, "PDF",
AxesLabel -> {Quantity[None, "USDollars"], "fraction"}]

Отобразим на графике распределение количества монет.

Histogram[Total /@ Flatten[allSolutions, 1], {5}]

Покажем бивариантное распределение денежной стоимости по отношению к количеству монет в мешке.

Histogram3D[{coins.#/100., Total[#]} & /@ Flatten[allSolutions, 1],
AxesLabel -> {Quantity[None, "USDollars"], "coins"}]
