Текст программы
//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;
}