Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Andrey2020
0 / 0 / 0
Регистрация: 13.01.2019
Сообщений: 8
1

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода

22.01.2019, 13:01. Просмотров 804. Ответов 1

MATLAB только начал осваивать.

Попытался реализовать нахождение точки минимума методом Ньютона
для функции 2*X12 - X1*X2 + 3*X22 - X1 + 2*X2 (суть метода прикрепил).

Код получился громоздким и, наверняка, можно сделать как-то проще.
Буду рад любым замечаниям, комментариям и советам.
Посмотрите, пожалуйста:

Matlab M
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
%Метод Ньютона
clear; clc; clf;
format;
 
[X1, X2] = meshgrid(-2.5 : .1: 2.5, -2.5 : .1 : 2.5); % Сетка для линий уровня
 
% Исходные данные
f = '(2*X1^2-X1*X2+3*X2^2-X1+2*X2)'; % задаём функцию
FX = 2*X1.^2 - X1.*X2 + 3*X2.^2 - X1 + 2*X2; % функция для линий уровня
XK = [2, 1]; % Задаём X0
 
% Находим производные
dfX1 = char(diff(str2sym(f), ('X1'))); % частная производная по X1
dfX2 = char(diff(str2sym(f), ('X2'))); % частная производная по X2
d2fX1 = char(diff(str2sym(f), ('X1'), 2)); % вторая производная по X1
d2fX1X2 = char(diff(str2sym(dfX1), ('X2'))); % вторая производная по X1,X2
d2fX2 = char(diff(str2sym(f), ('X2'), 2)); % вторая производная по X2
F = inline(f); % преобразование
FX1 = inline(dfX1);
FX2 = inline(dfX2);
F2X1 = inline(d2fX1);
F2X12 = inline(d2fX1X2);
F2X2 = inline(d2fX2);
 
% Подготавливаем данные для запуска цикла приближений
x1 = {0, XK(1)}; % Формируем массив X1 координат, заносим Х0
x2 = {0, XK(2)}; % Формируем массив X2 координат, заносим Х0
ZK = F((XK(1)),(XK(2))); %Находим значение функции с текущим XK
ZK1 = ZK + 1; % Искусственно завышаем начальное значение функции для запуска цикла
E = 0.001; % задаем точность
N = 0; % Инициализация счетчика
HX = [F2X1(0) F2X12(0); F2X12(0) F2X2(0)]; % матрица Гессе (Нули, т.к. нет переменных)
IH = inv(HX); % Обратная матрица
 
% Запускаем цикл приближений
while abs(ZK1 - ZK) > E
    gradfXK = [FX1(XK(1),XK(2)); FX2(XK(1),XK(2))]; % формируем градиент
    ZK = F((XK(1)),(XK(2))); %Находим значение функции с текущим XK
    XK1 = XK; % Заносим предыдущее значение Х (Х0 на первой итерации)
    XK = XK1 - IH*gradfXK; % Находим X*
    ZK1 = F((XK(1)),(XK(2))); % Находим значение функции с найденной точкой
    if ZK1 < ZK, XK1 = XK; end % Проверяем, меньше ли значение функции
    if ZK1 ~= ZK, N = N + 1; end % Если приближение свершилось, увеличиваем счетчик
    if ZK1 == ZK continue;end % Если нет, то координаты точки в массив не добавляем
    x1(end+1,:) = {N, XK(1)}; % добавляем в массив координаты
    x2(end+1,:) = {N, XK(2)}; % найденной на данной итерации точки
end
 
% Вывод результатов
A = ['X* ='];
disp(A);
K = [XK(1); XK(2)];
disp(K)
M = ['Значение найдено на ',num2str(N),'-ой итерации.'];
disp(M)
 
% Линии уровня
x1 = cell2mat(x1(:,2)); % Извдекаем координаты
x2 = cell2mat(x2(:,2)); % точек из массивов
[CMatr, h] = contour(X1,X2,FX, 10);
clabel(CMatr, h);
grid on;
hold on;
plot(x1,x2,'r-o');
 
% Подписываем точки
X = 'X%d';
for i=1:length(x1) % цикл от 1 до конца вектора координат
    n = i-1; % Начинаем с X0
    Name = sprintf(X,n); 
    text(x1(i)+0.05,x2(i)+0.05,Name,'Color','red'); % надпись точки
end % конец цикла for
0
Миниатюры
Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.01.2019, 13:01
Ответы с готовыми решениями:

Одномерная оптимизация методом Ньютона и методом золотого сечения
Приветствую, задание следующее. Найти значение минимума функции...

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был...

Нахождение простых чисел (оптимизация кода)
Здравствуйте! Не могли бы посмотреть программку. Она рабочая. Мне интересен взгляд профессионалов ,...

Поиск минимума (оптимизация)
Собственно скорее эта задача из вопроса об оптимизации. Есть список и в нем всегда железно...

1
VSI
Модератор
Эксперт по математике/физике
4322 / 3341 / 1099
Регистрация: 30.07.2012
Сообщений: 9,480
23.01.2019, 19:27 2
Andrey2020, загляните в самый низ этой страницы в раздел "Похожие темы". Можете найти для себя много полезной информации...
1
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2019, 19:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Нахождение минимума функции. Метод Ньютона
Помогите пожалуйста решить задачу, о Умные Люди!!! Задача: f(x;y)=e^(y+x)-x^2+y Методом Ньютона (с...

Поиск минимума функции методом Ньютона
Здравствуйте! Не могу разобраться с программой. В методе Коши минимум данной функции получился -125.

Условная оптимизация методом штрафных и методом барьерных функций
Дано задание: минимизировать при заданных ограничениях f(x) с точностью E методом штрафных и...

Оптимизация кода. Замер времени выполнения части кода.
Доброе утро. Есть желание посмотреть сколько времени занимает выполнение какого-то блока...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

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