Pull to refresh

Comments 22

В ответе на этот комментарий я буду перечислять все изменения в статье, чтобы желающим можно было это отслеживать. Так что на этот комментарий просьба не отвечать.
Вы уж не серчайте, но все это, за исключением интерполяции методом Лагранжа и логарифмической шкалы, математика и программирование 8ого класса средней школы с уклоном в информатику. По меньшей мере я и многие мои друзья это делать умели. В НТУУ КПИ ФИВТ такое учат на первом курсе.

По исходникам, возьму на себе смелость рекомендовать книгу «Совершенный код», а не критиковать их.

Как-то сложненько вы простенькие вещи описали. ИМХО.

В целом, при чтении, ошибок не обнаружил (плотность чтения уменьшалась по мере продвижения), разве что не уверен в корректности такой вот записи: X = X(t). Вот скажите, в это формуле X это переменная или функция? Может одно из них на X' заменить?
Я не для математиков эту статью писал, а все-таки для программистов. Ну и у нас в ГУМАНИТАРНОЙ школе о преобразованиях функций вообще ничего не говорили. В институте тоже об этом как-то не особенно… Так что я сам доростал — и хотел помочь таким же.

«Совершенный код» я читал и ни капли не критикую.

X', насколько нас учили, это все-таки производная. А вообще, какой символ выбрать — дело такое… условное. Главное, чтобы все под ним понимали одно и то же. По идее, увидев запись «X=X(t)», будет очевидно, что X это все-таки функция — но от аргумента t. А от аргумента w это будет просто переменная — логично ;-)?
Определенно статья будет многим полезна, я даже плюс поставил. Но для гуманитариев нужно было бы полегче писать.

Если хотите, могу написать критику кода.

f '(x) — производная f (x), а X` (икс штрих) — константа, переменная, что угодно. Если в вашем примере X — это функция, то она с переменным числом аргументов и вы присваиваете функции с разными прототипами.
все это, за исключением интерполяции методом Лагранжа и логарифмической шкалы

Кстати, статья именно о логарифмической шкале — и в том числе стоит напомнить некоторые очевидные вещи, которые не так уж и очевидны, если внимательно в них вникнуть.
Запись вида x=x(t) очень часто встречается в физике и называется функциональной зависимостью x и t. Здесь t — независимая (свободная) переменная, x слева — зависимая переменная, x справа — функция.
У вас данные измерений подвержены ошибкам — случайному шуму и систематическим ошибкам, связанным с неидеальностью приборов. В таких ситуациях лучше применять не интерполяцию, которая проводит график строго через все точки измерений — а аппроксимацию, которая проводит график, вообще говоря, мимо измеренных точек, зато этот график плавный и, главное, больше похож на теорию, которая описывает изучаемую систему. При аппроксимации у вас количество параметров, задающих функцию, много меньше, чем при интерполяции, а также эти параметры (при правильном выборе модели) имеют прямое отношение к физической модели изучаемой системы.

Рекомендую почитать статью в Википедии «метод наименьших квадратов» и другие статьи, на которые она ссылается.
Автор в конце концов выбрал правильный метод.

МНК применим в том случае, когда нужно аппроксимировать неизвестную функцию по результатам эксперимента. А тут ситуация прямо противоположная: функция известна, надо всего лишь как-то описать. И лучше кусочно-линейной аппроксимации тут еще ничего не придумали.
Как раз наоборот, МНК позволяет найти параметры известной функции по результатам эксперимента. МНК не находит функцию — он позволяет найти лишь ее параметры. Функция задается а приори. На практике она либо известна экспериментатору заранее (из теории), либо подбирается методом проб. Скажем, можно менять степень аппроксимирующего полинома, либо добавлять в функцию какие-то нелинейные члены и потом смотреть, как это повлияет на результат аппроксимации.
МНК не находит функцию — он позволяет найти лишь ее параметры. Функция задается а приори


Вы путаете терминологию.
f(x) = ax^2 + bx + c (где a,b,c — неизвестные) — это не заданная функция. Это — неизвестная функция.
Если найти параметры (например, a=5, b=7, c=9), то получится f(x)=5x^2 + 7x + 9. Это — известная функция, мы нашли ее.

Если функция задана априори — нам не нужно искать ее параметры, потому что их не осталось. В методе наименьших квадратов априори функция не известна — известен лишь ее вид.

А в задаче автора функция как раз известна (но известна в табличной форме). Нет, тут бы МНК тоже подошел… если бы не тот факт, что вид зависимости «сопротивление -> температура» может быть произвольным (точнее, очень разным). И если бы не тот факт, что МНК при нелинейных зависимостях требует довольно нетривиальных алгоритмов.

Нет, для задачи интерполяции по готовой таблице значений традиционно используют именно кусочно-линейную аппроксимацию.
Вид зависимости R(t) обычно известен же. В редких случаях это не так.
Он как минимум разный для проводников и полупроводников.
А задачей автора изучение физики не являлось.
Если бы стояла такая задача — статья была бы написана другим человеком и выглядела бы по-другому.
Если зависимость почти линейная, то для МНК как бы не важно, пропорциональная она или нет. :)
Если же она сильно нелинейная, то это обычно известно до измерения.
Сказано же: сильно нелинейная. К тому же надо не «почти», а точно.
Чем хороша кусочно-линейная аппроксимация — точность можно напрямую регулировать числом точек в таблице. Нужно точнее — добавил точек. Нужно быстрее — убрал.
Я бы сказал, что задача, которую решал автор, до конца не понятна. «Загрузить график в микроконтроллер» — это про что, и причем здесь qt тогда? Если решали задачу визуализации данных с АЦП, то не ясно — почему не воспользовались готовыми решениями. Если занимались анализом данных, то где обработка всяческих ошибок и пр. радостей систем измерений? :)
Я бы сказал, что задача, которую решал автор, до конца не понятна

Кхм… По-моему, я в самом начале сказал:
«Понадобилось мне как-то сделать интерфейс для загрузки в микроконтроллер график функции «сопротивление -> температура»»
Что же еще надо в рамках темы интерполяция + шкала :-)?
Но, если кому интересно, — делаю я регулятор холостого хода для BMW моего друга. Там надо для данной температуры получить данные обороты (путем регулирования заслонки). Температура определяется резистором. Кривая «сорпотивление->температура» задается таблично. И вот — как это на экране корректно отобразить? Решению этой задачи статья и посвящена.
Если температура находится в пределах -40...+125 градусов, то измерять такую температуру лучше микросхемой, а не резистором. Например, MCP9700 в корпусе TO-92. Точность: +-2 градуса в диапазоне от 0 до 70 градусов, выход в виде напряжения, пропорционального температуре. Зависимость — линейная (на заводе все откалибровано). Цена — низкая. Имею опыт использования этой микросхемы, так что рекомендую.
Если у вас известных точек больше 3 и у функции нет скачков (т.е. вы не собираетесь иметь дело со сверхпроводимостью или фазовыми переходами), то лучше использовать сплайны. Если есть скачки, то лучше разбить интервал на части по температурам плавления/кипения/сверхпроводимости и других фазовых переходов и на каждом из них по отдельности использовать сплайны.
Для моей задачи плавность графика абсолютно не важна. Более того, допустима погрешность в 10% для любой точки — можно и кусочно-линейной обойтись :-)
Погуглил. Если бы на русском…
Sign up to leave a comment.

Articles