Лаб1вариант4 / Отчет_по_лаб_1
.docТребования задания.
Целью работы является:
-
Сравнение двух методов одномерной минимизации – прямого и
интерполяционного.
-
Разработка программы, реализующей прямой метод на этапе установления границ начального интервала и метод полиномиальной интерполяции для
локализации искомого минимума.
f(x)= х4 - 14х3 + 60х2 - 70х
х0=2
e=0.01
Контрольный ответ х*=0,780884
Метод
Таким образом:
-
по заданной начальной точке методом Свенна1 нужно определить интервал локализации минимума, после чего, методом Фибоначчи 2 сокращать ТИЛ и по достижении КОП вычислить минимум функции.
-
Выполнить несколько шагов алгоритма методом Свенна1, а далее минимум искать методом Фибоначчи 2.
Описание методов оптимизации.
Метод Свенна:
Начальный интервал локализации минимума унимодальной функции f(х) определяется методом Свенна.
Начальный этап:
(1) Дана начальная точка х R . Дается начальный шаг
h =х =(0,10,01)*| x|
Основной этап:
Шаг 1. Установить направления убывания функции. Надо взять
х=х+h, если f >f , то поменять направление движение то есть, h=- h
и взять х=х+h
Шаг 2.Вычислить функцию f в точках х, х, … по формуле
x=x+h где, h=2*h, k=2, 3, ………, n-1
до тех пор, пока не придем в точку х , такой что , f >f (то есть функция стала расти)
Шаг 3.Установить начальный интервал локализации минимума. С запасом, что проскакиваем минимум на предн. шаге, устанавливаем
а=х в= х
x
x x х
Метод Фибоначчи 2:
Начальный этап:
1.Получать [а , в] , методом Свенна 1, выбрать L=10
последующего интервала , характеризующая точность вычисления.
2.Вычислить n-число вычислении функции. Для этого необходимо взять
F ; F= ; L=| в- а| ;
Зная F находим N = f( F) где, f = 1.618 /
3.Положить к=1 и взять одну стартовую точку на расстоянии от L от любого из концов а или в
х= + L= а+( F/ F)* L+(-1)/ F*ε или х= в- L
х
а в
L
Основной этап:
Шаг 1. Проверить критерии окончании поиска. Если к=N, то стоп минимум равно х;
Шаг 2. (1) Взять очередную точку х по правилу симметрии х=а-в- х как в методе Золотого сечения 2.
(2) Сравниваем 4-х ситуации сохранить текущий интервал локализации, как в методе Золотого сечения 2
(3) Положить к=к+1 и идти в Шаг 1.
Блок-схема алгоритма.
Метод Свенна 1:
да
func(х)<func(х )
Нет h=- h
х= х
х=х+h
h=- h
х= х
х=х+h
Да
func(х)<func(х )
Нет
a= х -3*h/2;
b= х;
Метод Фибоначчи 2
Нач . операторы
Да
k==n
Нет Xmin=xf2
Нет func(xf1)<func(xf2) Да
Нет Да Нет Да
xf1<xf2 xf1>xf2
b=xf1 a=xf1 a=xf2 b=xf2
xf1=b-xf2+a xf1=b-xf2+a xf2=b-(xf1-a) xf2=b-xf1+a
Да
k<n
Нет
Xmin=xf2
Спецификация.
func - заданная функция.
x - начальная точка.
h - шаг движения.
х - х=х+h- cледующая точка.
a=а - начало интервала в обоих методах .
b=b- конец интервала в обоих методах .
ε - погрешность рассчёта в методе дихотомии.
k - число итераций метода.
Xmin - точка минимума функции.
Нач. операторы: L1=fabs(b-a);
cout<<"L1: "<<L1<<endl;
Fn= L1/Ln;
cout<<"Fn: "<<Fn<<endl;
n= log(Fn*sqrt(5))/log(1.618);
cout<<"n: "<<n<<endl;
xf1=a+0.382*L1;
L1-
Fn-
xf1-
n-
Ln-
Антон сам напиши то что наверху
Тексты программ.
Т.к. различия в программах начинаются только с этапа поиска минимума, уменьшая ТИЛ, то сначала целесообразно привести общий фрагмент программы, а именно – метод Свенна1 и определение функций и переменных, а затем отдельно рассмотреть фрагменты различных методов линейного поиска.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
double func(double x)
{
return x*x*x*x-14*x*x*x+60*x*x-70*x;
}
double x0=2, e=0.01, h, x1, x2, a, b;
void svenn(void)
{
h=e*fabs(x0);
x1=x0;
x2=x1+h;
if (func(x1) < func(x2))
h = -h;
x1=x0;
x2=x1+h;
do
{ h=h*2;
x1=x2;
x2=x1+h;
}
while( func(x2) < func(x1));
a = x2-3*h/2;
b = x2;
double r;
if(a < b)
cout<<"a:"<<a<<endl<<"b:"<<b<<endl;
else
{ r=b;
b=a;
a=r;
cout<<"a:"<<a<<endl<<"b:"<<b<<endl;
}
}
void fib_2()
{
double Ln=0.00001, Fn, L1, n, xf1, xf2, ef=0.0001,xmin;
L1=fabs(b-a);
cout<<"L1: "<<L1<<endl;
Fn= L1/Ln;
cout<<"Fn: "<<Fn<<endl;
n= log(Fn*sqrt(5))/log(1.618);
cout<<"n: "<<n<<endl;
xf1=a+0.382*L1;
int k=1;
if(k==n)
{ xmin=xf1;
cout<<"xmin1:"<<xmin<<endl;
}
do
{ if( func(xf1) < func(xf2) )
{ if(xf1 < xf2)
{ b=xf2;
xf2=b-xf1+a;
}
else
{ a=xf2;
xf2=b-(xf1-a);
}
}
if( func(xf1) > func(xf2))
{ if( xf1 < xf2)
{ a=xf1;
xf1=b-(xf2-a);
}
else
{ b=xf1;
xf1=b-xf2+a;
}
}
k=k+1;
}
while(k < n);
cout<<endl<<endl<<"xmin:"<<xf2<<endl;
getch();
}
void main()
{
clrscr();
printf("Method Swann: \n\r\n\r");
svenn();
printf("Method Fibonacci: \n\r\n\r");
fib_2();
getch();
getch();
}
Результаты тестирования программы.
В результате выполнения программы был получен результат:
После Свенна 1,мы получили интервал
[ -0.54 , 1.38 ]
После Фибоначчи 2 получаем минимум
Хмин =7,78048 ,что соответствует ответу.
При e=0.001.
Аналогичный результат был получен в математическом приложении “Mathcad” хх=0,3575, что свидетельствует о правильной работа программы.
.