2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Исторические примеры ошибок при численном дифференцировании
Сообщение28.03.2016, 15:09 
Заслуженный участник
Аватара пользователя


26/01/14
4846
Как известно, операция дифференцирования является некорректной (оператор $G(f)=f^\prime$ в пространстве $C[a,b]$ разрывен в любой точке). В связи с этим, в численных методах дифференцирования шаг дискретизации надо выбирать в зависимости от погрешности, с которой известна дифференцируемая функция, и нельзя брать слишком маленьким. В этом существенное отличие, например, от численного интегрирования, где чем меньше шаг дискретизации, тем лучше.

В книге
Бахвалов, Жидков, Кобельков. "Численные методы"
по этому поводу приводится такая история.

Цитата:
При решении одной задачи управления имела место следующая ситуация. Управление объектом выбиралось в зависимости от его скорости движения в данный момент; скорость вычислялась по простейшей формуле численного дифференцирования как отношение приращения координат к промежутку времени $\delta t$ между двумя последовательными моментами измерения положения объекта.

Перед непосредственным конструированием системы было произведено подробное моделирование её работы с помощью ЭВМ: координаты объекта брались со случайными погрешностями измерения и т.д.

Численные эксперименты показывали, что объект должен всё время резко менять направление движения и требуемое управление движением нереализуемо. Однако уменьшение промежутка $\delta t$ не приводило к улучшению дела. В данном конкретном примере проблема была решена путём увеличения промежутка $\delta t$ в $100$ раз по сравнению с предполагавшимся заранее. Попутно это привело к снижению стоимости управляющей системы.


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

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

 Профиль  
                  
 
 Re: Исторические примеры ошибок при численном дифференцировании
Сообщение28.03.2016, 22:53 


05/09/12
2587
Вот вам живой исторический пример: пару лет назад задумал я сделать балансирующего акробота (это не опечатка, а слово такое) с управлением в межзвенном шарнире - такая вертикально стоящая доска с вертикально качающимся маятником, балансирующая за счет этого маятника. Управление двигателем, расположенным в точке соединения звеньев. Можете погуглить. Почитал Формальского (теорию), составил систему диффуров, описывающую данную конструкцию, заложил ее в Матлаб (попутно самостоятельно навелосипедив собственную процедуру решения системы диффуров, т.к. лень было разбираться с библиотечными реализациями Рунге-Кутт), линеаризовал систему, рассчитал оптимальное управление, в модели все регулируется отлично (где-то в Механике и Технике есть тема). Потом начал вводить реальные погрешности. которые дадут мои датчики - первое звено (угол наклона и угловая скорость) планировал измерять гироскопом и акселерометром, межзвенный угол и его производную - энкодером на выходном валу редуктора двигателя. Но тот энкодер максимально дает разрешение 1024 значения на оборот. Введя эти погрешности в модель, я увидел, что ошибка определения производной межзвенного угла достаточно велика и вносит существенные шумы в сигнал управления. Их можно сгладить фильтрацией (хоть КИХ, хоть БИХ), но при этом возрастет задержка измеренной производной или выходного сигнала управления.
Все это не фатально, просто уменьшается область достижимости (область в фазовом пространстве, из которой данное управление выводит систему в целевую точку). И решать проблемы численного дифференцирования можно разными путями - от различных сглаживаний, взятия бОльшего интервала (или количества точек) - что ведет к увеличению времени задержки значения этого параметра по сравнению с реальным временем, а можно ставить дополнительные специализированные датчики - например, гироскопы (или прочие тахометры), которые изначально измеряют именно производную параметра (например, угловую скорость).
Но я не воплотил в железе этот проект, увлекся другими. Хотя в как раз данный момент я хочу воплотить другой, более простой проект - ПИД регулятор балансирования однозвенного обратного маятника на тележке, угол отклонения буду определять по напряжению с переменного резистора, производную считать численно. Понимаю, что будут шумы, но их частично сгладит аналоговый ФНЧ после датчика. Такая конструкция имеет множество реализаций, например вот одна из них: http://ww1.microchip.com/downloads/en/A ... 00964A.pdf
В описании сказано, что частота опроса датчика - 256Гц, но для расчета производной берутся не соседние отсчеты, а диапазон в 3 раза больше (разница текущего и пред-пред-предыдущего отсчетов) - так же, как и в вашем примере.

 Профиль  
                  
 
 Re: Исторические примеры ошибок при численном дифференцировании
