У мене є двовимірна функція , значення якої я хотів би відібрати. Обчислити цю функцію дуже дорого і вона має складну форму, тому мені потрібно знайти спосіб отримати найбільшу інформацію про її форму, використовуючи найменшу кількість точок вибірки.
Які хороші методи існують для цього?
Що у мене поки що
Я починаю з наявного набору точок, де я вже обчислив значення функції (це може бути квадратна решітка точок або щось інше).
Тоді я обчислював триангуляцію Делоне цих точок.
Якщо дві сусідні точки триангуляції Делоне досить далекі ( ) і значення функції в них достатньо відрізняються ( ), то я вставляю нову точку посередині між ними. Я роблю це для кожної сусідньої точки-пари.
Що не так з цим методом?
Добре, він працює відносно добре, але для функцій, подібних до цієї, це не ідеально, тому що зразки балів, як правило, «перескакують» хребет і навіть не помічають його там.
Це дає такі результати (якщо роздільна здатність початкової сітки точок досить груба):
На цьому графіку вище показані точки, в яких обчислюється значення функції (фактично клітини Вороного навколо них).
Наведений вище графік показує лінійну інтерполяцію, генеровану з тих самих точок, і порівнює її із вбудованим методом вибірки Mathematica (приблизно за однаковим початковим дозволом).
Як її покращити?
Я думаю, що головне питання тут полягає в тому, що мій метод вирішує, додавати точку вдосконалення чи не на основі градієнта.
Краще було б врахувати кривизну або хоча б другу похідну при додаванні точок уточнення.
Питання
Який дуже простий втілити спосіб врахування другої похідної чи кривизни, коли розташування моїх точок зовсім не обмежене? (Я не обов'язково має квадратну решітку відправних точок, в ідеалі це має бути загальним.)
Або які інші прості способи обчислити положення точок уточнення оптимальним способом?
Я збираюся реалізувати це в Mathematica, але це питання в основному стосується методу. Для "простого втілення" біта, але вважається, що я використовую Mathematica (тобто це було легко зробити поки що, оскільки він має пакет для проведення триангуляції Делоне)
Яку практичну проблему я застосовую до цього
Я обчислюю фазову діаграму. Він має складну форму. В одному регіоні його значення дорівнює 0, в іншому регіоні від 0 до 1. Між двома регіонами різкий стрибок (переривчастий). В області, де функція більша за нуль, є як деяка плавна варіація, так і пара розривів.
Значення функції розраховується на основі моделювання Монте-Карло, тому іноді слід очікувати неправильного значення функції або шуму (це дуже рідко, але для великої кількості балів це трапляється, наприклад, коли стаціонарний стан не досягнуто належного якийсь випадковий фактор)
Я вже запитував це на Mathematica.SE, але я не можу посилатися на нього, оскільки він все ще знаходиться в приватній бета-версії. Тут йдеться про метод, а не про реалізацію.
Відповісти на @suki
Це тип поділу, який ви пропонуєте, тобто поставити нову крапку в середині трикутників?
Мене тут хвилює те, що, здається, потрібна спеціальна обробка в краях регіону, інакше це дасть дуже довгі і дуже тонкі трикутники, як показано вище. Ви правили це?
ОНОВЛЕННЯ
Проблема, яка виникає як із описуваним нами методом, так і з пропозицією @ suki поставити підрозділ на основі трикутників і помістити точки підрозділу всередині трикутника, полягає в тому, що, коли є розриви (як у моїй проблемі), перерахування триангуляції Делоне після кроку може викликати зміни трикутників і, можливо, з’являться великі трикутники, які мають різні значення функції у трьох вершинах.
Ось два приклади:
Перший показує кінцевий результат при відборі проб навколо прямого розриву. Другий показує розподіл точки вибірки для аналогічного випадку.
Які прості способи уникнути цього? Наразі я просто підрозділяю ті егдеси, які зникають після ретріагуляції, але це відчувається як злом, і це потрібно робити обережно, оскільки у випадку симетричних сіток (як квадратна сітка) є кілька дійсних триангуляцій Делоне, отже краї можуть змінитися випадковим чином після ретріагуляції.