Смекни!
smekni.com

Методы одномерной оптимизации (стр. 2 из 2)

{

double y;

y=x*x-12*x;

return (y);

}

Решение задачи

Функция f(x) = x2-12xнач. точка x0= 1 шаг 1

Номер итерации 1

Начальная точка 1

X1 = a = 1

F(x) = -11

Номер итерации 2

Начальная точка 1

Шаг 1

X2 = a= 2

F(x) = -20

Номер итерации 3

Начальная точка 2

Шаг 2

X3 = a = 4

F(x) = -32

Номер итерации 4

Начальная точка 4

Шаг 4

X4 = b = 8

F(x) = -32

Отрезок [a;b] =[2;8] Число итераций = 4

Сводная таблица результатов№1

f(x) = x2-12x
Начальнаяточка Шаг Отрезок Число итераций
1 1 [2;8] 4
1 10 [-9;11] 3
3 1 [4;11] 4
3 10 [-7;13] 3
0 1 [2;16] 5
0 10 [0;30] 3
10 1 [2;8] 4
10 10 [0;20] 3

Сводная таблица результатов№2

f(x) = 2x2+(16/x)
Начальнаяточка Шаг Отрезок Число итераций
1.6 1 [0.6;2.6] 3
1.6 2 [-0.4;3.6] 3
2 1 [1;3] 3
2 2 [0;2] 3
0.1 1 [-0.9;2.1] 3
0.1 2 [-1.9;4.1] 3
10 1 [-5;9] 4
10 2 [-4;8] 3

Сводная таблица результатов№3

f(x) = (127/4)x2-(61/4)x+2
Начальнаяточка Шаг Отрезок Число итераций
0 0.5 [-0.5;0.5] 2
0 1 [-1;1] 2
1 0.5 [-1;0.5] 3
1 1 [-1;1] 2
2 0.5 [-2;1] 4
2 1 [-2;1] 3
-10 0.5 [-6;6] 6
-10 1 [-6;6] 5
10 0.5 [-6;6] 6
10 1 [-6;6] 5

Задание2

Найти точки минимума внутри найденного отрезка локализации минимумаметодом золотого сечения.

(Программа должна обеспечить на каждой итерации метода вывод на экран:

- номера итерации,

- границ текущего отрезка [a, b],

- внутренних точек и значений функции в них,

а затем

- финальной оценки x* точки минимума функции f(x)

- соответствующего точке x* значения функции f(x*)).

Текст программы на С++

#include <iostream.h>

#include <iomanip.h>

#include <math.h>

#include <conio.h>

#include <stdlib.h>

doublefunction (double); // вычисляет значение функции в данной точке

void main (void)

{

double a, b, E, F1, F2, LM, x = 0, fc, fd, fx, i = 0, c = 0, d = 0; // Определениепеременных

clrscr();

cout << "Введите границы начального отрезка:" << endl << "a0 = ";

cin >> a;

cout << "b0 = ";

cin >> b;

cout << "Введите число Е:" << endl << "E = ";

cin >> E;

clrscr();

cout << "Границы начальнога отрезка:"<< endl <<"а[" << i << "] = " << a << endl;

cout << "b[" << i << "] = " << b << endl;

cout << "Число Е = " << E << endl;

F1 = (3 - sqrt(5))*0.5;

F2 = 1 - F1;

do

{

LM = b - a;

cout << endl << "Номер итерации " << i + 1 << endl;

cout << "Границы текущего отрезка:" << endl << "а[" << i << "] = " << a << endl;

cout << "b[" << i << "] = " << b << endl;

if (LM <= E)

{

x = (a + b)*0.5;

fx = function(x);

cout << "Точка минимума x = " << setprecision(10) << x << endl;

cout << "Значение функции F(x) в точке минимума = " << setprecision(10) << fx << endl;

cout << "Press any key";

getch();

exit(0);

}

else

{

c = a + F1 * LM;

d = a + F2 * LM;

fc = function(c);

fd = function(d);

cout << "Значение внутренней точки с[" << i << "] = " << setprecision(10) << c << endl;

cout << "Значение внутренней точки d[" << i << "] = " << setprecision(10) << d << endl;

cout << "Значение функции F(x) в точке с[" << i << "] = " << setprecision(10) << fc << endl;

cout << "Значение функции F(x) в точке d[" << i << "] = " << setprecision(10) << fd << endl;

}

if (fc == fd)

{

a = c;

b = d;

x = (a + b)*0.5;

fx = function(x);

cout << "Точка минимума x = " << setprecision(10) << x << endl;

cout << "Значение функции F(x) в точке минимума = " << setprecision(10) << fx << endl;

cout << "Press any key";

getch();

exit(0);

}

else

{

if (fc < fd)

{

a = a;

b = d;

i++;

}

else

{

a = c;

b = b;

i++;

}

}

}

while (1);

}

double function (double x)

{

double y;

y = x * x - 12 * x;

return (y);

}

Решение задачи

Функция f(x) = x2-12x

Границы начального отрезка:

а[0] = -9

b[0] = 11

Число Е = 0.1

Номер итерации 1

Границы текущего отрезка:

а[0] = -9

b[0] = 11

Значение внутренней точки с[0] = -1.36

Значение внутренней точки d[0] = 3.36

Значение функции F(x) в точке с[0] = 18.17

Значение функции F(x) в точке d[0] = -29.03

Номер итерации 2

Границы текущего отрезка:

а[1] = -1.36

b[1] = 11

Значение внутренней точки с[1] = 3.36

Значение внутренней точки d[1] = 6.27

Значение функции F(x) в точке с[1] = -29.03

Значение функции F(x) в точке d[1] = -35.92

Номер итерации 3

Границы текущего отрезка:

а[2] = 3.36

b[2] = 11

Значение внутренней точки с[2] = 6.27

Значение внутренней точки d[2] = 8.08

Значение функции F(x) в точке с[2] = -35.92

Значение функции F(x) в точке d[2] = -31.66

Номер итерации 4

Границы текущего отрезка:

а[3] = 3.36

b[3] = 8.08

Значение внутренней точки с[3] = 5.16

Значение внутренней точки d[3] = 6.27

Значение функции F(x) в точке с[3] = -35.3

Значение функции F(x) в точке d[3] = -35.92

Номер итерации 5

Границы текущего отрезка:

а[4] = 5.16

b[4] = 8.08

Значение внутренней точки с[4] = 6.27

Значение внутренней точки d[4] = 6.96

Значение функции F(x) в точке с[4] = -35.92

Значение функции F(x) в точке d[4] = -35.06

Номер итерации 6

Границы текущего отрезка:

а[5] = 5.16

b[5] = 6.96

Значение внутренней точки с[5] = 5.85

Значение внутренней точки d[5] = 6.27

Значение функции F(x) в точке с[5] = -35.97

Значение функции F(x) в точке d[5] = -35.92

Номер итерации 7

Границы текущего отрезка:

а[6] = 5.16

b[6] = 6.27

Значение внутренней точки с[6] = 5.58

Значение внутренней точки d[6] = 5.85

Значение функции F(x) в точке с[6] = -35.83

Значение функции F(x) в точке d[6] = -35.97

Номер итерации 8

Границы текущего отрезка:

а[7] = 5.58

b[7] = 6.27

Значение внутренней точки с[7] = 5.85

Значение внутренней точки d[7] = 6.01

Значение функции F(x) в точке с[7] = -35.97

Значение функции F(x) в точке d[7] = -35.99

Номер итерации 9

Границы текущего отрезка:

а[8] = 5.85

b[8] = 6.27

Значение внутренней точки с[8] = 6.01

Значение внутренней точки d[8] = 6.11

Значение функции F(x) в точке с[8] = -35.999

Значение функции F(x) в точке d[8] = -35.986

Номер итерации 10

Границы текущего отрезка:

а[9] = 5.85

b[9] = 6.11

Значение внутренней точки с[9] = 5.95

Значение внутренней точки d[9] = 6.01

Значение функции F(x) в точке с[9] = -35.997

Значение функции F(x) в точке d[9] = -35.999

Номер итерации 11

Границы текущего отрезка:

а[10] = 5.95

b[10] = 6.11

Значение внутренней точки с[10] = 6.01

Значение внутренней точки d[10] = 6.05

Значение функции F(x) в точке с[10] = -35.999

Значение функции F(x) в точке d[10] = -35.997

Номер итерации 12

Границы текущего отрезка:

а[11] = 5.95

b[11] = 6.05

Значение внутренней точки с[11] = 5.99

Значение внутренней точки d[11] = 6.01

Значение функции F(x) в точке с[11] = -35.999

Значение функции F(x) в точке d[11] = -35.999

Номер итерации 13

Границы текущего отрезка:

а[12] = 5.95

b[12] = 6.01

Точка минимума x = 5.981

Значение функции F(x) в точке минимума = -35.999999

f(x) = x2-12x
отрезки Точка минимума Значение функции Число итераций
0.1 [2;8] 6.003 -35.999999 10
[-9;11] 5.981 -35.999999 13
[4;11] 5.996 -35.999999 10
[-7;13] 6.018 -35.999966 13
[2;16] 6.006 -35.999957 12
[0;30] 6.002 -35.999997 13
[2;8] 6.003 -35.999999 10
[0;20] 6.005 -35.999965 13
f(x) = 2x2+(16/x)
отрезки Точка минимума Значение функции Число итераций
0.01 [0.6;2.6] 1.5875 15.119055 13
[-0.4;3.6] 1.5820 15.119055 15
[1;3] 1.5861 15.119055 14
[0;2] 1.5874 15.119052 13
[-0.9;2.1] 1.5880 15.119050 13
[-1.9;4.1] 1.5864 15.119057 15
[-5;9] 1.5862 15.119061 17
[-4;8] 1.5866 15.119055 16
f(x) = (127/4)x2 - (61/4)x+2
Отрезки Точка минимума Значение функции Число итераций
0.001 [-0.5;0.5] 0.2418 0.18548 16
[-1;1] 0.2418 0.18548 17
[-1;0.5] 0.2420 0.18548 17
[-1;1] 0.2418 0.18548 17
[-2;1] 0.2420 0.18548 18
[-2;1] 0.2420 0.18548 18
[-6;6] 0.2418 0.18548 21
[-6;6] 0.2418 0.18548 21
[-6;6] 0.2418 0.18548 21
[-6;6] 0.2418 0.18548 21