Як визначити нестабільні обчислення з плаваючою комою?


15

У числових даних дуже важливо вміти виявляти нестабільні схеми та підвищувати їх стійкість. Як визначити нестабільні обчислення з плаваючою комою?

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

  1. (Попередня стадія) Збір фізичних спостережень P .

  2. Визначте початкові параметри моделювання. Для цього використовується алгоритм оптимізації, коли ми ходимо в просторі параметрів і шукаємо параметри C такі, що деяка функція помилок E (F (C), P) зведена до мінімуму, де F - деяка похідна кількість параметрів.

  3. Підключіть C до двигуна імітації. Це схема Ейлера EDP, так що на кожному кроці ми обчислюємо умови, що рухають динамічну (кожен з них є складною функцією, потенційно може бути нестабільною) і подаємо схему Ейлера цими динамічними умовами для обчислення наступного держава. Це триває тисячі часових моментів.

  4. В кінці моделювання обчислюємо деяку функцію Доказ (S) кінцевого стану S і порівнюємо з деякими величинами Потрібно (P), виведене із спостережуваних величин. Це не формальне підтвердження результату, більше перевірка правдоподібності.

Також я бачу вежу складних операцій (обчислення динамічних термінів, за схемою Ейлера, в межах Доказу ). І хотіли б визнати «погані частини» та виправити їх.

Я припускаю, що використання програмної реалізації чисел з плаваючою комою зі зниженою точністю може збільшити нестабільність числових схем, полегшивши тим самим порівняння між різними реалізаціями. Це загальна методика розслідування цього питання? Чи можна використовувати віртуальну машину, як Бохс, для досягнення цього, не змінюючи програму?

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


можливо, у вас будуть цікавіші відповіді на math.stackexchange.com
Simon Bergot

@Simon Ви можете мати рацію, але це, безумовно, питання між домену. Я здогадуюсь, люди, здатні відповісти, більше зареєстровані як на математику, так і на програмістів чи ні на кого ... Давайте трохи почекаємо, чи знайде тут відповідь на це питання!
user40989

1
Інтервальна арифметика?
SK-логіка


2
Використання Ейлера для поширення держави не обов'язково зло; це не оптимізація, але ви дійсно повинні розділити проблему на підзадачі. Числова нестабільність може бути найменшою з ваших негараздів - конвергенція до помилкового максимуму та проблеми, пов’язані з жорсткістю верстатів ODE / PDE, більших за це. І так, ніколи не використовуйте єдину точність :)
Мисливець на оленів

Відповіді:


6

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

Є деякі речі, які можуть допомогти експериментально визначити нестабільні алгоритми. Запуск з округленням, встановленим на різні режими (вгору / вниз / випадково) або з різною точністю і перевірка того, що результат не сильно відрізняється. Відповідь це занадто багато? зовсім не простий, і навіть коли відповідь " ні" , це не означає, що алгоритм стабільний, просто що він не був виявлений нестабільним у використаному наборі даних.

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


3

Проектування стабільних алгоритмів з плаваючою комою є нетривіальним. Ті, хто має більш математичний досвід, ніж я, пропонують використовувати добре розглянуті бібліотеки там, де це можливо, а не намагатися прокрутити власні. Стандартна посилання в цій області виглядає так:

NJ Higham. Точність та стійкість числових алгоритмів. Товариство промислової та прикладної математики, Філадельфія, штат Пенсільванія, США, друге видання, 2002. ISBN 0-89871-521-0

Якщо не знати більше про типи обчислень, мови тощо, важко дати конкретну відповідь. Тут є хороша лекція: http://introcs.cs.princeton.edu/java/91float/ це може бути трохи базовим, але це хороше вступ, якщо ви використовуєте Java.


1

Як визначити нестабільні обчислення з плаваючою комою? Це загальна методика розслідування цього питання?

Я думаю, що якщо вам не потрібно показувати статистику щодо помилок, вам не потрібно збирати зразки. Вам потрібен чисельний аналіз , який також підпадає під предмети Чисельних методів, Числової лінійної алгебри тощо. Вони є частиною інформатики, тож ви можете отримати відповіді і в cs.stackexchange.

У будь-якому разі, в загальному програмуванні більшість проблем легко помітити, даючи базове розуміння того, як працює плаваюча точка і основні числові методи. Але ще складнішу проблему сьогодні "простіше" вирішити за наявності 128-бітових поплавців, ще менше приводу для отримання зразків помилок. Ось кілька прикладів проблем, щоб показати мою думку:

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

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


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

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

0

Ви можете уникнути числових помилок, використовуючи відповідні типи даних (наприклад, тривалі дроби). Якщо вам потрібно або ви хочете використовувати арифметику з плаваючою комою, вам потрібно застосувати числове ноу-хау, щоб знати помилки.


Я не хочу уникати числових помилок, хочу знайти, які частини обчислення нестабільні. Це схоже на локалізацію вузьких місць швидкості при оптимізації для швидкості. Тому я хочу оптимізувати точність, і тому хочу знайти вузькі місця. (Продовження дробів тут не корисне.)
user40989

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