Численное решение уравнения f(t) = 0

Тема в разделе "WASM.HEAP", создана пользователем _DEN_, 8 мар 2010.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Пытаюсь найти хороший численный алгоритм для решения уравнения f(t) = 0. Нужно не просто решение, а минимальный положительный корень.

    Метод Ньютона (касательных) имеет хорошую сходимость, но очень не любит функции с экстремумами. Например f(t) = cos(t) + cos(50 t) / 5 будет ему не по зубам - касательные будут прыгать туда-сюда. Про f(t) известно только то, что она непрерывна, и, скорее всего - бесконечно-диффиренцируема.

    Практическая задача, в которой это нужно - это raytracing. Имеется функция F(x, y, z), описывающая некоторую поверхность в точках с условием F(x, y, z) = 0. Нужно запустить луч и найти, где он первый раз пересекает поверхность. Я решаю это так. Беру параметрические уравнения прямой:

    x = x0 + m t
    y = y0 + n t
    z = z0 + z t

    Подставляю x, y и z в F, получаю уравнение F(x0 + m t, y0 + n t, z0 + p t) = 0. То есть, некоторое уравнение одной переменной f(t) = 0. Его и нужно решить численно.

    Вот пример (PNG, ~331 кб) использования двух алгоритмов на одной и той же поверхности. Простой итеративный поиск с константным шагом (слева) и метод Ньютона (справа). На картинке видно, что простой поиск дает лучшую решаемость, но плохое качество - это видно по гранености бликов. Ньютон дает хорошую точность (гладкие блики), но решабельность плохая. Особенно, когда луч пронизывает поверхность несколько раз.

    Итак, задача - численно найти первую точку пересечения луча и поверхности. То есть, найти минимальный положительный корень f(t) = 0. Ньютон имеет хорошую скорость и точность, но плохую сходимость. Итеративный аглогитм с константным шагом - плохую точность, хорошую сходимость, и совершенно неприемлемую скорость. Хочется чтобы и сходилось, и точно, и быстро. Что бы вы посоветовали?

    PS. spa, qqwe, Matan, и т.д. - пожалуйста, умоляю, не пишите в этом топике.
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Немного напутал в применении термина "сходимость". Имелось ввиду, что Ньютон сходится реже, чем константный шаг, но если сходится, то результат более точен.
     
  3. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    _DEN_
    Ньютон насколько я помню не сходится только если неправильно выбраны начальные условия.
    Когда функция имеет несколько корней то вначале используют решение с постоянным шагом(с большим грубым) , а потом уже используют Ньютон. для уточнения решения
     
  4. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    _DEN_, есть хороший пакет ALGLIB для решения подобных задач. считает и уравнения и интегралы и нейросети и много чего ещё. очень рекомендую.
     
  5. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Pavia

    Начальные условия всегда одни - t = 0.

    Можно показать, как предварительно использовать постоянный шаг на, например, такой функции?

    [​IMG]
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cupuyc

    Сторонние проги тут не помогут - мне нужно считать самостоятельно в своей проге.
     
  7. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    попробуйте квазиньютоновские методы типа БФГС, так как ньютон - он жуткий боян. также на долбонутых функциях довольно эффективны ген-алгоритмы
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Freeman

    А что это за методы? Гугл говорит Результаты 1 - 1 из примерно 0 для численный метод БФГС.
     
  9. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
  10. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Freeman

    Хм... Как я понял, BFGS это численный поиск стационарных точек функции многих переменных? Умение искать стационарные точки мне как-то поможет научиться решать уравнение?
     
  11. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Pavia

    Если я все правильно понимаю, то на первом этапе нужно поймать такой отрезок, внутри которого есть интересующий корень, и нет экстремумов. Но если научиться находить такой отрезок, то тут и дихотомия прекрасно справится. Если же внутри отрезка будет экстремум, то он уже может "увести" алгоритм далеко в сторону - например если касательная f(xn) будет "смотреть" в противоположную от корня сторону.
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Вот комбинация постоянного шага и Ньютона. Ищутся решения начиная с t = 0, 1, 2, 3, ... 9, и среди них выбирается минимальное положительное. Результат заметно лучше, но все еще неудовлетворительный.

    [​IMG]
     
  13. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    это не прога, а библиотека с открытыми сорцами. попробовать стоит хотя бы для того, чтобы убедиться, что метод уточнения корней для вашей функции вообще сходится.
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    cupuyc

    Дык не могу я попробовать - raytracing считается на фрагментном шейдере видеокартой :) И на каждый кадр у меня 800х600 = 480000 разных функций :)
     
  15. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    _DEN_, нет, это метод минимизации функции многих переменых.
     
  16. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    В этом случае можно попробовать методы, которые не требует производной функции или её градиента. Например, метод Недлера-Мида или метод главных осей. Сходимость хорошая.
     
  17. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    W4FhLF

    Но как перейти от поиска экстремума к поиску корня?
     
  18. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    _DEN_
    http://www.ray-tracing.ru/
    тут в разделе "Быстрая трассировка лучей" есть несколько алгоритмов.
     
  19. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    _DEN_, чессгря я затрудняюсь ответить. Я использую данные методы для функций многих переменных, но немного в другой постановке. У меня заранее есть функция невязки, от неё я и отталкиваюсь. Я щас немного вник, у тебя задача немного другая, похоже предложенные методы не покатят.

    Может сюда заглянешь: http://en.wikipedia.org/wiki/Category:Root-finding_algorithms

    Методов много в прицнипе. Ты смотрел что-нибудь ещё?
     
  20. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков