У меня есть возрастающая математическая функция, например y = x + 5*x^3 + x^7 + 11*ln x
и я хочу найти первую (положительную) x
такую, что y(x) >= 1478
. Могу ли я использовать алгоритм бинарного поиска из stl для решения этой проблемы?Бинарный поиск математической функции
ответ
Проблема в том, что алгоритмы STL (std::lower_bound
, вероятно, ваш кандидат на выбор) работают над коллекциями. Или более конкретно: на итераторах коллекций. Один из способов использования их для вашей проблемы - это адаптер: вы пишете «итератор», который просто возвращает значение функции при разыменовании.
Код для этого может быть довольно большим, так как вам необходимо удовлетворить все требования RandomAccessIterator. Однако вы можете запланировать его на своей функции. Пример:
template<class F>
FuncIterator{
typedef int ParamType;
typedef float ResultType; // Or better: result_of F
ParamType param_;
FuncIterator(ParamType param): param_(param){}
ResultType operator*(){ return F(param_); }
FuncIterator& operator+=(int diff){ param_ += diff; return *this; }
//... Other functions required for RandomAccessIterator
}
auto result = std::lower_bound(FuncIterator<MyFunc>(0), FuncIterator<MyFunc>(1000));
std::cout << "First x value is:" result.param_ << std::endl;
Опять же: этот итератор более сложный, чем здесь, но вы должны получить отсюда. Вам нужны некоторые определения и возможные черты. Но вам нужно определить его только один раз и использовать его для любой функции. Он становится более общим, если вы используете std-признаки, чтобы вывести тип параметра и результат F
.
Заключительное примечание: двоичный поиск выполняет поиск только в диапазоне! Поэтому вы должны решить этот диапазон при вызове std::lower_bound
. Он не может найти «первое значение x
с F(x)>=y
» для любое x, но только для любого x в заданном диапазоне.
Спасибо за подробный ответ. Таким образом, это не простой способ использовать двоичный поиск из stI, и ручная запись двоичного поиска будет действительно проще, чем создание адаптера, правильно? – Pavel
Да. Бинарный поиск предназначен для заказанных контейнеров. Почему вы хотите сделать, скорее всего, лучше подходит для алгоритма Newtons или аналогичного: Поиск корня функции. В вашем случае: 'y '(x) = y (x) - 1478', а теперь найдите' x' для 'y' (x) = 0' – Flamefire
- 1. Применение математической функции к другой математической функции
- 2. бинарный поиск C
- 3. Бинарный поиск через битмаскирование?
- 4. бинарный поиск и последовательный поиск
- 5. Бинарный поиск python 3.5
- 6. Бинарный поиск в массиве
- 7. Бинарный поиск в массиве
- 8. Дискретный бинарный поиск
- 9. C# Бинарный поиск
- 10. Бинарный поиск, отсортированный массив
- 11. бинарный поиск результатов запроса
- 12. Бинарный поиск со строками
- 13. Фибоначчи, бинарный поиск
- 14. Как работает бинарный поиск?
- 15. Бинарный поиск массива строк
- 16. Java-массивы Бинарный поиск
- 17. Elixir бинарный поиск
- 18. Как реализовать бинарный поиск?
- 19. Бинарный поиск - ошибка
- 20. Как оптимизировать бинарный поиск?
- 21. бинарный поиск в OCaml?
- 22. Бинарный поиск строковых массивов
- 23. бинарный поиск в java
- 24. Бинарный поиск отсортированных множителей
- 25. Бинарный поиск по строкам
- 26. Бинарный поиск CompareTo Java
- 27. Проверка наличия математической функции
- 28. Выбор внутри математической функции
- 29. Нечисловой аргумент математической функции
- 30. бинарный поиск с использованием рекурсии
Да, вы можете. Попробуй. – dasblinkenlight
Почему бы не использовать цикл 'for'? – Boiethios
@dasblinkenlight, как я могу его использовать? Я могу написать это сам, но вопрос о stl алгоритмах – Pavel