0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 13
|
|
1 | |
Перебор значений double05.09.2011, 02:14. Показов 3075. Ответов 30
Метки нет (Все метки)
Привет всем, весь день сижу и думаю над алгоритмом следующего
Нам известна функция которая принимает один параметр типа double и возвращает double. Реализация функции неизвестна, но известны некоторые особенности:
Естественно, double - число довольно здоровое, и хотя мы ограничены определенным диапозоном, у нас всеравно остается куча вариантов для перебора.. [0.000000000000001 ; 0.999999999999999] Простой перебор, увеличение Х на 0.000000000000001 в цикле, займет вечность, хотя и будет самым точным.. Пробовал ограничить кол-во перебора с помощью нахождения Х-а при котором передаваемый параметр был минимальным, но так и не придуал как это граммотно реализовать. Выходило что ограничить мог не так и сильно, либо получал не те результаты.. Можетбыть кто знает какие способы по скоращению времени на перебор в данном случае? Или куда глядеть дальше по этой теме?
0
|
05.09.2011, 02:14 | |
Ответы с готовыми решениями:
30
Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double Ошибка: error LNK2001: unresolved external symbol "double __cdecl Akk(double,double,double)" перебор значений Перебор значений |
3 / 3 / 2
Регистрация: 27.07.2011
Сообщений: 13
|
|
05.09.2011, 02:38 | 3 |
Может перебирать все варианты начиная из нескольких мест сразу(например с начала и с конца), так вероятность, что попадется быстрее выше.
0
|
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 13
|
|
05.09.2011, 02:51 [ТС] | 4 |
Перебор с двух концов идея не плохая, однако сокращение во времени тут будет зависеть от параметра.
Если параметр при котором функция вернет 0 находится в середине диапозона 0.0.....1 - 0.(9) то мы ничего не сократим. С другой стороны если оно на начале 0.0....1 или в конце диапозона, тогда сократим. Однако, не думаю что сокращение по времени будет большим.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
05.09.2011, 02:52 | 5 |
А монотонность (то есть непрерывное возрастание) для половинного деления и не требуется. Главное, чтобы функция меняла знак только один раз, проходя через ноль. Если функция может менять знак сколько угодно раз (очевидно, имея множество разрывов), то задача в общем случае нерешаема.
0
|
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 13
|
|
05.09.2011, 02:57 [ТС] | 6 |
Забыл написать, функция математически непрерывная. Значит меняет знак один раз.
Значит судя по сообщениям, следует попробовать Метод половинного деления, попробую утрецом, отпишусь.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
05.09.2011, 03:00 | 7 |
Раз она непрерывна и проходит через ноль только один раз, то и знак меняет только один раз. Так что метод половинного деления — это как раз то, что позволит очень быстро приблизиться вплотную к искомому значению.
1
|
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 13
|
|
05.09.2011, 03:02 [ТС] | 8 |
Думаете она сможет относительно быстро перебрать этот диапозон?
В любом случае, пошел читать про этот метод.
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
05.09.2011, 03:05 | 9 |
Не больше, чем за 64 итерации А на самом деле даже меньше.
1
|
kazak
|
05.09.2011, 03:28
#10
|
0
|
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 13
|
|
05.09.2011, 03:33 [ТС] | 11 |
Написал, работает!
Спасибо огромное! Осталось теперь попроверять точность с несколькими разными уравнениями подходящими под описание, но посложнее чем то что я там понаписал для тестов, есть варианты?
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
05.09.2011, 03:33 | 12 |
Это, конечно, так, но если условие 3 относится именно к реализации, а не к математической функции, то задача снова становится нерешаемой в общем случае. Если же условие всё-так означает, что сама математическая функция проходит через ноль только один раз, то вместе с непрерывностью это гарантирует единственную смену знака.
0
|
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 13
|
|
05.09.2011, 03:35 [ТС] | 14 |
kazak, значит решение данной задачи с помощью этого метода не может гарантировать в итоге решение для всех функций и присутвуют исключения?
Вообще запутался...
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
05.09.2011, 03:40 | 15 |
0
|
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 13
|
|
05.09.2011, 03:45 [ТС] | 16 |
Вобщем есть некая функция:
double d_Function(double X); Мы не знаем ничего про само тело функции. Нам лишь известно следующее:
0
|
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 13
|
|
05.09.2011, 03:49 [ТС] | 18 |
узнать функцию к сожалению невозможно
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|
05.09.2011, 03:52 | 19 |
Всё чудесатее и чудесатее (C)
Числа 1.0f и 0.0f имеют тип float. При этом аргумент и результат функций объявлены как double. По-моему кто-то хочет нас запутать Чтобы перебрать все числа double на отрезке (0.0, 1.0) потребуется очень быстрый вычислитель и очень много времени. Ну или очень много удачи
0
|
0 / 0 / 0
Регистрация: 05.09.2011
Сообщений: 13
|
|
05.09.2011, 03:54 [ТС] | 20 |
Пардонте, там не флоат (без f), привычка так записывать числа с плав точкой просто
Тобишь, метод половинного деления будет работать только елси математически функция монотонная, я правильно понял? Попытаюсь тогда разузнать, монотонна она или нет.
0
|
05.09.2011, 03:54 | |
05.09.2011, 03:54 | |
Помогаю со студенческими работами здесь
20
Перебор значений Перебор и сравнение значений Перебор действительных значений в цикле Перебор возможных значений для трёх чисел Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |