Линейка

Apr 03, 2015 12:33


Давно хотел показать этот "фокус".
Предположим у нас есть хорошая линейка с ценой деления 1 мм, точность их нанесения +- 0.1 мм с пренебрежимо малым средним отклонением. Говорят, при тоталитаризме металлические линейки гравировали из особой стали на спец.станках, даже с компенсацией температурного расширения. Цена деления, напоминаю, 1 мм. И надо измерить отрезок, длина которого 123,45 мм.

Что делает обычный человек ? Приложит ноль (металлические обычно обрезаны под 0 :-) к левому концу отрезка и увидит, что правый - скорее всего между 123 и 124. Дополнительная и, что особенно плохо, систематическая ошибка вкрадется в ходе придвигания нуля к концу отрезка.

Более продвинутый измеряльщик приложит линейку не заботясь о нуле, не сдвигая ее снимет два отсчета, например, 46 и 169, вычтет из правого левый, и доложит: 123. Или 124. Еще более продвинутый сделает 5..10 таких парных измерений прикладывая линейку каждый раз заново. И уже уверенно округлит среднюю разность до 123 мм.

Но если сделать много-много измерений точность повысится еще сильнее. Под катом имитация 10 серий по 10000 измерений.
Несложный перловый скрипт. В приницпе постоянные можно сложить в одну", и половину операторов тоже можно слить с другими, но поскольку имитация, то все сделано "как в жизни", каждый источник ошибки, каждая поправка проставлены "по месту".

$ДЛИНА = 123.45;
foreach $СЕРИЯ(1..10){
$СУММА = 0 ; $ИЗМЕРЕНИЙ = 10000;
foreach (1..$ИЗМЕРЕНИЙ){
$СДВИГ = 10 + 100*rand; # rand - случайное число в интервале от 0 до 1
$ОШИБКА_ГЛАЗ = 0.1 - 0.2*rand ; # это плюс-минус 0,1 мм
$ОШИБКА_ЛИНЕЙКИ = 0.1 - 0.2*rand ;
$ЛЕВ = $СДВИГ + $ОШИБКА_ГЛАЗ + $ОШИБКА_ЛИНЕЙКИ ;
$ОШИБКА_ГЛАЗ = 0.1 - 0.2*rand ;
$ОШИБКА_ЛИНЕЙКИ = 0.1 - 0.2*rand ;
$ПРАВ = $СДВИГ + $ДЛИНА + $ОШИБКА_ГЛАЗ + $ОШИБКА_ЛИНЕЙКИ ;
$ЛЕВ_ОТСЧЕТ = int ($ЛЕВ + 0.5); # int отбрасывает дробную часть, но если добавить 0,5
$ПРАВ_ОТСЧЕТ = int ($ПРАВ + 0.5); # получится округление до ближайшего целого
$СУММА += ( $ПРАВ_ОТСЧЕТ - $ЛЕВ_ОТСЧЕТ);
}
printf "%2g %10.5f\n", $СЕРИЯ, $СУММА/$ИЗМЕРЕНИЙ;
}
Получилось вот такое чудо

1 123.45200
2 123.44980
3 123.45650
4 123.45110
5 123.45380
6 123.45020
7 123.45200
8 123.45580
9 123.45500
10 123.45840
т.е. миллиметровой линейкой можно измерить наш отрезок с точностью до сотых долей миллиметра. Для этого надо всего лишь снять 20000 отсчетов :-)



Кажется - ерунда. Зачем это нужно ? Да, прямо вот так этот способ не используется, но есть реальные ситуации когда нужно получить более высокую точность, чем позволяет одно прямое измерение. Например есть очень размытое фото, надо узнать размеры объекта. На этом фото можно найти несколько тысяч пар пикселов, собрав статистику по которым, с хорошей точностью вычислим искомое.

Продолжение см.
http://vlkamov.livejournal.com/1540566.html

маленькие хитрости

Previous post Next post
Up