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

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

//LabRab7.cpp

#include "Matrix.h"

#define RAND_MAX 10

int num;

int fun;

double al[3]={0,0,0};

time_t t;

double f(vec l)

{ switch(fun)

{ case 1: return -12*l.x[1]+4*l.x[0]*l.x[0]+4*l.x[1]*l.x[1]-4*l.x[0]*l.x[1] ; break;

case 2: return (2*l.x[0]*l.x[0]+3*l.x[1]*l.x[1])*exp(l.x[0]*l.x[0]-l.x[1]*l.x[1]); break;

}

return 0;

}

vec grad(vec x)

{ vec q;

matrix E;

int i;

double h=0.000001;

for(i=0;i<num;i++)

E.M[i].x[i]=1;

for(i=0;i<num;i++)

q.x[i]=(f(x+E.M[i]*h)-f(x-E.M[i]*h))/(2*h);

return q;

}

double mod(vec x)

{ int i;

double m=0;

for(i=0;i<num;i++)

m+=pow(x.x[i],2);

return sqrt(m);

}

matrix mul(vec x,vec y)

{ matrix A(num);

for(int i=0;i<num;i++)

for(int j=0;j<5;j++)

A.M[i].x[j]=x.x[i]*y.x[j];

return A;

}

vec mulvec(vec x, vec y)

{ vec res(num);

for (int i=0; i<num; i++)

res.x[i]=x.x[i]*y.x[i];

return res;

}

double dif(vec x, vec p)

{ double h=0.001;

return((f(x+p*h)-f(x))/h);

}

void svenn4(vec x,vec p,double alpha)

{ vec x1;

if(dif(x,p)>0) alpha=-alpha;

x1=x;

al[1]=0;

al[2]=0;

al[0]=0;

do

{ al[0]+=alpha;

x1=x1+p*alpha;

alpha*=2;

}

while(dif(x,p)*dif(x1,p)>0);

al[2]=alpha/2;

al[0]-=alpha/2;

}

double gs1 (vec x, vec p, double e)

{ double x1,x2;

int kk=1;

al[1]=al[0]+al[2];

x1=al[0]+0.618*fabs(-al[0]+al[1]);

x2=al[0]+0.382*fabs(-al[0]+al[1]);

while(fabs(al[1]-al[0])>e)

{ if(f(x+p*x1)>f(x+p*x2))

{ al[1]=x1;

x1=x2;

x2=al[0]+0.382*fabs(al[1]-al[0]);

}

else

{ al[0]=x2;

x2=x1;

x1=al[0]+0.618*fabs(al[1]-al[0]);

}kk++;

}

return ((al[0]+al[1])/2);

}

vec minimum (vec x, double e){

vec xk(num);

xk=x;

int ran;

int j=0;//счетчик неудачных испытаний

int M = 3*num;

double b = 5;

double a = 0.1*mod(xk);

vec z(num);

vec p(num);

srand((unsigned) time(&t));

for(int i=0;i<num;i++){

ran= rand();

if (ran%2 == 1) ran=-ran;

p.x[i]= ran;

}

p=p/mod(p);

do{ z=xk+p*a;

if(f(xk)>f(z)){

xk=z;

}

else{

j++;

if(j>=M){

if (a>0.000001){

a=a/b;

j=1;

for(int i=0;i<num;i++){

ran= rand();

if (ran%2 == 1) ran=-ran;

p.x[i]= ran;

}

}else break;

}else{

for(int i=0;i<num;i++){

ran= rand();

if (ran%2 == 1) ran=-ran;

p.x[i]= ran;

}

p=p/mod(p);

}

}

}while(1);

xk=z;

return xk;

}

void Input()

{int i=0;

cout<<"Input number of function: ";

cin>>fun;

switch (fun)

{ case 1: num=2; break;

case 2: num=2; break;

}

vec X(num);

double x;

cout<<"Vvedite X0 :"<<endl;

while (i<num)

{ cin>>x;

X.x[i]=x;

i++;

}

double eps = 0.001;

X=minimum(X, eps);

cout<<"Minimumm: ";

i=0;

while (i<num)

{ cout<<X.x[i]<<" ";

i++;

}

}

main(){

system("cls");

char ch=0;

while (ch!=27){

cout<<"Lab rabota #5"<<endl;

cout<<"1) -12*x2+4*x1^2+4*x2^2-4*x1*x2"<<endl;

cout<<"2) (2*x1^2+3*x2^2)*exp(x1^2-x2^2)"<<endl;

Input();

cout<<"Press <esc> for exit.";

cout<<endl;

ch = getch();

system("cls");

}

return 0;

}

//Matrix.h

class vec

{

public:

int Vn;

double *x;

vec operator +(const vec &x);

vec operator -(const vec &x);

void operator =(const vec &x);

vec operator *(double a);

vec operator /(double a);

vec operator /(vec x);

double operator *(const vec &x);

vec(int i1 = 5);

~vec();

};

class matrix

{

public:

int Mn;

vec *M;

matrix(int i1 = 5);

~matrix();

vec operator *(const vec &x);

matrix operator *(double a);

matrix operator +(const matrix &A);

matrix operator -(const matrix &A);

matrix operator /(double a);

matrix Tr(void);

};

//Matrix.cpp

#include "Matrix.h"

#include <iostream.h>

vec vec::operator +(const vec &x)

{ vec y(Vn);

for(int i=0;i<Vn;i++)

y.x[i]=this->x[i]+x.x[i];

return y;

}

vec vec::operator -(const vec &x)

{ vec y(Vn);

for(int i=0;i<Vn;i++)

y.x[i]=this->x[i]-x.x[i];

return y;

}

void vec::operator =(const vec &x)

{ for(int i=0;i<Vn;i++)

this->x[i]=x.x[i];

}

vec vec::operator *(double a)

{ vec y(Vn);

for(int i=0;i<Vn;i++)

y.x[i]=this->x[i]*a;

return y;

}

vec vec::operator /(double a)

{ vec y(Vn);

for(int i=0;i<Vn;i++)

y.x[i]=this->x[i]/a;

return y;

}

vec vec::operator /(vec x)

{ vec y(Vn);

for (int i=0;i<Vn; i++)

y.x[i]=this->x[i]/x.x[i];

return y;

}

double vec::operator *(const vec &x)

{ double y=0;

for(int i=0;i<Vn;i++)

y+=this->x[i]*x.x[i];

return y;

}

vec::vec(int i1)

{ Vn = i1;

x = new double[Vn];

for(int i=0;i<Vn;i++)

x[i]=0;

}

vec::~vec()

{ x = 0;

delete [] x;

};

matrix::matrix(int i1)

{ Mn = i1;

M = new vec[Mn];

};

matrix::~matrix()

{ M = NULL;

delete [] M;

};

vec matrix::operator *(const vec &x)

{ vec y(Mn);

for(int i=0;i<Mn;i++)

y.x[i]=this->M[i]*x;

return y;

}

matrix matrix::operator *(double a)

{ matrix A(Mn);

for(int i=0;i<Mn;i++)

A.M[i]=this->M[i]*a;

return A;

}

matrix matrix::operator +(const matrix &A)

{ matrix B(Mn);

for(int i=0;i<Mn;i++)

B.M[i]=this->M[i]+A.M[i];

return B;

}

matrix matrix::operator -(const matrix &A)

{ matrix B(Mn);

for(int i=0;i<Mn;i++)

B.M[i]=this->M[i]-A.M[i];

return B;

}

matrix matrix::operator /(double a)

{ matrix A(Mn);

for(int i=0;i<Mn;i++)

A.M[i]=this->M[i]/a;

return A;

}

matrix matrix::Tr(void)

{ matrix B(Mn);

for(int i=0;i<Mn;i++)

for(int j=i;j<Mn;j++)

{

B.M[i].x[j]=this->M[j].x[i];

B.M[j].x[i]=this->M[i].x[j];

}

return B;

}

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