#matlab #interpolation #mathematical-optimization #polynomial-math #curve-fitting
#matlab #интерполяция #математическая оптимизация #полином-математика #подгонка кривой
Вопрос:
У меня проблема, когда я подгоняю многочлен высокого порядка к (не очень) зашумленным данным, используя линейные наименьшие квадраты. В настоящее время я использую полиномиальные порядки около 15-25, которые работают на удивление хорошо: зависимость очень близка к линейной, но точность моделирования «очень близка» имеет решающее значение. Я использую функцию Matlab polyfit() и (очевидно) нормализуюx-данные. Обычно это работает нормально, но я столкнулся с проблемой с некоторыми недавними наборами данных. Подогнанный многочлен имеет экстремумы в интервале x-данных. Для приложения, над которым я работаю, это не-нет. Полиномиальная модель не должна иметь стационарных точек на x-интервале.
Итак, мне нужно добавить ограничение к задаче наименьших квадратов: производная подобранного многочлена должна быть строго положительной в известном диапазоне x (или строго отрицательной — это зависит от данных, но простая линейная подгонка быстро скажет мне, что это такое.) Я быстро просмотрел доступные функции панели инструментов оптимизации, но признаю, что не знаю, как это сделать. У кого-нибудь есть какие-либо предложения?
[Я понимаю, что для этих данных, вероятно, существуют лучшие модели, чем полиномы, но в краткосрочной перспективе изменить форму модели невозможно]
[Заключительное замечание: я наконец-то получил добро на замену этой ужасной полиномиальной модели! Я собираюсь применить непараметрический подход, сглаживание сплайнов, используя превосходный код SPLINEFIT Йонаса Лундгрена. Преимущество этого в том, что я уже использую сплайновую модель в приложении конечного пользователя, поэтому у меня уже есть код на C # для оценки сплайновой модели]
Комментарии:
1. Полиномы высокого порядка не всегда являются ответом, и у них есть своя доля проблем . Цитируя автора этого сообщения (@woodchips), иногда это помогает «разбить проблему и использовать меньшие сегменты полиномов низкого порядка, собранные вместе»…2. Да, действительно. Хотя я аппроксимирую, а не интерполирую, многочлен, как правило, не лучший способ. К сожалению, моя проблема «выросла» из попытки смоделировать относительно небольшую, плавно изгибающуюся часть базового физического процесса в более расширенную область. Мой код Matlab создает модель, которая используется производственным кодом на C #, и ее сложнее изменить. Я написал предложение по повторной реализации модели с использованием сети радиальных базисных функций, но пока (если) это не будет принято, мне нужен способ укротить мои полиномы!
3. Полиномы высокого порядка не являются хорошим решением по МНОГИМ причинам. Оставаясь с ними по инерции, вполне может вызвать у вас много проблем в будущем. Причина, по которой я не ответил на ваш вопрос, заключалась в том, что вы отказались меняться. Моим ответом было бы использовать инструмент моделирования, который позволит вам легко указывать такие вещи, как монотонность, положительность, точки фиксации и т. Д. Мой slmengine делает именно это. Но если вы не хотите меняться, нет причин тратить мое или ваше время.
4. Причина не в инерции! Я должен запросить бюджет, чтобы изменить не только мой код Matlab, но и развернутое прикладное программное обеспечение, которое зависит от формы модели. Ответ, как всегда, нет, потому что «это работает». За исключением того, что все чаще это не так. В любом случае, это была вчерашняя проблема. Радость быть всего лишь одним из 110 000 сотрудников…
5. Можете ли вы привести пример? По крайней мере, показать график?
Ответ №1:
Вы могли бы использовать cftool и использовать опцию исключить точки данных.
Комментарии:
1. Нареш — я использую набор инструментов оптимизации, а не набор инструментов для подгонки кривой. Процесс подгонки выполняется автоматически (на подгонку приходится около 500 точек данных) и уже использует надежные методы для уменьшения выбросов в данных