Безусловная одномерная оптимизация
Характеристика методов одномерной безусловной оптимизации. Пассивный оптимальный алгоритм. Алгоритм деления интервала пополам. Методы перебора, дихотомии, золотого сечения, Фибоначчи, касательных, парабол. Сравнение эффективности применения методов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | лабораторная работа |
Язык | русский |
Дата добавления | 01.12.2015 |
Размер файла | 720,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Уфимский Государственный Авиационный Технический Университет
Лабораторная работа
«Безусловная одномерная оптимизация»
Цель работы: знакомство с оптимизационными задачами, изучение различных методов одномерной оптимизации и сравнение эффективности их применения для конкретных целевых функций.
Задание:
1. Изучить предлагаемые методы одномерной безусловной оптимизации.
2. В соответствии с вариантом задания, определенным преподавателем, составить программы, реализующие методы поиска, и найти точку минимума функции f(x) на отрезке [a,b], указано число экспериментов N, то сравнить заданные в варианте методы по получаемой длине отрезка неопределенности.
3. Оформить отчет о выполнении задания с приведением условия задачи, алгоритмов и программ указанных методов поиска, таблицы результатов сравнения рассмотренных методов, заключения по результатам сравнения методов.
Методы одномерной безусловной оптимизации:
а) пассивный оптимальный алгоритм;
б) метод перебора.
в) алгоритм деления интервала пополам;
г) метод дихотомии;
д) метод золотого сечения;
е) метод Фибоначчи;
ж) метод касательных;
з) метод парабол.
№ |
Целевая функция |
Отрезок [a,b] |
|
14 |
x2 + e-0.25*x |
[0,1] |
оптимизация безусловный одномерный
Постановка задачи:
Найти точку минимума функции f(x)= x2 + e-0.25*x на отрезке [0,1] с заданной точностью.
График функции x2 + e-0.25*x на отрезке [0,1]:
X=0.44712; Y = 3,77688
Текст программы на С++
#include<iostream>
#include<math.h>
#include<conio.h>
#include<stdio.h>
using namespace std;
const double e=0.0001,
t1=0, t2=1, d=e/10;
doube f(double x)
{double f;
f=x*x+4*exp(-0.25*x);
return f;
}
double df(double x)
{double f;
f=2*x-exp(-0.25*x);
return f;
}
void blochnimetod(){
double a=t1, b=t2, x[1000], y[1000], xl, yl;
long i, j, n, N, k, l;
cout<<"Алгоритм блочного равномерного поиска."<<endl;
cout<<"Введите размер блока: ";
cin>>n;
N=0;
if (n%2==0){
k=n/2;
while (b-a> 2*e)
{for (j=1; j<k+1; j++){
x[2*j]=a+j*(b-a)/(k+1);
x[2*j-1]=x[2*j]-d;}
for (i=1; i<n+1; i++){
y[i]=f(x[i]);}
x[0]=a;
x[n+1]=b;
N=n+N;
yl=y[1]; l=1; xl=x[1];
for (i=2; i<n+1; i++){
if (y[i]<yl) {yl=y[i]; xl=x[i]; l=i;}}
a=x[l-1];
b=x[l+1];}
xl=(a+b)/2;
yl=f(xl);}
else{
k=(n+1)/2;
x[k]=(a+b)/2;
y[k]=f(x[k]);
N=1;
while (b-a>2*e){
for (i=1; i<n+1; i++){
x[i]=a+i*(b-a)/(n+1);
y[i]=f(x[i]);}
x[0]=a;
x[n+1]=b;
N=N+n-1;
yl=y[1]; xl=x[1]; l=1;
for (i=2; i<n+1; i++){
if (y[i]<yl) {yl=y[i]; xl=x[i]; l=i;}}
a=x[l-1];
b=x[l+1];
x[k]=xl; y[k]=yl;}}
cout<<"x = "<< xl<<endl;
cout<<"y = "<< yl<<endl;
cout<<"Число эксперементов: N = "<<N<<endl;
_getch();
}
void fibonachi(){
int F1, F0, F, N;
double x1,x2,y1,y2,x,y,a=t1,b=t2,Fn;
F0=1; F1=1;
F=0; N=0;
Fn=(b-a)/2/e;
cout<<"Метод Фибоначи."<<endl;
while (F<Fn){
F=F1+F0;
if (F<Fn){
F0=F1;
F1=F; }}
x1=a+F0*(b-a)/F;
x2=a+F1*(b-a)/F;
y1=f(x1);
y2=f(x2);
N=0;
do{ if (y1<=y2){
b=x2; x2=x1; y2=y1; x1=a+b-x2; y1=f(x1);}
else{a=x1; x1=x2; y1=y2; x2=a+b-x1; y2=f(x2);}
N++;}
while (b-a>2*e);
if (y1<=y2){
b=x2, x2=x1, y2=y1;}
else {a=x1;}
x1=x2-d;
y1=f(x1);
x=(a+b)/2;
y=f(x);
cout<<"x = "<< x<<endl;
cout<<"y = "<< y<<endl;
cout<<"Число эксперементов: N = "<<N<<endl;
_getch();
}
void perebor(){
long double x, y, yl, xl, a=t1, b=t2, i, N;
N=(a+b)/e;
cout<<"Метод перебора."<<endl;
cout<<"Количество точек (эксперементов) N = "<<N<<" для точности e = "<<e<<endl;
for (i=1; i<N+1; i++){
x=a+i*(b-a)/(N+1);
y=f(x);
if ((i==1) || (yl>y)) {xl=x; yl=y;}}
cout<<"x = "<< xl<<endl;
cout<<"y = "<< yl<<endl;
_getch();
}
void seredinaotr(){
double a=t1, b=t2, x[5], y[4], yl, xl;
int i, N, l;
cout<<"Алгоритм деления интервала пополам."<<endl;
x[2]=(a+b)/2;
y[2]=f(x[2]);
N=1;
while (b-a > 2*e){
x[0]=a;
x[4]=b;
x[1]=(a+x[2])/2;
y[1]=f(x[1]);
x[3]=(x[2]+b)/2;
y[3]=f(x[3]);
N=N+2;
yl=y[1]; xl=x[1]; l=1;
for (i=2; i<4; i++){
if (yl>y[i]) {yl=y[i]; xl=x[i]; l=i;}}
a=x[l-1];
b=x[l+1];
x[2]=xl;
y[2]=yl;}
cout<<"x = "<< x[2]<<endl;
cout<<"y = "<< y[2]<<endl;
cout<<"Число эксперементов: N = "<<N<<endl;
_getch();
}
void dixotomii(){
double x,y,y1,y2,a=t1,b=t2;
int N;
cout<<"Метод дихотомии."<<endl;
x=(a+b)/2;
N=0;
while ((b-a)>2*e){
y1=f(x-d);
y2=f(x+d);
N=N+2;
if (y1<=y2){b=x+d;}
else{a=x-d;}
x=(a+b)/2;}
y=f(x);
cout<<"x = "<< x<<endl;
cout<<"y = "<< y<<endl;
cout<<"Число эксперементов: N = "<<N<<endl;
_getch();
}
void zolotoesech(){
const double t=0.5*(1+sqrt(5));
double a=t1, b=t2, x1,x2, y1, y2, x;
int N=0;
cout<<"Метод золотого сечения."<<endl;
x1=a+(b-a)/(t*t);
y1=f(x1);
x2=a+(b-a)/t;
y2=f(x2);
N+=2;
while ((b-a)/t > 2*e){
if (y1<=y2) {b=x2;
x2=x1;
y2=y1;
x1=a+b-x2;
y1=f(x1); N++;}
else {a=x1;
x1=x2;
y1=y2;
x2=a+b-x1;
y2=f(x2); N++;}}
if (y1<y2){x=(a+x2)/2;}
else {x=(x1+b)/2;}
y1=f(x);
cout<<"x = "<< x<<endl;
cout<<"y = "<< y1<<endl;
cout<<"Число эксперементов: N = "<<N<<endl;
_getch();
}
void metodkasateln(){
double a=t1, b=t2, y1, y2, z1, z2, s, z, x, y;
int N;
cout<<"Метод касательных."<<endl;
y1=f(a);
y2=f(b);
z1=df(a);
z2=df(b);
N=2;
do{ s=((b*z2 - a*z1)-(y2-y1))/(z2-z1);
y=f(s);
z=df(s);
N=N+2;
if (z==0) {x=s; break;}
if (z>0) {b=s; y2=y; z2=z;}
else {a=s; y1=y; z1=z;}}
while (b-a>2*e);
x=(a+b)/2; y=f(x);
cout<<"x = "<< x<<endl;
cout<<"y = "<< y1<<endl;
cout<<"Число эксперементов: N = "<<N<<endl;
_getch();
}
void metodparobol(){
double a=t1, b=t2, ya, yb, yc, c=-3.5, t, s, yt, x, y;
int N;
cout<<"Метод парабол."<<endl;
if ((a>=c) || (b<=c) || (f(a)>=f(c)) || f(b)<=f(c)){ya=f(a);}
yb=f(b);
yc=f(c);
N=3;
while (b-a>2*e){
s=c+0.5*( (b-c)*(b-c)*(ya-yc) - (c-a)*(c-a)*(yb-yc) )/( (b-c)*(ya-yc) + (c-a)*(yb-yc) );
if (s==c){t=(a+c)/2;}
else {t=s;}
yt=f(t);
N++;
if (t>c){
if (yt<yc) {a=c; ya=yc; c=t; yc=yt;}
else if (yt>yc) {b=t; yb=yt;}
else {a=c; ya=yc; b=t; yt=yc; c=(a+b)/2; yc=f(c); N++;}}
else {
if (yt<yc) {b=c; yb=yc; c=t; yc=yt;}
else if (yt>yc) {a=t; ya=yt;}
else {a=t; ya=yt; b=c; yb=yc; c=(a+b)/2; yc=f(c); N++;}}}
x=(a+b)/2; y=f(x);
cout<<"x = "<< x<<endl;
cout<<"y = "<< y<<endl;
cout<<"Число эксперементов: N = "<<N<<endl;
_getch();
}
int main(){
setlocale(LC_ALL, "Russian");
int j;
while (1){
cout <<endl<< "1. Алгоритм блочного равномерного поиска.\n";
cout << "2. Метод Фибоначчи.\n";
cout << "3. Метод перебора.\n";
cout << "4. Алгоритм деления интервала пополам.\n";
cout << "5. Метод дихотомии.\n";
cout << "6. Метод золотого сечения.\n";
cout << "7. Метод касательных.\n";
cout << "8. Метод парабол.\n";
cout << "9. Выход.\n";
cout <<endl<< "Ваш выбор (1-9): "; cin >> j; cout<<"\n";
switch(j){
case 1: blochnimetod(); break;
case 2: fibonachi(); break;
case 3: perebor(); break;
case 4: seredinaotr(); break;
case 5: dixotomii(); break;
case 6: zolotoesech(); break;
case 7: metodkasateln(); break;
case 8: metodparobol(); break;
case 9: cout << "Конец работы.\n"; return(0);
default: cout << "Нет пункта под номером " << j << ". Повторите.\n";}}
return(0);
}
Блок-схемы алгоритмов
Метод перебора
Размещено на http://www.allbest.ru/
Пассивный оптимальный метод
Размещено на http://www.allbest.ru/
Метод деления интервала пополам
Размещено на http://www.allbest.ru/
Метод дихотомии
Размещено на http://www.allbest.ru/
Метод золотого сечения
Размещено на http://www.allbest.ru/
Метод парабол
Метод касательных
Блочный метод
Метод чисел Фибоначчи
Расчётные формулы для N
Пассивный оптимальный:
Блочного равномерного поиска чётн:
Блочного равномерного поиска не чётн:
Деления интервала пополам:
Дихотомии:
Золотого сечения:
Фибоначчи:
Результирующая таблица
Для e=0.00001
Метод |
Результат |
N |
N расч. |
|
Метод перебора |
X=0.447116; Y = 3.77688 |
100000 |
||
Блочного равномерного поиска n=2 |
X=0.447121; Y = 3.77688 |
32 |
||
Блочного равномерного поиска n=3 |
X=0.447121; Y = 3.77688 |
33 |
||
Деления интервала пополам |
X=0.447121; Y = 3.77688 |
33 |
||
Дихотомии |
X=0.44712; Y = 3.77688 |
32 |
||
Золотого сечения |
X=0.44712; Y = 3.77688 |
24 |
||
Фибоначчи |
X=0.447121; Y = 3.77688 |
23 |
||
Касательных |
X=0.447123; Y = 3.77688 |
34 |
||
Парабол |
X=0.44712; Y = 3.77688 |
14 |
Для e=0.0001
Метод |
Результат |
N |
N расч. |
|
Метод перебора |
X=0.447155; Y = 3.77688 |
10000 |
||
Блочного равномерного поиска n=2 |
X=0.447173; Y = 3.77688 |
26 |
||
Блочного равномерного поиска n=3 |
X=0.447144; Y = 3.77688 |
27 |
||
Деления интервала пополам |
X=0.447144; Y = 3.77688 |
27 |
||
Дихотомии |
X=0.447084; Y = 3.77688 |
26 |
||
Золотого сечения |
X=0.447097; Y = 3.77688 |
19 |
||
Фибоначчи |
X=0.447081; Y = 3.77688 |
18 |
||
Касательных |
X=0.4471; Y = 3.77688 |
28 |
||
Парабол |
X=0.44712; Y = 3.77688 |
14 |
Для e=0.001
Метод |
Результат |
N |
N расч. |
|
Метод перебора |
X=0.447552; Y = 3.77688 |
1000 |
||
Блочного равномерного поиска n=2 |
X=0.447464; Y = 3.77688 |
20 |
||
Блочного равномерного поиска n=3 |
X=0.447266; Y = 3.77688 |
19 |
||
Деления интервала пополам |
X=0.447266; Y = 3.77688 |
19 |
||
Дихотомии |
X=0.446788; Y = 3.77688 |
20 |
||
Золотого сечения |
X=0.446784; Y = 3.77688 |
14 |
||
Фибоначчи |
X=0.446721; Y = 3.77688 |
13 |
||
Касательных |
X=0.446185; Y = 3.77688 |
20 |
||
Парабол |
X=0.44712; Y = 3.77688 |
14 |
Для e=0.01
Метод |
Результат |
N |
N расч. |
|
Метод перебора |
X=0.445545; Y = 3.77688 |
100 |
||
Блочного равномерного поиска (n=2) |
X=0.443781; Y = 3.77689 |
12 |
||
Блочного равномерного поиска (n=3) |
X=0.45313; Y = 3.77688 |
13 |
||
Деления интервала пополам |
X=0.445313; Y = 3.77688 |
13 |
||
Дихотомии |
X=0.445422; Y = 3.77688 |
12 |
||
Золотого сечения |
X=0.444272; Y = 3.77689 |
10 |
||
Фибоначчи |
X=0.445455; Y = 3.7768 |
8 |
||
Касательных |
X=0.443258; Y = 3.77703 |
14 |
||
Парабол |
X=0.44712; Y = 3.77688 |
14 |
Для e=0.1
Метод |
Результат |
N |
N расч. |
|
Метод перебора |
X=1.22222; Y = -0.656042 |
10 |
||
Блочного равномерного поиска (n=2) |
X=0.43; Y = 3.77721 |
6 |
||
Блочного равномерного поиска (n=3) |
X=0.4357; Y = 3.77698 |
7 |
||
Деления интервала пополам |
X=0.4357; Y = 3.77698 |
7 |
||
Дихотомии |
X=0.43875; Y = 3.77696 |
6 |
||
Золотого сечения |
X=0.454915; Y = 3.77695 |
7 |
||
Фибоначчи |
X=0.3; Y = 3.80097 |
3 |
||
Касательных |
X=0.435484; Y = 3.78299 |
8 |
||
Парабол |
X=0.44712; Y = 3.77688 |
14 |
Графики
Основной
Для перебора
Размещено на Allbest.ru
...Подобные документы
Создание программы в среде программирования MatLab для решения задачи одномерной оптимизации (нахождение минимума и максимума заданных функций) методом золотого сечения, построение блок-схемы алгоритма и графическое изображение исследованных функций.
реферат [112,0 K], добавлен 14.06.2010Классификация задач нелинейного программирования. Сущность методов безусловной одномерной оптимизации. Построение алгоритма случайного поиска, правило исключения интервалов. Понятие золотого сечения и квадратичной аппроксимации, метод хорд и касательных.
презентация [377,0 K], добавлен 30.10.2013Эвристические и теоретические методы прямого поиска. Алгоритм поиска значения по симплексу и по образцу. Основная идея метода сопряженных направлений Пауэлла. Ознакомление с преимуществами и недостатками методов безусловной многопараметровой оптимизации.
презентация [862,9 K], добавлен 30.10.2013Одномерная оптимизация, метод "золотого сечения". Условная нелинейная оптимизация, применение теоремы Джона-Куна-Таккера. Исследование функции на выпуклость и овражность. Безусловная оптимизация неквадратичной функции, метод Дэвидона-Флетчера-Пауэлла.
курсовая работа [2,1 M], добавлен 12.01.2013Определение минимума функции на заданном отрезке методами перебора, поразрядного поиска, дихотомии, золотого сечения и методом парабол. Нахождение и расчет нулей функции методом Ньютона. Построение графика данной функции, ее минимальное значение.
реферат [55,6 K], добавлен 09.04.2013Описание методов дихотомии (половинного деления) и касательных. Их применение для решения нелинейных уравнений. Графическое отделение корней. Блок-схемы алгоритмов. Тексты (листинги) программ на языке Delphi. Тестовый пример решения задачи с помощью ЭВМ.
курсовая работа [944,6 K], добавлен 15.06.2013Программирование численных методов одномерной оптимизации. Решение одномерных задач оптимизации методами последовательного поиска. Градиентные методы и их применение для оптимизации на ЭВМ математических моделей объектов. Методы нулевого порядка.
контрольная работа [257,9 K], добавлен 15.01.2009Разработка программного обеспечения для решения нелинейного уравнения методом деления отрезка пополам, методом деления Гаусса. Алгоритм определения и методика уточнения корней. Составление и тестирование программы, ее листинг и оценка эффективности.
контрольная работа [638,0 K], добавлен 16.12.2013Решения алгебраических уравнений методом выделения корней. Аппроксимация функций методом наименьших квадратов; дихотомия, бисекция. Одномерная оптимизация многоэкстремальных функций; метод золотого сечения. Многомерная оптимизация градиентным методом.
курсовая работа [956,7 K], добавлен 04.03.2013Методы ветвей и границ первого и второго порядка. Оптимальный и пассивный поиск. Недостатки метода Ньютона. Метод золотого сечения. Примеры унимодальных функций. Динамическое и линейное программирование. Метод Жордана-Гаусса. Решение задачи коммивояжера.
курсовая работа [1,1 M], добавлен 20.07.2012Сравнение методов деления отрезка пополам, хорд, касательных и итераций, поочередно используя их для решения одного и того же уравнения. Построение диаграммы и графика изменения числа. Исследование алгоритма работы программы, перечня идентификаторов.
курсовая работа [1,3 M], добавлен 06.08.2013Изучение аналитических и численных методов поиска одномерного и многомерного безусловного экстремума. Решение поставленной задачи с помощью Mathcad и Excel. Реализация стандартных алгоритмов безусловной оптимизации средствами языка программирования С++.
курсовая работа [488,5 K], добавлен 21.10.2012Описание генетических алгоритмов. Применение генетического алгоритма для решения задачи коммивояжера. Постановка задачи безусловной оптимизации. Изучение распространения генетических алгоритмов на модель с несколькими взаимодействующими популяциями.
дипломная работа [979,1 K], добавлен 30.05.2015Суть основных идей и методов, особенностей и областей применения программирования для численных методов и решения нелинейных уравнений. Методы итераций, дихотомии и хорд и их использование. Алгоритм метода Ньютона, создание программы и ее тестирование.
курсовая работа [423,0 K], добавлен 17.02.2010Сравнение методов многомерной оптимизации Хука-Дживса и Розенброка по числу вычислений и по числу вызова оптимизируемой функции в процессе оптимизации. Особенности применения алгоритмов ускоряющего шага, в которых используется поиск по направлению.
лабораторная работа [2,8 M], добавлен 14.07.2012Математическое описание, алгоритм и программа вычисления нелинейного уравнения методом дихотомии. Метод половинного деления. Метод поиска корней функции. Написание текста программы с комментариями. Проведение тестовых расчетов. Вывод ответа на экран.
курсовая работа [67,2 K], добавлен 15.02.2016Пример задачи нелинейной условной оптимизации. Основные группы методов: штрафных функций, прямого поиска, линеаризации. Последовательность задач безусловной оптимизации. Квадратичный и логарифмический штраф. Корректировка для обеспечения допустимости.
презентация [405,0 K], добавлен 30.10.2013Исследование систем методами случайного поиска. Изучение сущности метода половинного деления. Сравнительный анализ прямого перебора и половинного деления. Ручной счет. Шаги исследования. Описание окна работающей программы. Блок-схема и код программы.
курсовая работа [257,5 K], добавлен 06.05.2014Методика реализации решения нелинейного уравнения в виде процедуры-подпрограммы следующими методами: хорд, касательных (Ньютона), простой итерации, половинного деления. Основные методы уточнения корней уравнения. Программное решение задачи, алгоритм.
курсовая работа [4,0 M], добавлен 27.03.2011Метод половинного деления как один из методов решения нелинейных уравнений, его основа на последовательном сужении интервала, содержащего единственный корень уравнения. Алгоритм решения задачи. Описание программы, структура входных и выходных данных.
лабораторная работа [454,1 K], добавлен 09.11.2012