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

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

22.01.2019, 13:01. Показов 4485. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2019, 13:01
Ответы с готовыми решениями:

Одномерная оптимизация методом Ньютона и методом золотого сечения
Приветствую, задание следующее. Найти значение минимума функции f(x)=60*{x}^{4}-14*{x}^{3}+{x}^{2}-70*x в интервале методами Ньютона и...

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

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

1
Модератор
Эксперт по математике/физике
 Аватар для VSI
5277 / 4059 / 1389
Регистрация: 30.07.2012
Сообщений: 12,429
23.01.2019, 19:27
Andrey2020, загляните в самый низ этой страницы в раздел "Похожие темы". Можете найти для себя много полезной информации...
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.01.2019, 19:27
Помогаю со студенческими работами здесь

Поиск минимума (оптимизация)
Собственно скорее эта задача из вопроса об оптимизации. Есть список и в нем всегда железно _List.Count&gt;=2 List&lt;Int32&gt; _List; ...

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Результаты исследования от команды MCM (март 2025 г.)
Programma_Boinc 07.04.2025
Результаты исследования от команды MCM (март 2025 г. ) В рамках наших текущих исследований мы продолжаем изучать гены, которые имеют наибольшую вероятность развития рака легких, выявленные в рамках. . .
Рекурсивные типы в Python
py-thonny 07.04.2025
Рекурсивные типы - это типы данных, которые определяются через самих себя или в сочетании с другими типами, которые в свою очередь ссылаются на исходный тип. В мире программирования такие структуры. . .
C++26: Объединение и конкатенация последовательностей и диапазонов в std::ranges
NullReferenced 07.04.2025
Работа с последовательностями данных – одна из фундаментальных задач, с которой сталкивается каждый разработчик. C++ прошел длинный путь в эволюции средств для манипуляции коллекциями – от. . .
Обмен данными в микросервисной архитектуре
ArchitectMsa 06.04.2025
Когда разработчики начинают погружаться в мир микросервисов, они часто сталкиваются с парадоксальным правилом: "два сервиса не должны делить один источник данных". Эта мантра звучит повсюду в. . .
PostgreSQL в Kubernetes: Автоматизация обслуживания с CNPG
Mr. Docker 06.04.2025
Администраторы баз данных сталкиваются с целым рядом проблем при обслуживании PostgreSQL в Kubernetes: как обеспечить правильную репликацию данных, как настроить автоматическое переключение при. . .
Async/await в TypeScript
run.dev 06.04.2025
Асинхронное программирование — это подход к разработке программного обеспечения, при котором операции выполняются независимо друг от друга. В отличие от синхронного выполнения, где каждая последующая. . .
Многопоточность в C#: Синхронизация потоков
UnmanagedCoder 06.04.2025
Многопоточное программирование стало неотъемлемой частью разработки современных приложений на C#. С появлением многоядерных процессоров возможность выполнять несколько задач параллельно значительно. . .
TypeScript: Классы и конструкторы
run.dev 06.04.2025
TypeScript, как статически типизированный язык, построенный на основе JavaScript, привнес в веб-разработку новый уровень надежности и структурированности кода. Одним из важнейших элементов этой. . .
Многопоточное программирование: Rust против C++
golander 06.04.2025
C++ существует уже несколько десятилетий и его поддержка параллелизма постепенно наращивалась со временем. Начиная с C++11, язык получил стандартную библиотеку для работы с потоками, а в последующих. . .
std::vector в C++: от основ к оптимизации производительности
NullReferenced 05.04.2025
Для многих программистов знакомство с std::vector происходит на ранних этапах изучения языка, но между базовым пониманием и подлинным мастерством лежит огромная дистанция. Контейнер std::vector. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер