Числові похідні та коефіцієнти кінцевих різниць: будь-яке оновлення методу Форнберга?


11

Коли хочеться обчислити числові похідні, метод, представлений Бенгтом Форнбергом тут (і звіт про це тут ), дуже зручний (і точний, і простий у здійсненні). Як оригінальний документ датується 1988 роком, я хотів би знати, чи існує краща альтернатива сьогодні (як (чи майже як) проста та більш точна)?


1
Важко сказати, не знаючи, що ви хочете розмежувати. Чи розглядали ви автоматичну диференціацію ?
Biswajit Banerjee

@BiswajitBanerjee: Для кінцевих коефіцієнтів різниці автоматична диференціація не застосовується.
Джефф Оксберрі

@GeoffOxberry: Я мав на увазі фактичну фізичну проблему, тобто наукову частину "обчислювальної науки".
Biswajit Banerjee

@Vincent: Ви намагаєтесь диференціювати функцію чи таблицю? Якщо дані таблиці, шумні дані таблиці? Ви намагаєтесь дискретизувати PDE?
користувач14717

Відповіді:


9

Огляд

Хороше питання. Існує праця під назвою "Підвищення точності методу диференціації матриць для довільних точок колокації" Р. Балтенспергера. На мою думку, це не є великим питанням, але він має точку (про що було відомо ще до появи в 2000 році): він підкреслює важливість точного подання факту, що похідна постійної функції f(х)=1 повинна бути нульовим (це справедливо в математичному сенсі, але не обов'язково в числовому поданні).

Неважко побачити, що для цього потрібні суми рядків n-ї похідної матриці D(н) дорівнювати нулю. Загальноприйняти це обмеження можна шляхом коригування діагонального запису, тобто, встановивши

(1)Djj(н): =-i=1ijNDij.
Зрозуміло, що ця функція не відповідає точно під час роботи за комп’ютером через помилки округлення при розрахунках з плаваючою комою. Що більш дивно, що ці помилки стають ще більш серйозними при використанні аналітичних формул для похідної матриці (які доступні для багатьох класичних точок колокації, наприклад, Гаусса-Лобата).

Тепер у статті (та посиланнях на неї) зазначено, що похибка похідної полягає в порядку відхилення рядкових сум від нуля. Мета полягає в тому, щоб зробити їх чисельними якомога меншими.

Числові тести

Хорошим моментом є те, що процедура Форнберга, здається, є досить хорошою в цьому плані. На малюнку нижче я порівняв поведінку точної, тобто аналітичної, першої похідної матриці та тієї, отриманої алгоритмом Форнберга, для різної кількості точок колокації Чебишева-Лобата.

Знову ж таки, вважаючи твердження в цитованій роботі, це означає, що алгоритм Форнберга дасть більш точні результати для похідної.

Для того, щоб довести це, я буду використовувати ту саму функцію, що і в роботі,

(2)f(х)=11+х2.
(3)Ен=максi{0,,н}|f'(хi)-j=1нDijf(хj)|.
(4)D~jj=Djj-(i=1нDji),за всіх j.

Висновок

На закінчення, метод Форнберга здається досить точним, у випадку навіть приблизно на 3 порядки точнішими, ніж результати аналітичних формул. Це повинно бути досить точним для більшості програм. Більше того, це чудово, тому що Форнберг, схоже, прямо не включає цей факт у свій метод (принаймні, у двох документах Форнберга немає згадок).N=512

Інший порядок можна отримати для цього прикладу шляхом прямого включення рівняння (4). Оскільки це досить простий підхід і застосовується лише один раз для кожної похідної, я не бачу причин у тому, щоб не використовувати його.

Метод з паперу Бальтенспергера, який використовує більш досконалий підхід до оцінки суми у рівнянні (1) з метою зменшення помилок округлення, - дає приблизно такий же порядок для помилки. Отож, принаймні для цього прикладу, це приблизно еквівалентно вищевказаному методу "Адаптований Форнберг".


4

Якщо припустити, що ви намагаєтесь диференціювати числову реалізацію безперервної функції, існує велика кількість методів:

1) Автоматична диференціація. Найбільш точний і загальний метод. Болісно кодувати, вимагаючи перевантаження оператора та пошуку аргументів. Покладає навантаження на користувача, щоб зрозуміти ці поняття. Також бореться зі знімними сингулярностями, такими як диференціювання sinc при .х=0

