Подгонка (фиттирование), правильные ошибки |
Здравствуйте, гость ( Вход | Регистрация )
Подгонка (фиттирование), правильные ошибки |
![]()
Сообщение
#1
|
|
![]() Профессор ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Banned Сообщений: 3226 Регистрация: 3.4.2008 Из: СПб Пользователь №: 7086 Поблагодарили: 2602 раз(а) ![]() |
Вот замерил передвижения одного из столиков на своей установке. Устроено оно так: мотор крутит вал, через червячную передачу движение передаётся на движущуюся поверхность столика. Кроме того на валу сидит датчик, который считает обороты. Ну вот, интересно мне было, какое перемещение приходится на один шаг датчика и насколько оно равномерное. Набил данные и фиттирую их обычной линейной функцией. Фиттирую в программе root, там есть возможность использовать пакеты MINUIT и FUMILI и для контроля то же самое программой gnuplot. Как водится, все три результата разные (IMG:style_emoticons/default/smile.gif) То есть коэффициенты одинаковые получаются (поскольку зависимость линейная, можно было бы проверить по точным формулам линейной регрессии, но мне лень и я думаю, что здесь провраться сложно). А вот ошибки во всех трёх случаях отличаются. Может быть кто-то сразу может сказать, что чем-то пользоваться не следует, или не поленится отфиттировать данные программой, которой пользуется сам и сравнить результат, тоже было бы интересно. Мне представляется, что FUMILI правильную ошибку даёт, а MINUIT и gnuplot ошибку завышают, иногда на несколько порядков. Просто потому, что более точные значения попадают в менее точные в пределах трёх ошибок в случае FUMILI, как и положено. Параметр p0 сильно отличается в двух случаях, просто потому, что точка отсчёта другая была.
Более точные данные (измерено микрометром, 125 точек): ![]() Менее точные данные (измерено штангенциркулем, 9 точек): ![]() Фиттировал по формуле f(x)=p0+p1*x Результаты по более точным данным: FUMILI p0=-41.5134(+/-0.000162257) p1=0.0156692(+/-4.70252e-8) gnuplot p0=-41.5134(+/-0.0126) p1=0.0156692(+/-3.653e-6) MINUIT p0=-41.5134(+/-0.978949) p1=0.0156692(+/-2.83718e-4) Результаты по менее точным данным: FUMILI p0=2.72679(+/-0.0318153) p1=0.0156892(+/-1.58496e-5) gnuplot p0=2.72679(+/-0.1415) p1=0.0156892(+/-7.047e-5) MINUIT p0=2.72679(+/-0.628942) p1=0.0156892(+/-3.13323e-4) -------------------- Бог есть!
|
|
|
![]() |
![]()
Сообщение
#2
|
|
![]() Ректор ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Moderator Сообщений: 6489 Регистрация: 9.12.2006 Из: Моск. обл. Пользователь №: 3363 Поблагодарили: 12887 раз(а) ![]() |
У меня с OriginPro 8.0 получилось (для короткого набора данных): y = kx + b
k = 0.01511 (погрешность 0.61) и b = 3.43898 (погрешность 2.45х10^(-4)) Для большого набора: k = 0.01567 (погрешность 0.014) и b = -41.5024 (погрешность 4.1х10^(-6)) -------------------- I've never been clever, because need it never...
Поблагодарили:
|
|
|
![]()
Сообщение
#3
|
|
![]() Профессор ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Banned Сообщений: 3226 Регистрация: 3.4.2008 Из: СПб Пользователь №: 7086 Поблагодарили: 2602 раз(а) ![]() |
У меня с OriginPro 8.0 получилось (для короткого набора данных): y = kx + b k = 0.01511 (погрешность 0.61) и b = 3.43898 (погрешность 2.45х10^(-4)) Ориджин кажется не дошёл до самого минимума. Он по умолчанию делает сколько-то итераций и у него специальная кнопка есть, сделать ещё 10 итераций, какая-то такая (IMG:style_emoticons/default/smile.gif) И ещё, ориджин не умеет хорошо работать с параметрами, когда границы для них задаёшь. Если какой-либо параметр упирается в границу, то сходимость очень замедляется. Довольно давно правда я с этим экспериментировал. Когда-то я принялся FUMILI с фортрана на python переводить. У меня до сих пор есть эта версия, нашёл её, попытался с ней поэкспериментировать. Понял в чём ошибка. Старая, фортрановская версия обязательно требует задания ошибок каждого измерения. Если их задавать руками в root посчитанные ошибки отфиттированных параметров становятся совершенно одинаковыми. В частности, если для точных измерений ставить ошибку 0.01 (ну 0.01мм имеется в виду), то ошибка посчитанная и MINUIT и FUMILI параметра p1 становится равна 2.83718e-6 (по точным данным.) То есть, для минуита по умолчанию берутся единичные ошибки (поскольку отличие ровно на два порядка), для фумили непонятно какие. Что я с того времени запомнил, что FUMILI это программа, которая разрабатывалась и отлаживалась много лет---просто поразило сколько времени было потрачено только на эту одну задачу. Вот здесь вот про неё есть: http://wwwinfo.jinr.ru/programs/jinrlib/d510.htm Сама она в варианте на фортране есть в церновской библиотеке http://wwwasdoc.web.cern.ch/wwwasdoc/cernlib.html Раз уж я её раскопал (свою версию перевода FUMILI на python), хочу выложить, чтобы не пропадал труд. Может пригодится кому. Описание даже сделал, на английском почему-то (IMG:style_emoticons/default/smile.gif) Честно признаюсь, протестирована она была на одном единственном примере, но на этом примере результаты работы совпадали с результатами работы фортрановской версии и результатами работы минуита (IMG:style_emoticons/default/smile.gif) ![]() -------------------- Бог есть!
|
|
|
![]() ![]() |
Текстовая версия | Сейчас: 2.05.2025, 3:31 |