Поиск решения уравнения, Оптимизация поиска
Я бы взял отрезок на котором мы ищем корень. Если знаки разные - делим пополам. Если одинаковые - добавляем в приоритетную очередь. Оценка в приоритетной очереди отрезка , к примеру, . Константу С берем 2-3 - посмотри как лучше на практике работает. После чего выбираем отрезок с минимальной оценкой и делим пополам. Если нет разных знаков, то засовываем оба отрезка обратно в приоритетную очередь.
Я бы взял отрезок на котором мы ищем кореньНепонятно что делать, если отрезок взят неверно:
1. решений на отрезке нет,
2. решения на отрезке более одного, можем найти не то решение.
//******************************************************//
Придумал другой метод:
Допустим v - f(x_n) = а, а > 0,
И известен х*: f '(x*) - максимум f '(x) на [x_n, х*]
тогда x_(n+1) = x_n + а/f '(x* прошли "а" с максимальной скоростью, при таком шаге мы не перепрыгнем v,
или x_(n+1) = x_n + dx, если dx > a/f '(x*)
х* ищется градиентным спуском
//******************************************************//
где можно почитать как в Mathematic 7.0 реализован поиск решений уравнения?
где можно почитать как в Mathematic 7.0 реализован поиск решений уравнения?Там реализовано несколько методов, они задаются параметром Method, см. хелп Options -> Method. Параметры функции еще можно смотреть прямо в программе, если набрать в отдельной ячейке ? FindRoot и нажать Shift+Enter.
Охота сделать dx побольше.
Например сначала ищем локальный минимум методом градиентного спуска, потом локальный максимум, итд... пока не получим f(x1) < 0 && f(x1 + dx) > 0, или не попадем в условия метода Ньютона.
Я бы так и делал. Можешь почитать про квазиньютоновские методы, они чутка быстрее
> f(x) - сколь угодно гладкая
Метод Брента.
> Например сначала ищем локальный минимум методом градиентного спуска
Забудь методы оптимизации со словами "градиентный спуск" и
"скорейшего спуска."
Для многомерного случая есть Broyden-Fletcher-Goldfarb-Shanno,
для одномерного есть варианты типа метода Пауэлла (Powell
например, приближение квадратичной функцией, минимум которой ты
всегда легко вычисляешь.
И открой для себя существование такой книги, как "Numerical Recipes."
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Оставить комментарий
uaha1979
Есть уравнение f(x) - v = 0;f(x) - сколь угодно гладкая,
f(t0) = v,
f '(t0) < 0,
f(x) = a + ... over 9000 символов ... b; =)
Все производные f(x) имеются в явном виде.
Задача найти следующее решение (которое обязательно будет).
Сейчас мое решение:
Берем шаг dx, идем с ним, как только нашли f(x1) < 0 && f(x1 + dx) > 0, применяем метод деления отрезка пополам.
Слишком медленно получается.
Охота сделать dx побольше.
Например сначала ищем локальный минимум методом градиентного спуска, потом локальный максимум, итд... пока не получим f(x1) < 0 && f(x1 + dx) > 0, или не попадем в условия метода Ньютона.
Есть ли менее наркоманские способы?