Срочно нужна помощь в проверке программы (до среды нужно сдать), хотел убедиться правильно работает или есть недочеты.
Программу нужно было написать на Pascal. Код я прикрепил. Теорию можете не читать, если знаете о чем суть. Я ее написал, что бы можно было посмотреть (суть алгоритмов изложил).
Задание:
Методом циклического покоординатного спуска с точностью

найти решение задачи минимизации. Для решения задачи одномерной минимизации использовать метод дихотомического поиска (с точностью

).

;
Алгоритм дихотомического поиска минимума функции одной переменной. Пусть f(x) - строго квазивыпуклая на
![\left[{a}_{1},{b}_{1} \right] \left[{a}_{1},{b}_{1} \right]](https://dxdy-01.korotkov.co.uk/f/8/4/7/847dda4c956a5e20dc2f3074283af7be82.png)
.
Требуется найти

- точку минимума,
![{x}^{*}\in \left[{a}_{1},{b}_{1} \right] {x}^{*}\in \left[{a}_{1},{b}_{1} \right]](https://dxdy-02.korotkov.co.uk/f/9/e/f/9ef896b5774b7d9aaf241c194775014a82.png)
.

,

(1),

.
Если

, то
![\left[{a}_{2},{b}_{2} \right]=\left[\lambda,{b}_{1} \right] \left[{a}_{2},{b}_{2} \right]=\left[\lambda,{b}_{1} \right]](https://dxdy-01.korotkov.co.uk/f/4/d/d/4ddbc43ffbd56f2f78cd81105243d55782.png)
Если

, то
![\left[{a}_{2},{b}_{2} \right]=\left[{a}_{1},\mu \right] \left[{a}_{2},{b}_{2} \right]=\left[{a}_{1},\mu \right]](https://dxdy-03.korotkov.co.uk/f/e/6/3/e63094826e5efe785ba5a796b336161d82.png)
.
На новом интервале неопределенности
![\left[{a}_{2},{b}_{2} \right] \left[{a}_{2},{b}_{2} \right]](https://dxdy-03.korotkov.co.uk/f/2/c/9/2c9efb0064cecbfdfa63226ba191019c82.png)
, выберем

и

по формуле (1).
Повторяя алгоритм, мы получаем:
![\left[{a}_{1},{b}_{1} \right]\supset \left[{a}_{2},{b}_{2} \right]\supset \left[{a}_{3},{b}_{3} \right]\supset ...\supset \left[{a}_{k},{b}_{k} \right]... \left[{a}_{1},{b}_{1} \right]\supset \left[{a}_{2},{b}_{2} \right]\supset \left[{a}_{3},{b}_{3} \right]\supset ...\supset \left[{a}_{k},{b}_{k} \right]...](https://dxdy-02.korotkov.co.uk/f/5/e/9/5e9b47c5667adc50e9b7d26232130c7582.png)
Каждый из этих интервалов будет содержать точку

.
И точка

является общим пределом при

для левых и правых концов промежутка, то есть:

.
Алгоритм останавливается, когда расстояние между

и

меньше заданного

.
Алгоритм
Начальный этап
Задаем интервал неопределенности [a,b] и задаем длину конечного интервала неопределенности

. Задаем константу

. Задаем счетчик итераций k=1.
Суть алгоритма описал выше, а это были уточнения.
Алгоритм цикличного покоординатного спуска.Для любой

,

(2),

любые,

- выбираются равными единичным ортам.

;

;
.........

;

;

.
Числовые параметры

выбираются с помощью решения задачи одномерной минимизации, то есть

выбирается так, что

(4).
Алгоритм (2)-(4) называется методом циклического покоординатного спуска.
Этот метод сходится к стационарной точке в случае дифференцируемости функции. Если функция не дифференцируема, то этот метод может остановиться в любой не стационарной точке.
Подготовительный этап алгоритма:
Выбирается для любой

, k=0. Выбираем

для критериев остановки. Полагаем

,

, j - счетчик единичных орт.
Шаг 1
Найти

из решения задачи одномерной минимизации

- единичный орт.

. Положить

.
Если

, то заменить

и вернуться на шаг 1.
Если

, то перейти на шаг 2.
Шаг 2
Положить

. Если

и

, то остановиться и

.
В противном случае, положить

, j=1, k=k+1 и вернуться на шаг 1.
Код моей программы:
Код:
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
Вопросы:
1) Дихотомический поиск я правильно сделал, нужно проверить циклический покоординатный спуск. Так ли он реализовывается, как я в программе написал?
2) Нет ли в коде ошибок?
3)Нормальный получился результат?