Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.01.2019, 18:17   #1
xdtab
Новичок
Джуниор
 
Регистрация: 14.01.2019
Сообщений: 1
По умолчанию Метод конфигураций (циклического покоординатного спуска)

Срочно нужна помощь в проверке программы (до среды нужно сдать), хотел убедиться правильно работает или есть недочеты.

Программу нужно было написать на Pascal. Код я прикрепил.
Задание:
Методом циклического покоординатного спуска с точностью eps1=0.01 найти решение задачи минимизации. Для решения задачи одномерной минимизации использовать метод дихотомического поиска (с точностью eps2=10^-5).

Теорию прикрепил во вложении (там суть обоих алгоритмов кратко записал).
Код программы:
Код:
const 
n = 2; // Так как R^2
eps=1E-2; // Точность
type 
vector = array[1..n] of real; 
 
function saxpy(a: real; x, y: vector): vector; // Создание векторов
begin 
for var i := 1 to n do 
result[i] := a * x[i] + y[i]; 
end; 
 
function f(x: vector): real; // Моя функция
begin 
result:=2*x[1]*x[1]+x[2]*x[2]-2*x[1]*x[2]-5*x[2]-x[1]; 
end; 
 
function norma(x:vector):real; // Нахождение нормы
begin 
for var i:=1 to n do 
result+=x[i]*x[i]; 
result:=sqrt(result); 
end; 
 
function DH(x, h: vector):real; // Метод дихотомического поиска
const 
eps = 1e-5; 
var 
r, r0, l0, a, b: real; 
begin 
 
a := -10; // Задаю левую границу
b := 10; // Задаю правую границу
 
while abs(b - a) > eps do 
begin 
 
r0 := (a + b) / 2 + eps / 10; // eps/10 - из условия алгоритма
l0 := (a + b) / 2 - eps / 10; 
 
if (f(saxpy(l0, h, x))) < (f(saxpy(r0, h, x))) then 
b := r0 
else 
a := l0; 
end; 
result := (a + b) / 2; 
end; 
 
// Главная часть программы
var k,i,j:integer; 
alfa,max_df:real; 
xn,xk,hk,xn_xk:vector; 
yj:vector; 
begin 
for i:=1 to n do 
xn[i]:=6; // Как я понял x можно любое задавать
repeat 
 
for i:=1 to n do 
xk[i]:=xn[i]; 
 
j:=1; 
 
for i:=1 to n do
 
hk[i]:=0; 
 
hk[j]:=-1; 
 
alfa:=DH(xk,hk); 
 
for i:=1 to n do 
xn[i]:=xk[i]+alfa*hk[i]; 
for i:=1 to n do 
xn_xk[i]:=xn[i]-xk[i]; 
 
k+=1; 
 
until (norma(xn_xk)<eps) and (abs(f(xn)-f(xk))<eps); 
write('Точка минимума = ('); 
for i := 1 to n-1 do 
write(xn[i]:5:5, ','); 
writeln(xn[n]:5:5, ')'); 
writeln('количество итераций равно = ',k); 
writeln('Значение функции в этой точке = ', f(xn)); 
end.
Результат работы программы:
Код:
Точка минимума = (3.25000,6.00000)
количество итераций равно = 2
Значение функции в этой точке = -15.1249999999991
Посмотрите пожалуйста. Я там мог элемент j не правильно реализовать. Еще мне не особо нравиться результат работы программы.
Вложения
Тип файла: rar Методы.rar (115.3 Кб, 9 просмотров)
xdtab вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа реализации метода покоординатного спуска naty7773 Помощь студентам 2 23.12.2012 19:00
Методы оптимизации: метод Ньютона и метод наискорейшего спуска ruslanGacurap Помощь студентам 0 30.01.2012 13:54
C++ Метод покоординатного спуска Hellgate Помощь студентам 0 12.11.2011 00:42
Метод покоординатного спуска новичочек C++ Builder 0 02.05.2011 15:44
алгоритм покоординатного спуска mimi_mimi Паскаль, Turbo Pascal, PascalABC.NET 0 20.06.2010 18:23