Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Методы Гаусса-Зейделя, Хука-Дживса и Коши / OVR_MET
.CPP#include <conio.h>
#include <math.h>
#include <iostream.h>
double e = 0.0000001;
double Xo[2] = {6, 6};
double p[2];
double y(double);
double dy(double);
double Swenn(int);
double Boltsano();
void AntiGrad();
double Norma(double, double);
void Method();
double y(double a)
{
double res, x[2] = {Xo[0] + a*p[0], Xo[1] + a*p[1]};
res = 8*x[0]*x[0] + 4*x[0]*x[1] + 5*x[1]*x[1];
return(res);
}
double dy(double x)
{
double res;
res = (y(x+e) - y(x))/e;
return(res);
}
double Swenn(int i)
{
double a = 0.1, A, x1 = 0, x2, B;
x2 = x1 + a;
if (y(x1) < y(x2))
{
p[0] = -p[0];
p[1] = -p[1];
}
while(y(x1) > y(x2))
{
a = 2*a;
x1 = x2;
x2 = x1 + a;
}
A = x1-a;
B = x2;
if (i == 1)
return(A);
else
return(B);
}
double Boltsano()
{
double x, K = 1, L, A, B;
A = Swenn(1);
B = Swenn(2);
x = (A + B)/2;
while((fabs(dy(x)) > e) || (L > e))
{
if (dy(x) < 0)
A = x;
else
B = x;
L = B - A;
x = (A + B)/2;
K++;
}
return(x);
}
void AntiGrad()
{
p[0] = -16*Xo[0] - 4*Xo[1];
p[1] = -4*Xo[0] - 10*Xo[1];
/*while ((fabs(p[0]) > 100) && (fabs(p[1]) > 100))
{
p[0] = p[0] / 100;
p[1] = p[1] / 100;
} */
}
double Norma(double x, double y)
{
double res;
res = sqrt(x*x + y*y);
return(res);
}
void Method()
{
double Min, X1[2], X2[2], normD, K=1;
AntiGrad();
do
{
Min = Boltsano();
X1[0] = Xo[0] + Min*p[0];
X1[1] = Xo[1] + Min*p[1];
Xo[0] += e;
Min = Boltsano();
X2[0] = Xo[0] + Min*p[0];
X2[1] = Xo[1] + Min*p[1];
p[0] = X1[0] - X2[0]; //uskor.shag
p[1] = X1[1] - X2[1];
Xo[0] = X1[0];
Xo[1] = X1[1];
Min = Boltsano();
Xo[0] = Xo[0] + Min*p[0];
Xo[1] = Xo[1] + Min*p[1];
normD = Norma(p[0], p[1]);
AntiGrad();
K++;
}
while((normD > e) || (Norma(p[0], p[1]) > e));
cout << "K = " << K << endl;
}
void main()
{
clrscr();
Method();
cout << "Min = (" << Xo[0] << " ," << Xo[1] << ")" << endl;
getch();
}
Соседние файлы в папке Методы Гаусса-Зейделя, Хука-Дживса и Коши