2) Перетворення Чебишева. Спроектуйте свою функцію на проміжок поліносів Чебишева та диференціюйте тричасний повтор. Супер швидкий, дуже точний. Але вимагає, щоб у вас був компактно підтримуваний цікавий домен; за межами вибраного домену тричасне повторення трьох термінів нестабільне.[a,b]

3) Кінцева диференціація. Занижена в 1D; див. Підказки та хитрості Ніка Хігема в числових обчисленнях . Ідея полягає в тому, що якщо ви врівноважуєте помилку усічення та помилку округлення, то вам не потрібно вибирати покроковий розмір; його можна вибрати автоматично. У програмі Boost ця ідея використовується для відновлення (за замовчуванням) 6/7-го числа правильних цифр для типу. (Хігхем показує лише ідею для більш простого випадку 1/2 правильних цифр, але ідея легко розширюється.) Коефіцієнти є з приведеної таблиці Форнберга, але покроковий вибір вибирається за умови, що функцію можна оцінити до 1ULP точність. Недоліком є ​​те, що для відновлення половини цифр типу, для відновлення 3/4 цифр тощо, потрібні 2 оцінки функції. У 1D не погана справа. У більш високих розмірах це катастрофічно.

4) Похідна складного кроку. Використовуйте . Візьміть щоб бути обрізною одиницею, і це відновить майже кожен біт правильно. Однак це своєрідне обману, оскільки реалізувати функцію в складній площині важче, ніж передавати код її реальній похідній. Ще крута ідея і корисна в певних обставинах.f(x)(f(x+ih))год


1

Мені невідомо, що хтось вдосконалив алгоритм Форнберга (див. Також його трохи новішу роботу ). Як осторонь, мені здається, що дивитися на його алгоритм як на спосіб обчислення числових похідних не правильно. Все, що він зробив, - це створити ефективний алгоритм для обчислення ваг для методів з кінцевою різницею. Перевага його методу полягає в тому, що він дає ваги для всіх похідних до потрібної похідної за один раз.


Я б не погоджувався з твердженням, "розглядаючи його алгоритм як спосіб обчислення числових похідних не правильно". Після того, як ваги оцінені для точки , ви можете безпосередньо обчислити числову похідну будь-якої функції через . z f ( x ) f ( z ) = i w i f ( x i )шizf(x)f(z)=iwif(xi)
Давидхіг

@davidhigh: Якщо ви читаєте документи Форнберга, вони говорять про обчислення ваг для наближень з кінцевою різницею, а не про обчислення самих наближень. Звичайно, ви можете використовувати алгоритм для обчислення похідних, але має більше сенсу обчислювати ваги, зберігати їх, а потім повторно використовувати їх для обчислення приблизних похідних. Інакше ви обчислюєте ваги кілька разів, коли немає потреби.
Брайан Запапатік

1

Простіша схема

На додаток до іншої моєї відповіді, яка стосується розширення методу Форнберга, я торкнуся тут питання щодо більш простих альтернатив.

Для цього я накреслюю альтернативну схему, яка пряміше створює коефіцієнти похідних інтерграції Лагрангія. Її реалізація вимагає лише декількох рядків коду, працює для довільних сіток, і, згідно з моїми першими експериментами, така ж точна, як і для Форнберга.

Основою реалізації є похідна уявного кроку де є змінною в порядку машинної точності. Відомо, що похідна уявного кроку стабільно створює похідні значення і не зазнає чисельної нестабільності реалізації Кінцевої різниці з .

