4
Численные методы
Идея: последовательное уточнение решения с помощью некоторого алгоритма.
Область применения: когда найти точное решение невозможно или крайне сложно.
можно найти хоть какое-то решение
во многих случаях можно оценить ошибку (то есть можно найти решение с заданной точностью)
нельзя найти точное решение
невозможно исследовать решение при изменении параметров
большой объем вычислений
иногда сложно оценить ошибку
нет универсальных методов
7
Метод дихотомии (деления пополам)
простота
можно получить решение с заданной точностью (в пределах точности машинных вычислений)
нужно знать интервал [a, b]
на интервале [a, b] должно быть только одно решение
большое число шагов для достижения высокой точности
только для функций одной переменной
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
Как подсчитать число шагов?
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 ++;
значение переменной меняется внутри функции
12
Расходимость итераций
Расходящийся итерационный процесс: последовательность неограниченно возрастает или убывает, не приближается к решению.
односторонняя расходимость
двусторонняя расходимость
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
Метод Ньютона (программа)
//----------------------------------------------
// 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
Метод Ньютона
быстрая (квадратичная) сходимость – ошибка на k-ом шаге обратно пропорциональна k2
не нужно знать интервал, только начальное приближение
применим для функция нескольких переменных
нужно уметь вычислять производную (по формуле или численно)
производная не должна быть равна нулю
может зацикливаться
22
Метод (правых) прямоугольников
x
y
xс2
xс1
y = f1 (x)
y = f2 (x)
S1
S2
S3
S4
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
Метод (средних) прямоугольников
x
y
xс2
xс1
y = f1 (x)
y = f2 (x)
S1
S2
S3
S4
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;
левые (правые):
средние
24
Метод трапеций
x
y
xс2
xс1
y = f1 (x)
y = f2 (x)
for ( x = xc1; x < xc2; x += h )
S += f1(x) – f2(x) +
f1(x+h) – f2(x+h);
S *= h/2;
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;
25
Метод Монте-Карло
Применение: вычисление площадей сложных фигур (трудно применить другие методы).
Требования: необходимо уметь достаточно просто определять, попала ли точка (x, y) внутрь фигуры.
Пример: заданы 100 кругов (координаты центра, радиусы), которые могу пересекаться. Найти площадь области, перекрытой кругами.
26
Метод Монте-Карло
Вписываем сложную фигуру в другую фигуру, для которой легко вычислить площадь (прямоугольник, круг, …).
Равномерно N точек со случайными координатами внутри прямоугольника.
Подсчитываем количество точек, попавших на фигуру: M.
4. Вычисляем площадь:
Всего N точек
На фигуре M точек
Метод приближенный.
Распределение должно быть равномерным.
Чем больше точек, тем точнее.
Точность ограничена датчиком случайных чисел.
!
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
Найти x, при котором или при заданных ограничениях.
Основные понятия
Оптимизация – поиск оптимального (наилучшего в некотором смысле) решения.
Цель: определить значения неизвестных параметров, при которых заданная функция достигает минимума (затраты) или максимума (доходы).
Ограничения – условия, которые делают задачу осмысленной.
или
32
Локальные и глобальные минимумы
глобальный минимум
Задача: найти глобальный минимум.
Реальность:
большинство известных алгоритмов находят только локальный минимум вблизи начальной точки
алгоритмы поиска глобального минимума в общем случае неизвестны
Что делать:
для функций одной переменной начальная точка определяется по графику
случайный выбор начальной точки
запуск алгоритма поиска с нескольких разных точек и выбор наилучшего результата
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
Функции нескольких переменных
Проблемы:
нет универсальных алгоритмов поиска глобального минимума
неясно, как выбрать начальное приближение (зависит от задачи и интуиции)
Подходы:
методы локальной оптимизации (результат зависит от выбора начального приближения)
случайный поиск (без гарантии)
методы глобальной оптимизации (для особых классов функций)
38
Метод покоординатного спуска
Идея:
выбираем начальную точку
будем менять только x1, а остальные переменные «заморозим», находим минимум по x1
теперь будем менять только x2, а остальные переменные «заморозим», …
начальное приближение
минимум
простота, сводится к нескольким задачам с одной переменной
можно двигаться к минимуму быстрее
большой объем вычислений
может не найти решение для сложных функций
39
Градиентные методы
Градиент – это вектор, показывающий направление наискорейшего возрастания функции.
Идея:
выбираем начальную точку
на каждом шаге двигаемся в направлении, противоположномградиенту
минимум
начальное приближение
быстрая сходимость
необходимо считать производные (по формуле или численно)
плохо работает для быстро меняющихся функций
градиент
40
Метод случайного поиска
Идея:
выбираем начальную точку
пробуем сделать шаг в случайном направлении
если значение функции уменьшилось, шаг удачный (запоминается)
минимум
начальное приближение
простота реализации
не требует вычисления производных
много вариантов с самообучением
хорошо работает для функций с многими локальными минимумами
очень большой объем вычислений
© ООО «Знанио»
С вами с 2009 года.