Сообщение29.03.2016, 00:16 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Mikhail_K в сообщении #1109859 писал(а):
Эта назидательная история мне очень понравилась, и её стоит использовать в преподавании. Однако, здесь слишком мало деталей. Что это был за "объект", для которого создавалась "управляющая система"? Это был какой-то робот или... что?

Обычно речь о ракетах и самонаводящихся ракетах. Сами понимаете, тема достаточно секретная, чтобы обходить её обиняками.

 Профиль  
                  
 
 Re: Исторические примеры ошибок при численном дифференцировании
Сообщение29.03.2016, 11:12 


01/11/14
195
Mikhail_K в сообщении #1109859 писал(а):
В связи с этим, в численных методах дифференцирования шаг дискретизации надо выбирать в зависимости от погрешности, с которой известна дифференцируемая функция, и нельзя брать слишком маленьким.

В связи с этим нужно ставить корректную задачу, а не применять «численные методы дифференцирования» там, где их нельзя применять.
За примерами далеко ходить не нужно. Чаще всего специалисты по линейным устройствам преобразуют сигналы, заменяя производные на разности, «объясняют», что все будет нормально работать, а потом для устранения неконтролируемых погрешностей предлагают ставить какие-либо примочки. Изменение шага дискретизации, преобразование ФНЧ – это попытки скорректировать «неизвестно, что получилось».

Желание включить в какой-либо оператор производную в таких случаях, как правило, возникает из эвристических соображений по измерению «скорости роста», а желание сгладить фильтром – из соображений об ограниченности спектра сигнала.

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

Итак, если нужно получить что-то хорошее, нужно корректно ставить задачу синтеза, по крайней мере, в классе причинных операторов.

PS. Кстати, получить оператор вычисления производной в интегральном виде для класса функций с ограниченным спектром весьма просто. Интересно при этом посмотреть на оценки погрешностей приближенного вычисления производной при конечных задержках.

 Профиль  
                  
 
 Re: Исторические примеры ошибок при численном дифференцировании
Сообщение29.03.2016, 14:50 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Тут надо понимать, что на практике обычно "быстрые и топорные" решения имеют успех, а если стремиться сделать всё "долго и правильно", то это не будет устраивать заказчика. Ограничения по срокам, финансам, людям, другим ресурсам, по простоте конструкции - куда важнее презрения к тому, что "получилось неизвестно что".

 Профиль  
                  
 
 Re: Исторические примеры ошибок при численном дифференцировании
Сообщение29.03.2016, 18:27 


01/11/14
195
Munin,
совершенно не хотел обозначать какого-либо презрения к разработчикам систем на основе «не совсем строго обоснованных эвристических подходов». Если получилось грубовато, то (прошу извинить) – это как бы в продолжение дискуссий по таким вопросам. Эти обсуждения, бывало, проходили в резких тонах, но в целом это был дружный коллектив и общепримиряющей была позиция: «лучшее – враг хорошего».

 Профиль  
                  
 
 Re: Исторические примеры ошибок при численном дифференцировании
Сообщение29.03.2016, 19:51 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Ну, в общем, я к тому, что на практике зачастую бывает, что сначала разрабатывают систему "эвристически", успешно, ставят на вооружение, и только потом приходят критики с большой и правильной математической теорией... вот только дешевле и эффективнее улучшить то, что уже есть, чем делать всё "правильно" с нуля.

Иногда бывает, что "правильные теоретики" заправляют делом с самого начала... и иногда такие проекты становятся даже удачными - но вот это бывает редко. Чаще, подобный перфекционизм приводит к перегруженности проекта, к затягиванию сроков до бесконечности.

Ну а дружный коллектив и "лучшее - враг хорошего" - это хорошо, конечно же.

 Профиль  
                  
 
 Re: Исторические примеры ошибок при численном дифференцировании
Сообщение29.03.2016, 20:02 
Заслуженный участник
Аватара пользователя


26/01/14
4846
Iam в сообщении #1110233 писал(а):
совершенно не хотел обозначать какого-либо презрения к разработчикам систем на основе «не совсем строго обоснованных эвристических подходов».

Боюсь, что Вы ошибаетесь, думая, что выбор шага дискретизации численных методов дифференцирования в зависимости от уровня погрешности дифференцируемой функции - это "не совсем строго обоснованный эвристический подход". Есть строгая теория на этот счёт.

