Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №41 / LAB_4
.cpp#include<math.h>
#include<conio.h>
#include<iostream.h>
#include<stdio.h>
double x,y,z,a,b;
double alphamin,px,py,pz;
int k;
double dfx(double x) //производная функции по х
{
return(2*x-2);
}
double dfy(double y) //производная функции по у
{
return(2*y-6);
}
double dfz(double z) //производная функции по z
{
return(8*z+40);
}
double func(double alpha) // функция от альфа
{
return (pow(x+alpha*px-1,2)+pow(y+alpha*py-3,2)+4*(pow(z+alpha*pz+5,2)));
}
void swann() //локализация минимума
{
double t=0,h=0.00001;
if(func(t)<func(t+h))
{
h=-h;
}
double x1,x2;
x1=0;
x2=x1+h;
while(func(x1)>func(x2))
{
h=2*h;
x1=x2;
x2=x1+h;
}
if((x1-1.5*h)<x1)
{
a=x1-1.5*h;
b=x1;
cout<<endl<<"SWENN: ( "<<a<<" "<<b<<" )"<<endl;
}
else
{
b=x1-1.5*h;
a=x1;
cout<<endl<<"SWENN: ( "<<a<<" "<<b<<" )"<<endl;
}
}
double ZS_1(double a,double b) //метод ЗС-1 для поиска альфа минимум
{
double nu,lj,e;
e=0.0000001;
nu=a+0.618*(b-a);
cout<<endl<<"nu="<<nu<<endl;
lj=a+0.382*(b-a);
cout<<endl<<"lj="<<lj<<endl;
while(fabs(b-a)>=e)
{
if(func(lj)<=func(nu))
{
b=nu;
nu=lj;
lj=a+0.382*(b-a);
cout<<endl<<func(lj)<<" "<<func(nu)<<endl;
cout<<endl<<"a="<<a<<" "<<"b="<<b<<endl;
cout<<"lj="<<lj<<" nu="<<nu<<endl;
}
else
{
a=lj;
lj=nu;
nu=a+0.618*(b-a);
cout<<endl<<"a="<<a<<" "<<"b="<<b<<endl;
cout<<"lj="<<lj<<" nu="<<nu<<endl;
}
}
cout<<endl<<"alphamin="<<(a+b)/2<<endl;
return (a+b)/2;
}
double Laba3() // лабораторная работа номер три
{
swann();
alphamin=ZS_1(a,b);
return (alphamin);
}
void Gaussa_SeidelR() //в этой ф-ии реализован метод Гаусса-Зейделя
{
double eps=0.000001;
int kolvo=0;
while(sqrt(dfx(x)*dfx(x)+dfy(y)*dfy(y)+dfz(z)*dfz(z))>eps) //проверка КОП
{
px=dfx(x); cout<<endl<<"px="<<px ; //вектор первого направления движения
py=0; //движение происходит по оси Х
pz=0;
alphamin=Laba3(); //вызов лаб. работы три
x=x+alphamin*px;
y=y+alphamin*py; //находим новые координаты в зависимости от найденнго альфа
z=z+alphamin*pz;
px=0; //вектор второго направления движения
py=dfy(y); //вдоль оси У
pz=0;
alphamin=Laba3(); //вызов лаб. работы три
x=x+alphamin*px;
y=y+alphamin*py; //находим новые координаты в зависимости от найденнго альфа
z=z+alphamin*pz;
px=0; //вектор третьего направления движения
py=0; //вдоль оси Z
pz=dfz(z);
alphamin=Laba3(); //вызов лаб. работы три
x=x+alphamin*px;
y=y+alphamin*py; //находим новые координаты в зависимости от найденнго альфа
z=z+alphamin*pz;
kolvo++;
}
cout<<"Kol-vo iteracii : <"<<kolvo<<">"<<endl;
cout<<"Minimum naiden : ( "<<x<<" ; "<<y<<" ; "<<z<<" )"<<endl;
}
void main()
{
char n;
cout<<"Welcome to the programm! Avtor:Malgin S.A."<<endl<<"________________________________________________________________________________"<<endl;
while(n!='n')
{
cout<<"Vvedite koordinati na4alnoi to4ki X0(X;Y;Z):"<<endl<<"X=";
cin>>x;
cout<<endl<<"Y=";
cin>>y;
cout<<endl<<"Z=";
cin>>z;
Gaussa_SeidelR();
cout<<endl<<"EWO?";
cin>>n;
cout<<endl<<endl<<endl;
}
}
Соседние файлы в папке Лабораторная работа №41