Численное дифференцирование с использованием 9 точек данных - PullRequest
4 голосов
/ 28 марта 2012

У меня проблемы, когда я пытаюсь провести численное дифференцирование в Matlab. Но мой вопрос может касаться меня больше о численном анализе, чем о Matlab.

У меня есть массив с 9 точками данных, который представляет f (x) для 9 различных x. Мне нужно найти f '' (x) численно. Значения, которые я имею для x и f (x), равны

x = [2271,38, 2555,30, 2697,26, 2768,24, 2839,22, 2910,20, 2981,18, 3123,14, 3407,06]

f (x) = [577,4063, 311,3341, 193,0833, 141,3048, 95,1501, 58,8130, 32,4931, 6,9511, 0,1481]

и я могу интерполировать, чтобы получить плавную кривую. Я использую сплайн-интерполяцию, но предпочтительнее ли использовать какую-либо другую интерполяцию, когда вы собираетесь проводить различие?

Я пробовал разные методы:

Просто простые передние, обратные и центральные разности

Вейвлет-метод: http://www.mathworks.com/matlabcentral/fileexchange/13948-numerical-differentiation-based-on-wavelet-transforms

и набор производных: http://www.mathworks.com/matlabcentral/fileexchange/13490-adaptive-robust-numerical-differentiation

Не все это работало удовлетворительно. Вторая производная очень нестабильна в отношении длины шага, и адаптивный метод в наборе производных работает ужасно плохо. Может быть, я просто использую это неправильно!

Любая помощь приветствуется!

Заранее спасибо

Ответы [ 2 ]

9 голосов
/ 28 марта 2012

Я полагаю, что именно вы задали аналогичный вопрос на MATLAB Central на днях. Вы не разместили свои данные там, поэтому я не мог дать хороший ответ.

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

Используя этот набор точек, я решил оценить сплайн-модель, используя мой SLM toolbox .

x = [2271.38, 2555.30, 2697.26, 2768.24, 2839.22, 2910.20, 2981.18, 3123.14, 3407.06];
f = [577.4063, 311.3341, 193.0833, 141.3048, 95.1501, 58.8130 32.4931, 6.9511, 0.1481];

Прежде всего, нанесите данные. Что я могу узнать из этого сюжета? Могу ли я сделать какие-либо выводы?

pure data plot

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

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

slm = slmengine(x,f,'plot','on','decreasing','on','knots',20, ...
    'concaveup','on','endconditions','natural');

slmengine предназначен для получения информации от вас, в форме предписаний для формы кривой. Вы обнаружите, что, предоставляя такую ​​информацию, она значительно упорядочивает форму результата, чтобы соответствовать вашим знаниям о процессе. Здесь я только что сделал несколько предположений о форме кривой из ваших комментариев.

В приведенном выше звонке я поручил SLM:

  • сделать график результата, когда закончите
  • создать монотонно убывающую функцию x
  • используйте 20 одинаково расположенных узлов
  • заставляет кривую иметь всюду положительную вторую производную
  • установить вторые производные в конце равными нулю

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

curve and data

Здесь мы видим, что подгонка кривой является разумным приближением к тому, что вы ищете.

Как насчет второго деривата? Конечно, SLM - это кусочно-кубический инструмент. Поэтому вторые производные являются только кусочно-линейными. Это проблема? Вы попросите меня предоставить инструмент для сплайнов более высокого порядка? Жаль, но нет, я не буду. Эти производные более высокого порядка слишком слабо оценены, чтобы запрашивать очень гладкий результат. На самом деле, я был бы вполне доволен этим прогнозом. Обратите внимание, что глюки во второй производной были последовательными. Если бы я использовал больше узлов или меньше, они все еще были там. Это хороший способ узнать, является ли фигура, которую вы видите, особенностью кривой или просто артефактом размещения узлов.

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

2nd derivative

Если я хочу попытаться получить более плавную оценку второй производной, просто используйте больше узлов. УУЗР относительно быстрый. Таким образом, с 50 узлами мы получаем очень похожий результат для второй производной кривой.

2nd derivative, 50 knots

Вы можете найти SLM (здесь) на MATLAB Central. Требуется набор инструментов оптимизации.

1 голос
/ 28 марта 2012

Это расширенный комментарий, а не ответ:

Что вы знаете о функции, которая генерирует эти точки?Если, например, у вас есть веские основания полагать, что это полином степени 2, то первым шагом будет поиск полинома степени 2, который наилучшим образом соответствует вашим точкам, а затем возьмите вторую его производную.Если вы думаете, что сплайн (в некотором роде) является лучшим описанием f, то подгоните сплайн.

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

Если у вас нет знаний о функции, вы можете подобрать любую кривую, которая даст вам результаты, которые вам нравятся- только не обманывай себя, что у тебя есть вторая производная функции.У вас будет 2-я производная функции, которую вы выбрали, но у вас не будет больше знаний о 2-й производной функции, которая создала ваши данные, чем вы имели в начале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...