Очень нерационально производятся вычисления: по нескольку раз одно и то же считается. Компилятор может быть и соптимизирует, а может и нет. Лучше сразу сделать хорошо:
Код:
#include <iostream>
using namespace std;
double f(double x, double y)
{
return 3*x*x-6*x*y+4*y*y+12*x-18*y+21;
}
double gradX(double x, double y)
{
return 6*x-6*y+12;
}
double gradY(double x, double y)
{
return -6*x+8*y-18;
}
int main()
{
double L = 1.0;
double x = 4, y = -4;
double fv = f(x, y);
while(L > 0.005)
{
double gx = gradX(x, y);
double gy = gradY(x, y);
double nx = x - L*gx;
double ny = y - L*gy;
double nf = f(nx, ny);
if( nf <= (fv - 0.5*L*(gx*gx + gy*gy)) )
{
x = nx;
y = ny;
fv = nf;
}
else
{
L = L * 0.5;
}
}
cout << x << " " << y << endl;
return 0;
}
За одно и понятнее стало, что происходит.
Можно и дальше соптимизировать: переносить в следующую итерацию старое значение функции, чтобы не считать его лишний раз. Не удержался, сделал сам. Это особенно полезно, если сама функция вычисляется неявным образом с помощью численной процедуры.