Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
АлексД
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 22
#1

Оптимизация функции двух переменных - C++

28.05.2013, 14:52. Просмотров 1315. Ответов 0
Метки нет (Все метки)

Доброго времени суток! Помогите пожалуйста решить задачу:
Дана функция -2*x*x+3*x*y-5*y*y+3*y, нужно её оптимизировать

Я вот вроде как методом градиента делаю, но программа зацикливается(читал - по всей видимости, у меня "овраг")
Как с этим бороться?
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include<iostream>
#define N 2// количество переменных
double x_k[N];//неизвестные
double x_k_1[N];//значение последвательного приближения
double lambda_k;//шаг
 
double y(double *x, int n)
{
return (-2*pow(x[0],2)+3*x[1]*x[0] - 5*x[1]*x[1]+3*x[1]); //функция
}
 
double dy_dx0(double *x, int n) // первая частная производная по Х
{
return (-4*x[0]+3*x[1]-3);
}
 
double dy_dx1(double *x, int n) // первая частная производная по Y
{
return (3*x[0]-10*x[1]+3);
}
 
double dy2_dx0(double *x, int n)// 2-я частная производная по X
{
return (-4);
}
 
double dy2_dx1(double *x, int n)// 2-я частная производная по Y
{
return (-10);
}
 
int main(void)
{ 
setlocale(LC_CTYPE, "Russian");
lambda_k = 0.001;//шаг
x_k[0] = 0;//начальное
x_k[1] = 5;//приближение
while(1)//будет длится до конца интервала
{
x_k_1[0] = x_k[0]- lambda_k*dy_dx0(x_k, N) ;//последвательное
x_k_1[1] = x_k[1]-lambda_k*dy_dx1(x_k, N);//приближение
if(fabs(dy_dx0(x_k_1, N))>lambda_k && fabs(dy_dx1(x_k_1, N))<lambda_k) break;//условие при котором меняются значения меняется начальное и конечное значение промежутка
x_k[0] = x_k_1[0];//присвоение начальному значению
x_k[1] = x_k_1[1];//значение приближения
}
x_k[0] = x_k_1[0];
x_k[1] = x_k_1[1];
printf("\tГрадиентный метод:\n");
printf("\tМинимум найден на x1 =%.3lf, x2 =%.3lf, Y(X1,X2) =%3.3f\n", x_k[0], x_k[1], y(x_k, N));//Вывод минимальных точек и значения функции в этой точке
getch();
return 0;
}


Добавлено через 17 часов 36 минут
Всё, уже разобрался: это не овраг. Кому интересно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include<iostream>
#define N 2// количество переменных
double x_k[N];//неизвестные
double x_k_1[N];//значение последвательного приближения
double lambda_k;//шаг
 
double y(double *x, int n)
{
return (-2*pow(x[0],2)+3*x[1]*x[0]-5*x[1]*x[1]+3*x[1]); //функция
}
 
double dy_dx0(double *x, int n) // первая частная производная по Х
{
return (-4*x[0]+3*x[1]);
}
 
double dy_dx1(double *x, int n) // первая частная производная по Y
{
return (3*x[0]-10*x[1]+3);
}
 
double dy2_dx0(double *x, int n)// 2-я частная производная по X
{
return (-4);
}
 
double dy2_dx1(double *x, int n)// 2-я частная производная по Y
{
return (-10);
}
 
int main(void)
{ 
setlocale(LC_CTYPE, "Russian");
lambda_k = 0.00001;//шаг
x_k[0] = 1;//начальное
x_k[1] = 1;//приближение
while(1)//будет длится до конца интервала
{
x_k_1[0] = x_k[0]+lambda_k*dy_dx0(x_k, N) ;//последвательное
x_k_1[1] = x_k[1]+lambda_k*dy_dx1(x_k, N);//приближение
if(fabs(dy_dx0(x_k_1, N))<lambda_k && fabs(dy_dx1(x_k_1, N))<lambda_k) break;//условие при котором меняются значения меняется начальное и конечное значение промежутка
x_k[0] = x_k_1[0];//присвоение начальному значению
x_k[1] = x_k_1[1];//значение приближения
}
x_k[0] = x_k_1[0];
x_k[1] = x_k_1[1];
printf("\tГрадиентный метод:\n");
printf("\tМинимум найден на x1 =%.3lf, x2 =%.3lf, Y(X1,X2) =%3.3f\n", x_k[0], x_k[1], y(x_k, N));//Вывод минимальных точек и значения функции в этой точке
getch();
return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2013, 14:52     Оптимизация функции двух переменных
Посмотрите здесь:

Найти минимум функции двух переменных - C++
Помогите пожалуйста решить пример из них 18 на фотке

Частные производные от функции двух переменных - C++
Нужно написать функцию, которая будет вычислять градиент. Для этого нужно брать частные производные. Как простую производную, я знаю,...

Поиск экстремума функции двух переменных - C++
нужна помощь, циклит программу в с++ с ошибкой -1.#end #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace...

Общий вид интерполированной функции двух переменных - C++
Добрый вечер, киберфорум. Не так давно меня озадачили следующей темой: Билинейная интерполяция функции двух переменных. Сама по себе...

Метод половинного деления для функции от двух переменных - C++
Это программа для функции от одной переменной, а можно этот же метод использовать для функции от двух переменных, например? #include...

Создать функции нахождения максимального значения из двух переменных - C++
#include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;cstdlib&gt; using namespace std; double H(double A, double B, double C) { int...

Найти экстремум функции двух переменных методом градиентного спуска - C++
Ругается на cout &lt;&lt; setw(4) &lt;&lt; setprecision(5) &lt;&lt; x; и clrscr(); Разные библиотеки пробовал но запустить не получилось... ошибка и всё, в...

Написать диалоговую программу вычисления значений функции двух переменных z=f(x.y) в различных точках плоскости. - C++
Написать диалоговую программу вычисления значений функции двух переменных z=f(x.y) в различных точках плоскости. Программа должна: 1)...

Оптимизация, сжатие переменных - C++
Есть у меня програмка, абстракный эмулятор псевдо эволюции так сказать. Есть в нем класс, который имеет много перемен типа double и int....

Вывести результат двух операций с использованием двух переменных - C++
Такие дела: надо ввести с клавиатуры 4 переменные, используя только 2 int, и посчитать результат двух выражений Есть такой вариант, но...

Оптимизация алгоритма перемножения двух матриц - C++
Здравствуйте, нужна помощь. Есть 2 матрицы, нужно их перемножить так, что бы алгоритм выполнялся со скорость O(n) и O(log(n))

Оптимизация функции - C++
Здравствуйте, каким образом(кроме switch) можно оптимизировать эту функцию(Нужен самый оптимизированный вариант): void blabla() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru