Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
8
Добавлен:
01.05.2014
Размер:
160.26 Кб
Скачать

1.5 Текст программы

#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.0000001; int kolvo=0;

while(sqrt(dfx(x)*dfx(x)+dfy(y)*dfy(y)+dfz(z)*dfz(z))>eps) //проверка КОП

{

px=dfx(x); //вектор первого направления движения

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()

{

cout<<"Welcome to the programm! Avtor:Malgin S.A."<<endl<<"________________________________________________________________________________"<<endl;

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();

}

Соседние файлы в папке Лабораторная работа №41