Пусть точная функция $f\in C^2[a,b]$ (дважды непрерывно дифференцируема на $[a,b]$) и надо найти её производную $f^\prime(x_0)$ в точке $x_0\in[a,b)$. Пусть вместо точной функции $f$ нам известно её приближение $f_\delta\in C[a,b]$, причём известно, что $\|f_\delta-f\|_{C[a,b]}<\delta$, где $\delta$ - уровень погрешности дифференцируемой функции. Тогда в качестве приближения к $f^\prime(x_0)$ можно взять
$$
\frac{f_\delta(x_0+h)-f_\delta(x_0)}{h},
$$
где шаг дискретизации нужно выбирать по формуле $h=h(\delta)=C_1\sqrt{\delta}$. Тогда величина ошибки оценивается:
$$
\Bigl|\frac{f_\delta(x_0+h)-f_\delta(x_0)}{h}-f^\prime(x_0)\Bigr|\leq C_2\sqrt{\delta}.
$$
Константа $C_2$ зависит от $C_1$. Если известен максимум модуля второй производной точной функции $f$ или какая-либо его оценка (извлекаемая из физических соображений), можно найти оптимальную константу $C_1$ и соответствующую ей $C_2$. Но даже если это неизвестно, понятно, каким по порядку надо выбирать шаг дискретизации: $h\sim\sqrt{\delta}$, и понятно, что при увеличении точности измерения функции $f$ (т.е. при $\delta\to 0$) точность метода тоже будет стремиться к нулю со скоростью $\sqrt{\delta}$.
К сожалению, затрудняюсь Вам сейчас привести литературу, где бы это было наиболее внятно изложено. Но всё это легко вывести своими руками, там используется разложение функции $f$ по формуле Тейлора с остаточным членом.

Разумеется, это всё обобщается и на более сложные методы численного дифференцирования. Более того, дифференцирование - не единственная некорректная задача, для которой это работает. Так можно решать и интегральные уравнения Вольтерра первого рода, обычной дискретизацией, но выбирая шаг дискретизации особым образом в зависимости от уровня погрешности входных данных. Это называется "саморегуляризация", и здесь тоже есть строгая теория. Это вовсе не эвристический метод.

 Профиль  
                  
 
 Re: Исторические примеры ошибок при численном дифференцировании
Сообщение30.03.2016, 01:11 


01/11/14
195
Mikhail_K,
Обозначу некоторые сомнительные для меня моменты.
1. Правильно ли я полагаю, что функция $f$ неизвестна, исходными данными являются: максимум модуля ее второй производной, функция $f_{\delta},$, а также значения $a, b, \delta. $? При этом значение $C_1$ определяется лишь на основании исходных данных задачи.
2. Пусть, например, $f_{\delta}=f+ \varepsilon$ ($\varepsilon$ подобрано, как надо). Тогда для получения наилучшей оценки нужно $h \to 0$.(?) Откуда здесь возьмется указанное оптимальное значение $h$ ?
3. Другая ситуация. Пусть $f(x)= \varepsilon \sin(kx/\varepsilon), f_{\delta}(x) \equiv 0. $ Какое здесь оптимальное значение $h $?
4. Почему речь идет о «шаге дискретизации». Разве $h$ постоянна для всего отрезка? Что при этом оптимизируется: максимальная по функциям $f_{\delta}, f$ и точкам $x_0$ погрешность вычисления производной, средняя погрешность или что-нибудь другое? Как быть с точками в $ (b-h,b]$?
5. Если, например, мы хотим минимизировать погрешность (в каком-то смысле) вычисления производной, то почему оператор строится в таком виде? Это лучший оператор в классе линейных или по какой-то другой причине?

 Профиль  
                  
 
 Re: Исторические примеры ошибок при численном дифференцировании
Сообщение30.03.2016, 09:51 
Заслуженный участник
Аватара пользователя


