Первый слайд презентации: Численные методы
Решение уравнений Вычисление площади (интеграла) Вычисление длины кривой Оптимизация
Слайд 3
3 Основные понятия Типы решения: аналитическое (точное, в виде формулы) приближенное (неточное) Задача : решить уравнение Как ? ? численные методы начальное приближение при N графический метод
Слайд 4
4 Численные методы Идея : последовательное уточнение решения с помощью некоторого алгоритма. Область применения : когда найти точное решение невозможно или крайне сложно. можно найти хоть какое-то решение во многих случаях можно оценить ошибку (то есть можно найти решение с заданной точностью ) нельзя найти точное решение невозможно исследовать решение при изменении параметров большой объем вычислений иногда сложно оценить ошибку нет универсальных методов
Слайд 5
5 Есть ли решение на [ a, b ] ? x y x * a b x y x * a b есть решение нет решения нет решения x y x * a b Если непрерывная функция f ( x ) имеет разные знаки на концах интервалы [ a, b ], то в некоторой точке внутри [ a, b ] имеем f ( x ) = 0 ! !
Слайд 6
6 Метод дихотомии (деление пополам) Найти середину отрезка [a,b] : c = (a + b) / 2; Если f(c)*f(a)<0, сдвинуть правую границу интервала b = c; Если f(c)*f(a) ≥ 0, сдвинуть левую границу интервала a = c; Повторять шаги 1-3, пока не будет b – a ≤ . x y x * a b с
Слайд 7
7 Метод дихотомии (деления пополам ) простота можно получить решение с заданной точностью (в пределах точности машинных вычислений) нужно знать интервал [ a, b ] на интервале [ a, b ] должно быть только одно решение большое число шагов для достижения высокой точности только для функций одной переменной
Слайд 8
8 Метод деления отрезка пополам //---------------------------------------------- // BinSolve находит решение на [a,b] // методом деления отрезка пополам // Вход: a, b – границы интервала, a < b // eps - точность решения // Выход: x – решение уравнения f(x)=0 //---------------------------------------------- float BinSolve ( float a, float b, float eps ) { float c; while ( b - a > eps ) { c = (a + b) / 2; if ( f(a)*f(c) < 0 ) b = c; else a = c; } return (a + b) / 2; } float f ( float x ) { return x*x – 5; }
Слайд 9
9 Как подсчитать число шагов? float BinSolve ( float a, float b, float eps, int &n ) { float c; n = 0; while ( b - a > eps ) { c = (a + b) / 2; if ( f(a)*f(c) < 0 ) b = c; else a = c; n ++; } return (a + b) / 2; } int &n n = 0; n ++; Вызов в основной программе: float x; int N; ... x = BinSolve ( 2, 3, 0.0001, N ); printf(" Ответ: x = %7.3f", x); printf(" Число шагов: %d", N); значение переменной меняется внутри функции
Слайд 10
10 Метод итераций (повторений) Задача: Эквивалентные преобразования: имеет те же решения при Идея решения: – начальное приближение (например, с графика) Проблемы: как лучше выбрать ? всегда ли так можно найти решение?
Слайд 11
11 Сходимость итераций Сходящийся итерационный процесс: последовательность приближается ( сходится) к точному решению. односторонняя сходимость двусторонняя сходимость
Слайд 12
12 Расходимость итераций Расходящийся итерационный процесс: последовательность неограниченно возрастает или убывает, не приближается к решению. односторонняя расходимость двусторонняя расходимость
Слайд 13
13 От чего зависит сходимость? сходится расходится Выводы: сходимость итераций зависит от производной итерации сходятся при и расходятся при сходимость определяется выбором параметра b
Слайд 14
14 Как выбрать b ? наугад, пробовать разные варианты для начального приближения x 0 пересчитывать на каждом шаге, например: Какие могут быть проблемы ? ?
Слайд 15
15 Метод итераций (программа) //---------------------------------------------- // Iter решение уравнения методом итераций // Вход: x – начальное приближение // b - параметр // eps - точность решения // Выход: решение уравнения f(x)=0 // n - число шагов ////---------------------------------------------- float Iter ( float x, float b, float eps, int &n) { int n = 0; float dx; while ( 1 ) { dx = b*f(x); x = x + dx; if ( fabs(dx) < eps ) break; n ++; if ( n > 100 ) break; } return x; } аварийный выход нормальный выход
Слайд 17
17 Метод Ньютона (программа) //---------------------------------------------- // Newton решение уравнения методом Ньютона // Вход: x – начальное приближение // eps - точность решения // Выход: решение уравнения f(x)=0 // n - число шагов ////---------------------------------------------- float Newton ( float x, float eps, int &n) { int n = 0; float dx; while ( 1 ) { dx = f(x) / df(x); x = x - dx; if ( fabs(dx) < eps ) break; n ++; if ( n > 100 ) break; } return x; } float f ( float x ) { return 3*x*x*x+2*x+5; } float df ( float x ) { return 9*x*x + 2; }
Слайд 18
18 Метод Ньютона быстрая (квадратичная) сходимость – ошибка на k - ом шаге обратно пропорциональна k 2 не нужно знать интервал, только начальное приближение применим для функция нескольких переменных нужно уметь вычислять производную (по формуле или численно) производная не должна быть равна нулю может зацикливаться
Слайд 19: Численные методы
Тема 2. Вычисление площади (интеграла) © К.Ю. Поляков, 2008
Слайд 20
20 Площадь криволинейной трапеции x y b a y = f ( x ) x y b a y = f 1 ( x ) y = f 2 ( x )
Слайд 21
21 Метод ( левых) прямоугольников x y x с2 x с1 h y = f 1 ( x ) y = f 2 ( x ) S 1 S 2 S 3 S 4 S i x x x+h f 1 ( x ) f 2 ( x ) float Area () { float x, S = 0, h=0.001; for ( x = xc1; x < xc2; x += h) S += h*(f1(x) – f2(x)); return S; } for ( x = xc1; x < xc2; x += h ) S += f1(x) – f2(x); S *= h; Как улучшить решение? ? Почему не x <= xc2 ? ?
Слайд 22
22 Метод ( правых) прямоугольников x y x с2 x с1 h y = f 1 ( x ) y = f 2 ( x ) S 1 S 2 S 3 S 4 S i x x+h f 1 ( x ) f 2 ( x ) float Area () { float x, S = 0, h=0.001; for ( x = xc1; x < xc2; x += h) S += h*(f1(x + h) – f2(x+h)); return S; } for ( x = xc1; x < xc2; x += h ) S += f1(x+h) – f2(x+h); S *= h;
Слайд 23
23 Метод ( средних) прямоугольников x y x с2 x с1 h y = f 1 ( x ) y = f 2 ( x ) S 1 S 2 S 3 S 4 float Area () { float x, S = 0, h=0.001; for ( x = xc1; x < xc2; x += h) S += h*(f1(x + h) – f2(x+h)); return S; } for ( x = xc1; x < xc2; x += h ) S += f1(x+h/2) – f2(x+h/2); S *= h; f 1 ( x ) f 2 ( x ) x S i x+h Какой метод точнее? ? левые (правые): средние
Слайд 24
24 Метод трапеций x y x с2 x с1 h y = f 1 ( x ) y = f 2 ( x ) for ( x = xc1; x < xc2; x += h ) S += f1(x) – f2(x) + f1(x+h) – f2(x+h); S *= h/2; Ошибка x x+h f 1 ( x ) f 2 ( x ) S i Как улучшить? ? S =( f1(xc1) - f2(xc1) + f1(xc2) - f2(xc2) )/2.; for ( x = xc1+h; x < xc2; x += h ) S += f1(x) – f2(x); S *= h; S 1 S 2 S 3 S 4
Слайд 25
25 Метод Монте-Карло Применение : вычисление площадей сложных фигур (трудно применить другие методы). Требования : необходимо уметь достаточно просто определять, попала ли точка ( x, y ) внутрь фигуры. Пример : заданы 100 кругов (координаты центра, радиусы), которые могу пересекаться. Найти площадь области, перекрытой кругами. Как найти S ? ?
Слайд 26
26 Метод Монте-Карло Вписываем сложную фигуру в другую фигуру, для которой легко вычислить площадь ( прямоугольник, круг, …). Равномерно N точек со случайными координатами внутри прямоугольника. Подсчитываем количество точек, попавших на фигуру : M. 4. Вычисляем площадь : Всего N точек На фигуре M точек Метод приближенный. Распределение должно быть равномерным. Чем больше точек, тем точнее. Точность ограничена датчиком случайных чисел. !
Слайд 28
28 Длина кривой x y b a y = f ( x ) L Точное решение: нужна формула для производной сложно взять интеграл Приближенное решение: x i x i +h f ( x ) L i L 1 L 2 L N
Слайд 29
29 Длина кривой //---------------------------------------------- // CurveLen вычисление длины кривой // Вход: a, b – границы интервала // Выход: длина кривой y = f(x) на интервале [a,b] //---------------------------------------------- float CurveLen ( float a, float b ) { float x, dy, h = 0.0001, h2 = h*h, L = 0; for ( x = a; x < b; x += h ) { dy = f(x+h) - f(x); L += sqrt(h2 + dy*dy); } return L; }
Слайд 31
31 Найти x, при котором или при заданных ограничениях. Основные понятия Оптимизация – поиск оптимального (наилучшего в некотором смысле) решения. Цель : определить значения неизвестных параметров, при которых заданная функция достигает минимума (затраты) или максимума (доходы). Ограничения – условия, которые делают задачу осмысленной. или
Слайд 32
32 Локальные и глобальные минимумы y = f ( x ) глобальный минимум локальные минимумы Задача : найти глобальный минимум. Реальность : большинство известных алгоритмов находят только локальный минимум вблизи начальной точки алгоритмы поиска глобального минимума в общем случае неизвестны Что делать : для функций одной переменной начальная точка определяется по графику случайный выбор начальной точки запуск алгоритма поиска с нескольких разных точек и выбор наилучшего результата
Слайд 33
33 Минимум функции одной переменной Дано : на интервале [a,b] функция непрерывна и имеет единственный минимум. Найти : x * y = f ( x ) Принцип сжатия интервала : Как выбрать c и d наилучшим образом? ?
Слайд 34
34 Минимум функции одной переменной Постоянное сжатие в обоих случаях : y = f ( x ) Коэффициент сжатия: Самое быстрое сжатие: при должно быть c d Метод «почти половинного» деления : – малое число нужно искать два значения функции на каждом шаге
Слайд 35
35 Отношение «золотого сечения» Идея: выбрать c и d так, чтобы на каждом шаге вычислять только одно новое значение функции. Уравнение для определения g : Отношение «золотого сечения» :
Слайд 36
36 Метод «золотого сечения» //---------------------------------------------- // Gold поиск минимума функции ( «золотое сечение») // Вход: a, b – границы интервала // eps – точность // Выход: x, при котором f(x) имеет минимум // на интервале [a,b] //---------------------------------------------- float Gold (float a, float b, float eps ) { float x1, x2, g = 0.618034, R = g*(b - a); while ( fabs(b-a) > eps ) { x1 = b - R; x2 = a + R; if ( f(x1) > f(x2) ) a = x1; else b = x2; R *= g; } return (a + b) /2.; } Как вычислять только одно значение на каждом шаге? ?
Слайд 37
37 Функции нескольких переменных Найти, для которых при заданных ограничениях. Проблемы : нет универсальных алгоритмов поиска глобального минимума неясно, как выбрать начальное приближение (зависит от задачи и интуиции) Подходы : методы локальной оптимизации (результат зависит от выбора начального приближения) случайный поиск (без гарантии) методы глобальной оптимизации (для особых классов функций)
Слайд 38
38 Метод покоординатного спуска Идея : выбираем начальную точку будем менять только x 1, а остальные переменные «заморозим», находим минимум по x 1 теперь будем менять только x 2, а остальные переменные «заморозим», … начальное приближение минимум простота, сводится к нескольким задачам с одной переменной можно двигаться к минимуму быстрее большой объем вычислений может не найти решение для сложных функций
Слайд 39
39 Градиентные методы Градиент – это вектор, показывающий направление наискорейшего возрастания функции. Идея: выбираем начальную точку на каждом шаге двигаемся в направлении, противоположном градиенту минимум начальное приближение быстрая сходимость необходимо считать производные (по формуле или численно) плохо работает для быстро меняющихся функций градиент
Слайд 40
40 Метод случайного поиска Идея: выбираем начальную точку пробуем сделать шаг в случайном направлении если значение функции уменьшилось, шаг удачный (запоминается) минимум начальное приближение простота реализации не требует вычисления производных много вариантов с самообучением хорошо работает для функций с многими локальными минимумами очень большой объем вычислений