Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №41 / LABA4_7
.CPP#include <conio.h>
#include <math.h>
#include <iostream.h>
double Xo[2];
double p[2];
double e = 0.0000001;
double y(double);
double dy(double);
double Swenn4();
double Devidona();
void AntiGrad();
void ParKas();
double y(double a)
{
double res, x[2] = {Xo[0] + a*p[0], Xo[1] + a*p[1]};
res = 4*(x[0] - 5)*(x[0] - 5) + (x[1] - 6)*(x[1] - 6);
return(res);
}
double dy(double ax)
{
double res;
res = (y(ax+e) - y(ax))/e;
return(res);
}
double Swenn4()
{
double a = 0.1, A, x = 0;
static double B = 0, f = 0;
if (f)
{
A = B;
B = 0;
f = 0;
return(A);
}
if (dy(x) > 0)
{
a = -a;
}
do
{
a = 2*a;
x += a;
}
while(dy(0)*dy(x) > 0);
if (a < 0)
{
A = x;
B = x-a;
}
else
{
A = x-a;
B = x;
}
f = 1;
return (A);
}
double Devidona()
{
double r, Z, W, j, K = 1, A, B;
A = Swenn4();
B = Swenn4();
do
{
Z = dy(A) + dy(B) + 3*(y(A) - y(B))/(B-A);
W = sqrt(Z*Z - dy(A)*dy(B));
j = (W - dy(A) + Z)/(2*W - dy(A) + dy(B));
r = A + (B-A)*j;
if (dy(r) > 0)
B = r;
else
A = r;
K++;
}
while(fabs(dy(r)) > e);
return(r);
}
void AntiGrad()
{
p[0] = -8*(Xo[0] - 5);
p[1] = -2*(Xo[1] - 6);
}
void ParKas()
{
double K = 1, Min, X1[2] = {Xo[0], Xo[1]}, X2[2], NormaD;
AntiGrad();
Min = Devidona();
Xo[0] += Min*p[0];
Xo[1] += Min*p[1];
X2[0] = Xo[0];
X2[1] = Xo[1];
do
{
AntiGrad();
Min = Devidona();
Xo[0] += Min*p[0];
Xo[1] += Min*p[1];
p[0] = Xo[0] - X1[0];
p[1] = Xo[1] - X1[1];
Min = Devidona();
Xo[0] += Min*p[0];
Xo[1] += Min*p[1];
NormaD = sqrt(p[0]*p[0] + p[1]*p[1]);
if(NormaD < e)
{
cout << "K = " << K << endl;
return;
}
X1[0] = X2[0];
X1[1] = X2[1];
X2[0] = Xo[0];
X2[1] = Xo[1];
K++;
}
while(1);
}
void main ()
{
do
{
clrscr();
cout << "Xo[0] = ";
cin >> Xo[0];
cout << "Xo[1] = ";
cin >> Xo[1];
cout << endl;
ParKas();
cout << "Min = (" << Xo[0] << ", " << Xo[1] << ")" << endl << endl;
cout << "Esc - exit, Enter - continue";
}
while(getch() != 27);
}
Соседние файлы в папке Лабораторная работа №41