26/01/14
4846
Iam в сообщении #1110419 писал(а):
Mikhail_K,
Обозначу некоторые сомнительные для меня моменты.
1. Правильно ли я полагаю, что функция $f$ неизвестна, исходными данными являются: максимум модуля ее второй производной, функция $f_{\delta},$, а также значения $a, b, \delta. $? При этом значение $C_1$ определяется лишь на основании исходных данных задачи.
2. Пусть, например, $f_{\delta}=f+ \varepsilon$ ($\varepsilon$ подобрано, как надо). Тогда для получения наилучшей оценки нужно $h \to 0$.(?) Откуда здесь возьмется указанное оптимальное значение $h$ ?
3. Другая ситуация. Пусть $f(x)= \varepsilon \sin(kx/\varepsilon), f_{\delta}(x) \equiv 0. $ Какое здесь оптимальное значение $h $?
4. Почему речь идет о «шаге дискретизации». Разве $h$ постоянна для всего отрезка? Что при этом оптимизируется: максимальная по функциям $f_{\delta}, f$ и точкам $x_0$ погрешность вычисления производной, средняя погрешность или что-нибудь другое? Как быть с точками в $ (b-h,b]$?
5. Если, например, мы хотим минимизировать погрешность (в каком-то смысле) вычисления производной, то почему оператор строится в таком виде? Это лучший оператор в классе линейных или по какой-то другой причине?

1) Да. И $C_2$ тоже определяется.
Можно иметь в исходных данных не максимум модуля второй производной точной функции $f$, а какую-нибудь его верхнюю оценку.
2) Ну, в этом случае формула с оптимальным выбором $h(\delta)$ даст результат, конечно, похуже, чем если взять $h$ сильно поближе к нулю. Но суть в том, что формула с оптимальным выбором $h(\delta)$ нам даёт гарантированную точность метода, и эта гарантированная точность как раз оптимальна, какой бы на самом деле ни была функция $f$. Ведь когда нам дана функция $f_\delta$, мы не можем знать, чему равна функция $f$: то ли $f(x)=f_\delta(x)-\varepsilon$, то ли нет. Выбирая сильно маленький $h$, мы, конечно, выигрываем по сравнению с оптимальной формулой - в одних случаях, но зато проигрываем, и сильно проигрываем в других.
При выборе $h$ сильно маленьким вне зависимости от $\delta$, нет никакой гарантированной точности, результат может оказаться чрезвычайно далёким от настоящей производной. А при моём выборе $h$, эта гарантированная точность не просто существует, но и неограниченно возрастает (т.е. погрешность метода стремится к нулю) при $\delta\to 0$.
3) Здесь $f(x)$ - плохая, сильно колеблющаяся функция, вторая производная у неё велика. Поэтому константа $C_2$ у неё велика. Ясно, что формула даст приближённое значение $0$ для производной, какое бы $h(\delta)$ ни было, ясно, что здесь формула сильно ошибается - но и оценка точности метода того позволяет. Но это не значит, что метод не работает. Надо просто измерить эту функцию $f$ с гораздо большей точностью, чем $\varepsilon$, тогда $f_\delta$ уже не сможет быть равной нулю, тогда метод будет давать более точный результат.
Короче: метод вовсе не обязан сходиться, если дана последовательность функций $f$ (всё более плохих) и фиксированная $f_\delta$. Метод обязан сходиться, только если есть одна $f$ и дана последовательность стремящихся к ней $f_\delta$. Чем хуже $f$ (в смысле максимума второй производной), тем медленнее сходится метод (с большей константой $C_2$ при $\sqrt{\delta}$ в оценке точности), тем меньшее $\delta$ нужно для того, чтобы формула имела приемлемую точность.
4) $h(\delta)$ зависит только от $\delta$ и не зависит от точки $x_0$ отрезка, в которой вычисляется производная. Ясно, что формула просто не даёт ответа для $x_0\in(b-h(\delta),b]$. Это не так страшно, потому что $h(\delta)\to 0$ при $\delta\to 0$.
Насчёт того, что оптимизируется. Вообще-то, всё, что я хотел показать - это то, что есть резон выбирать $h$ в зависимости от $\delta$, и при этом мы получаем гарантированную точность метода, неограниченно возрастающую при $\delta\to 0$; я не хотел сказать, что этот метод - наилучший из возможных, и не ставил такой задачи. А вообще-то оптимизируется гарантированная точность метода, какими бы ни были $f$, $f_\delta$, $x_0$.
Про "шаг дискретизации" - я так назвал $h$ ещё вот почему. Можно это всё обобщить и на более сложные формулы численного дифференцирования, которые бы использовали информацию не только о $f_\delta(x)$ и $f_\delta(x+h)$, но и о значениях $f_\delta(x+jh)$ в некотором диапазоне $j$ вблизи нуля (все $j$ целые).
5) Ну конечно нет, просто это формула, первой пришедшая мне на ум и для которой я на листе бумаги сходу нашёл оптимальный выбор $h(\delta)$ и оценку гарантированной точности метода с таким выбором.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Модераторы: Модераторы, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group