f(x) = 1hIm(f(x+ih)),
hh0

Другий інгредієнт - інтерполяційний поліном Лагранжа у сітці оцінений за допомогою однієї з барицентричних форм, наприклад коли Для того, щоб використовувати похідну складного кроку, потрібно переконатися, що ці формули також працюють для складних аргументи . Більше того, для заданої функції f (x) та вектора коефіцієнтів позначаємо інтерполяційний поліном через через Li(x){x1,,xN}

Li(z) = {1if z=xi μizxkkμkzxkotherwise.
μi=1ki(xixk)zfi=f(хi)(х1,fi)
П(х;f)=i=1NfiLi(х).


Алгоритм

Алгоритм накреслений у наступному. Він має ті ж вхідні та вихідні параметри, що і у Форнберга, але набагато більше, якщо він не працює.

Вхід:

  • х : сітка з N різними точками сітки
  • оrг : похідний порядок
  • z: точка, в якій слід оцінювати похідну
  • Можливо: функція або її функціональні значення в точках сітки (потрібно лише для вихідного варіанту 2.)f(х)fi

Ініціалізація

  • Ініціалізуйте поліноми Лагранжа через барицентричну інтерполяцію.L
  • Ініціалізувати масив -матриці , дляN×ND(о)о=0,,оrг
  • Встановіть , тобто одинична матриця розмірностіD(0): =ЯNN×N
  • Встановітьо: =0

Алгоритм

Хоча :о<оrг

  • Обчисліть за допомогою комплексного крокового похідного для всі і . Тут позначає -й рядок .Diк(о+1)=СSD(П(хк;Di(о)))СSDiк
    Di(о)iD(о)

  • Встановіть o = o + 1;

Вирішіть, що вивести :

  1. Вектор коефіцієнтів кінцевої різниці в точці , де . Це те, що робить Форнберг.г(оrг)zгi=П(z;Di(оrг))

  2. Функція інтерполяції до похідної порядку . Для цього вам потрібно ввести функцію resp. значення функції при алгоритму.p(оrг)(х)=i=1Nf(хi)П(х;Di(оrг))f(оrг)(х)оrгfiхi

  3. Метафункція яка повертає функцію інтерполяції варіанту 2., але для довільної функції яка повинна бути інтерпольована в точках сітки.розл(int оrг,функція г)г

Особисто мені найбільше подобається варіант 3.


Аналіз алгоритму

Як і у Форнберга, цей алгоритм є . Я опублікую більш емпіричні результати щодо точності, стабільності тощо, якщо знайду час.О(оrгN2)


0

Для підвищення точності чисельної диференціації виконайте наступне:

1) Оберіть ваш улюблений високоточний "стандартний" метод, заснований на деякому розмірі кроку h .

2) Обчисліть значення похідної методом, обраним у 1) багато разів, з різними, але розумними розмірами кроків h . Кожен раз, коли ви можете вибрати h як випадкове число з інтервалу (0,5 * H / 10, 1,5 * H / 10), де H - відповідний розмір кроку для використовуваного методу.

3) Середні результати.

Ваш результат може отримати 2-3 порядки в абсолютній похибці. не усереднений результат.

https://arxiv.org/abs/1706.10219


3
Ласкаво просимо до SciComp.SE! Ця відповідь була б ще кращою, якщо ви коротко підсумуєте метод.
Крістіан Класон

2
Також ваше ім’я користувача говорить про те, що ви є автором цього документа. Прочитайте наші рекомендації щодо самореклами та відредагуйте свою публікацію відповідно.
Wrzlprmft

Я чесно вважаю, що негативне голосування є несправедливим, якщо моя відповідь справді вказує на правильну відповідь.
Ф. Ятпіль

1
Я теж ... тож прийміть мій +1 ... :-)
davidhigh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.