С Новым годом! Форум программистов, компьютерный форум, киберфорум
Matlab
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
0 / 0 / 0
Регистрация: 13.01.2019
Сообщений: 8
1

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

22.01.2019, 13:01. Показов 4362. Ответов 1

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2019, 13:01
Ответы с готовыми решениями:

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

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

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

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

1
Модератор
Эксперт по математике/физике
5277 / 4059 / 1389
Регистрация: 30.07.2012
Сообщений: 12,429
23.01.2019, 19:27 2
Andrey2020, загляните в самый низ этой страницы в раздел "Похожие темы". Можете найти для себя много полезной информации...
1
23.01.2019, 19:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2019, 19:27
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru