Цель работы
Изучение прямых методов многомерной минимизациии разработка программы, удовлетворяющей требованиям лабораторной работы 5.
Начальные данные
В программе используется метод Пауэлла-1;
Функция f(x) |
Начальная точка x1 |
Значение минимума x* |
(x2–x12)2+ (1 –x1)2 |
(1.5; 2) (0; 0) (–1.2; 1) |
(1; 1) |
x13+x22– 3x1– 2x2+ 2 |
(0; 0) (–1; –1) |
(1; 1) |
Краткое описание метода
начальный этап:
1)установить значение счетчика к=1;
2)задать точность вычислений е=10-4– 10-7
3)задать начальную точку x0;
4)Создать систему поисковых направлений P={e1,e2,e1}, гдеe1,e2 координатные орты
основной этап:
шаг 1: выполнить nодномерных поисков вдоль системы изnлинейно независимых направленийPспустились из точкиx0 в точкуxn+1
шаг 2: найти новое поисковое направление dk=xn+1-x0;
шаг 3: перейти в новую точку xn+2=xn+1+ αk+1 *dk
шаг 4: проверить критерий окончания поиска ||||<e
если он выполнился, то минимум найден xмин=xk,
иначе
Pk+1={p1k+1=p2k;…;pnk+1} и перейти на шаг 1.
Спецификация программы
Глобальные переменные:
int z=0;//выбор функции
Int dlin;//число переменных
Классы:
class vect //класс вектор
{
public:
unsigned short n; //длина вектора
double * x;
vect()//конструктор по умолчанию
vect(unsigned short dlin) {n=dlin;if(n!=0) x=new double [n];else x=0;} //создание вектора длины n без инициализации
vect (vect &a) //конструктор копирования
vect operator = (vect &a)//конструктор копирования
vect mult(double c) //метод класса, для умножения вектора на число
vect sum(vect a) //метод класса, для подсчета суммы векторов
vect razn(vect a) //метод класса, для подсчета разности векторов
double pr_ch(vect b)// метод для перемножения векторов
double norm()//подсчет нормы вектора
}
class matr//класс матрица
{
public:
unsigned short n;//размерность
double * x;
matr(unsigned short dlin=0)
matr (matr &a) // метод для копирования матриц
matr operator = (matr &a)// метод для копирования матриц
double & e(unsigned short i,unsigned short j )// метод для определения элемента матрицы
matr multm(matr &a, matr &res)// метод для перемножения матриц
matr sum(matr a, matr b)// метод для сложения матриц
matr mult(double c)// метод для перемножения матрицы на число
vect mult(vect &a)// метод для перемножения матрицы на столбец
vect mult(vect &a)// метод для перемножения матрицы на столбец
Спецификация функций
Имя функции |
Назначение |
Входные параметры |
Возвращаемое значение |
main |
главная функция |
- |
- |
у |
вычисляет значение текущей функции в данной точке |
vect &v |
double |
next |
вычисляет значение текущей функции в точке полученной перемещением из данной точки, на данное расстояние, по заданному направлению |
double a, vect &x0, vect &p |
double |
dy |
вычисляет значение производной текущей функции в из данной точки, на данное расстояние, по заданному направлению |
double a, vect &x0, vect & p |
double
|
grad |
вычисляет градиент в заданой точке |
vect&point |
vect
|
Swann4 |
находит начальный интервал методом Свенна4 |
double a0,vect &x0, vect & p, double &x1, double &x2 |
- |
Davidon |
находит минимум по заданному направлению методом Давидона |
vect &x0, vect & p, double *al |
- |
step |
осуществляет шаг метода Коши |
vect&x0 |
vec
|
Paul1 |
Находит минимум функции методом Пауелла1 |
vect&x0 |
- |
Результаты тестирования программы
Функция:
f(x)= (x2 – x12)2 + (1 – x1)2
Погрешность: e=10-4
Начальная точка х1=(1.5, 2)
Изменение точки x:
-x2=[1.000035,0.999982]
ITER=1, Min:1.000035, 0.999982,
Функция:
x13+x22– 3x1– 2x2+ 2
Погрешность: e=10-4
Начальная точка х1=(-1,-1)
Изменение точки x:
x2=[0.312928,0.097923]
x2=[0.926363,0.785706]
x2=[0.999890,0.999879]
ITER=3, Min:1.000001, 1.000001,