Главная страница
Навигация по странице:

  • Практическая работа №1. Анализ алгоритмов и программ.

  • Задание. Найти локальный минимум (максимум) функции

  • Методом «Фибоначчи». Провестианализ разработанного алгоритма и программы и сравнить с аналогичным решением с помощью алгоритма «пассивного поиска». Вход

  • Справочный материал к заданию. Время работы программы Директива препроцессора: include

  • О( n

  • Метод «деления отрезка пополам»

  • Метод «золотого сечения»

  • Определение.

  • Практическая работа 1. Анализ алгоритмов и программ. Задание


    Скачать 411.42 Kb.
    НазваниеПрактическая работа 1. Анализ алгоритмов и программ. Задание
    Дата14.05.2023
    Размер411.42 Kb.
    Формат файлаdocx
    Имя файлаzadanie1 (1).docx
    ТипПрактическая работа
    #1129644

    Алгоритмы и структуры данных







    Практическая работа №1.

    Анализ алгоритмов и программ.








    Задание.

    Найти локальный минимум (максимум) функции вида f(x) = на заданном интервале [a,b] с заданной точностью ε > 0 одним из способов:

    1. Методом «деления отрезка» пополам;

    2. Методом «золотого сечения»;

    3. Методом «Фибоначчи».

    Провестианализ разработанного алгоритма и программы и сравнить с аналогичным решением с помощью алгоритма «пассивного поиска».

    Вход: вид функции, границы отрезка, требуемая точность

    Выход (на экране и в файле): таблица пошаговых приближений, количество итераций (шагов поиска), значение точки минимума, значение функции в этой точке.
    Справочный материал к заданию.

    1. Время работы программы

    Директива препроцессора: include

    Начальное время работы программы:srand(time(0))

    Конечное время работы программы(в секундах): clock()/1000.0

    1. «Пассивный поиск»

    Графический вид для заданной в задаче функции:


    Пример Программы, которая осуществляет поиск локального минимума функции на интервале с шагом h = 1для функции f(x) =

    #include

    #include

    #include

    #include

    #include
    using namespace std;
    int main()

    { SetConsoleCP(1251);

    SetConsoleOutputCP(1251);

    srand(time(0)); // начальное время

    floatmin=0,x,y,k,h=1;// описание используемых в программе переменных

    intstep=0;

    for(x=-5.0;x<=-2.0;x=x+h)// основной цикл вычисления значений функции на

    { step++; // заданном промежутке

    y=x*x*x-x+exp(-x);

    printf(" %d. x = %fy = %f\n",step,x,y); // вывод на экран
    if(y
    { min=y;

    k=x;

    };

    printf("минимальное значение функции на [-5,-2] \n");

    printf("y = %f, точка минимума x = %f\n",min,k);

    printf("количество шагов = %d\n",step);

    cout<< "Время работы программы = " <<clock()/1000.0<cout<< endl<
    }

    Ответы:

    1. Если h=1, то




    1. Если h=0.1, то




    1. Если h=0.01, то




    1. Если h=0.001, то




    1. Если h=0.0001, то




    1. Если h=0.00001, то



    8.5 минут!!!


    Очевидно, что с ростом количества вычислений пропорционально (с некоторым коэффициентом) растет и время работы программы. Легко подсчитать, что сложность алгоритма равна О(n).

    Также видно, что точные значения и функции, и точки, в которой эта функция достигает минимума можно определить только с некоторой погрешностью.

    Поэтому для вычисления экстремумов функций используют методы, которые определяют значение с некоторой, заранее заданной точностью. Например, чтобы приблизительное решение отличалось от «истинного» с погрешностью ε=0.001.Из примера «пассивного поиска» можно заметить, что искомый минимум лежит где-то в интервале |-3.679099 |.


    1. Метод «деления отрезка пополам»

    Поставим задачу: найти отрезок длины не более , содержащий точку локального минимума. Другими словами, найти точку , с точностью до приближающую точку : .

    Д
    ля удобства пояснения алгоритма метода обозначим исходный отрезок = (рис. 2.), возьмем , построим точки и вычислим .

    Если , то заключаем, что . Если же , то .

    В первом случае в качестве приближения точки возьмем и примем обозначение . Во втором случае – . Таким образом, в найден отрезок , где содержится и указано приближение . Если , то поставленная задача решена. В противном случае отрезок следует подвергнуть аналогичному дроблению (схема 2) и продолжить процесс дробления до тех пор, пока на некотором шаге не выполнится неравенство . При этом на отрезке будет получено приближение  точка, в которой функция достигает приближенное значение локального минимума: .

    Приведенный алгоритм является классическим. Заметим, что в нем на каждом шаге необходимо произвести два вычисления значения функции: .

    Пример.

    Определим с точностью точку локального минимума функции . Поиск будем производить на отрезке локализации .

    Установим .

    Первая итерация:

    1. вычислим , , ;

    2. сравним и . Так как , то установим в качестве нового отрезка локализации отрезок ;

    3. и так как условия Δ1= ) не выполняются , то произведем очередную итерацию.


    Итерационный процесс будем продолжать до тех пор, пока для установленного вновь отрезка локализации данные условия не будут выполнены. Результаты итераций сведем в таблицу 1.

    Таблица 1

    № шага k















    0

    -4.000000

    -3.000000

    -3.600000

    -3.400000

    -6.457766

    -5.939899

    1.000000

    1

    -4.000000

    -3.400000

    -3.760000

    -3.640000

    -6.448950

    -6.496707

    0.600000

    2

    -3.760000

    -3.400000

    -3.616000

    -3.544000

    -6.476333

    -6.363350

    0.360000

    3

    -3.760000

    -3.544000

    -3.673600

    -3.630400

    -6.509402

    -6.489656

    0.216000

    4

    -3.760000

    -3.630400

    -3.708160

    -3.682240

    -6.502006

    -6.509551

    0.129600

    5

    -3.708160

    -3.630400

    -3.677056

    -3.661504

    -6.509618

    -6.507023

    0.077760

    6

    -3.708160

    -3.661504

    -3.689497

    -3.680166

    -6.508658

    -6.509634

    0.046656

    7

    -3.689497

    -3.661504

    -3.678300

    -3.672701

    -6.509645

    -6.509312

    0.027994

    8

    -3.689497

    -3.672701

    -3.682779

    -3.679420

    -6.509517

    -6.509646

    0.016796

    9

    -3.682779

    -3.672701

    -3.678748

    -3.676732

    -6.509648

    -6.509607

    0.010078

    10

    -3.682779

    -3.676732

    -3.680360

    -3.679151

    -6.509630

    -6.509648

    0.006047

    11

    -3.680360

    -3.676732

    -3.678909

    -3.678183

    -6.509648

    -6.509644

    0.003628

    12

    -3.680360

    -3.678183

    -3.679489

    -3.679054

    -6.509645

    -6.509648

    0.002177

    13

    -3.679489

    -3.678183

    -3.678967

    -3.678706

    -6.509648

    -6.509648

    0.001306

    14

    -3.679489

    -3.678706

    -3.679176

    -3.679019

    -6.509648

    -6.509648

    0.000784

    Из таблицы видно, что искомый результат на 14-ом шаге вычислений. При этом: .


    1. Метод «золотого сечения»

    Отличие метода золотого сечения от метода деления отрезка пополам заключается в специальном разбиении отрезка локализации относительно его центра точками.

    Термин «золотое сечение» ввел Леонардо да Винчи. Принципы, заложенные в основу этого сечения, широко использовались при композиционном построении многих произведений искусства античности и эпохи Возрождения: особенно в живописи и архитектуре.

    Определение. Золотым сечениемотрезка называется такое разбиение отрезка на две неравные части точками и , что отношение длины всего отрезка к длине его большей части равно отношению длины большей части к длине меньшей части: . При этом (рис.2.5) точки и располагаются симметрично относительно центра отрезка и могут быть определены с помощью следующих соотношений:

    .

    Замечательно также, что точки и осуществляют золотое сечение не только всего отрезка , но и соответственно подотрезков и .



    Итерационный процесс локализации минимума функции на заданном числовом отрезке в данном методе ведется аналогично локализации минимума функции в методе деления отрезка пополам. В отличие от него точки и на очередном шаге итерации находятся по формулам:

    .

    Свойства золотого сечения позволяют также несколько упростить процедуру поиска точки локализации на очередном шаге вычислений. Действительно, какой бы из отрезков или не был бы выбран за очередной отрезок локализации, точка
    ( , если и , если ) совпадет с одной из точек или (рис 4). Поэтому на очередном шаге достаточно вычислить значение функции лишь в одной недостающей точке.





    1. Метод Фибоначчи

    Данный метод обеспечивает максимальное гарантированное сокращение отрезка локализации при заданном числе N вычислений функции и основан на использовании чисел Фибоначчи таких, что: для всех при начальных значениях

    Метод Фибоначчи состоит из шагов.

    Вначале определяется такое число Фибоначчи , для которого справедливо условие где .

    Очередной -й шаг выполняется аналогично -й итерации метода деления отрезка пополам, но точки и находятся по формулам

    ,

    где – длина отрезка локализации (рис.2.7).

    Аналогично методу деления отрезка пополам определяется новый отрезок локализации:

    если , то ;

    если , то .

    В первом случае за очередное приближение к точке минимума принимают , во втором случае – .



    Примерная схема алгоритма:



    Все 4 метода реализовать для поиска экстремальных точек в интервалах

    переменной x—[-5,-3], [0,3] —точки минимума и [-3,0] — точка максимума.


    написать администратору сайта