- •Отчет по лабораторной работе №3 «Исследование методов линейного поиска»
- •Цель работы и требование задания
- •2. Краткое описание методов Метод Больцано.
- •Метод Давидона.
- •3. Блок-схема
- •4. Спецификация программы.
- •5. Исходный текст программы.
- •6. Тестирование программы.
- •7. Ответы на контрольные вопросы.
- •8. Выводы по выполнению работы.
4. Спецификация программы.
4.1. Исходные данные.
Исходными данными является начальная точка для алгоритма Swann4, шаг для алгоритма Swann, шаг для Давидона и шаг Больцано, а также направление поиска рt. (все перечисленные параметры вводятся перед компилированием, так что, по сути, исходными данными не являются, т.к. в задаче была указана одна функция и вся программа была оптимизирована под конкретные данные)
4.2. Выходные данные.
Выходными данными являются:
Значение границ интервала, полученного Swann, интервал, корень, полученный при досрочном завершении Свенна4, и количество итераций.
Значение границ интервала, полученного Boltsano, корень полученный методом Boltsano (при досрочном завершении Boltsano) и количество итераций.
Значение минимума, полученного методом Davidonа, и количество итераций.
Для всех алгоритмов (при досрочном завершении или обычном завершении Давидона) приводится значение найденного минимума, значение функции в точке минимума, параметр <альфа>.
4.4. Назначение программы.
Программа находит минимум многомерной функции методом линейного поиска.
4.4.1 Основные переменные;
а)функция Swann4
|
Имя |
Тип |
Описание |
|
y1 |
double |
значение производной в точке по направлению |
|
y2 |
double |
значение производной в точке по направлению |
|
alfa |
double |
параметр альфа |
|
x1 |
myVector |
вектор |
|
x2 |
myVector |
вектор |
б)функция Boltsano
|
Имя |
Тип |
Описание |
|
x |
myVector |
вектор |
|
y |
double |
значение производной в точке по направлению |
|
c |
double |
параметр альфа |
|
b |
double |
Правая граница интервала |
|
eps |
double |
Эпсилон – точность вычислений |
в)функция Davidon
|
Имя |
Тип |
Описание |
|
x1 |
myVector |
вектор |
|
x2 |
myVector |
вектор |
|
Х |
myVector |
вектор |
|
y |
double |
значение производной в точке по направлению |
|
alfa0 |
double |
сдвиг координат |
|
eps |
double |
Эпсилон – точность вычислений |
|
r |
double |
параметр альфа |
|
z |
double |
для нахождения r |
|
w |
double |
для нахождения r |
|
fmin |
double |
минимальное значение функции среди трех точек |
|
xmin |
double |
аргумент при минимальном значении функции среди трех точек |
|
k |
int |
Счетчик итераций |
4.4.2 Процедуры и функции.
|
Имя |
Параметры |
Назначение | ||
|
входные |
выходные |
транзитные | ||
|
fun |
const myVector &mV |
|
|
Находит значение целевой функции |
|
gradient |
const myVector &point |
|
|
находит градиент функции в точке
|
|
d_fun |
const myVector &point,const myVector &line
|
|
|
находит градиент функции в точке по направлению |
|
Swann4 |
const myVector &start_point, myVector &linealone=false |
double &a, double &b, myVector &answer |
|
Свенн-4 |
|
Davidon |
myVector &start_point, myVector &line |
myVector &answer |
double &a, double &b |
метод Давидона |
|
Boltsano |
myVector &start_point, myVector &line |
myVector &answer |
double &a,double &b |
Метод Больцано |
4.3. Место и форма представления данных.
Выходные данные выводятся на экран.
4.4. Сценарий диалога с пользователем
Работа программы предусматривает только одно место взаимодействия с пользователем: после вывода полученных результатов, программа ожидает нажатие любой клавиши и выполняет выход.
4.5. Описание пользовательских данных
class myVector
{
public:
double x,y; //default Constructor
myVector(double x0=0, double y0=0){
x=x0;
y=y0;
} //basic operators
myVector operator + (const myVector &mV) { //sum of two Vectors
return myVector(x+mV.x,y+mV.y);
}
myVector &operator -(){ //unary minus
this->x = - this->x;
this->y = - this->y;
return *this;
}
myVector operator -(const myVector &mV) { //difference of two vectors
return myVector(x-mV.x,y-mV.y);
}
myVector operator *(const double i) { //multiply by Num postfix
return myVector(x*i,y*i);
}
double operator *(const myVector &mV){ //Scalar Multiply
return (this->x * mV.x + this->y * mV.y);
}
};
