Градієнтні методи
Контрольная работа - Математика и статистика
Другие контрольные работы по предмету Математика и статистика
min,xmin1,xmin2,e2,dalph;
double x [3000] [2]; double y [10];
clrscr ();
x [0] [1] =-1;
x [0] [2] =0;
e2=0.0001;
double z1,z2,y1,y2,e,p,alpmin,g1,g2;
int m;
cout<<"Metod naiskor. spuska"<<endl;
k=0; N0=0; N1=0;
z1=df1 (x [0] [1],x [0] [2]);
z2=df2 (x [0] [1],x [0] [2]);
N1=N1+2;
dalph=2.2;
mm1:
m = 0;
y1=f (x [k] [1],x [k] [2]); N0++;
metka:
y2=f (x [k] [1] - (m+1) *dalph*z1,x [k] [2] - (m+1) *dalph*z2);
N0++;
if (y2<y1)
{m++; y1=y2; goto metka; }
else
{b= (m+1) *dalph;
if (m==0)
{a=0; }
else {a= (m-1) *dalph; }
}
alpmin=zsech (a,b,x [k] [1],x [k] [2],z1,z2);
cout<<"\nk="<<k+1<<endl;
x [k+1] [1] =x [k] [1] - alpmin*z1; cout<<"\nx [1] [1] ="<<x [k+1] [1];
x [k+1] [2] =x [k] [2] - alpmin*z2; cout<<"\nx [1] [2] ="<<x [k+1] [2] <<endl; // getch ();
z1=df1 (x [k+1] [1],x [k+1] [2]);
z2=df2 (x [k+1] [1],x [k+1] [2]);
N1=N1+2;
d=pow (z1*z1+z2*z2,0.5);
if (d>e2)
{k++; goto mm1; }
else {xmin1=x [k+1] [1];
xmin2=x [k+1] [2];
ymin=f (xmin1,xmin2);
cout<<"x1="<<xmin1<<" x2="<<xmin2<<" ymin="<<ymin<<endl<<"N1="<<N1;
cout<<" N0="<<N0<<" k="<<k+1<<endl;
}
// return 0;
getch ();
}
Метод 2
include "iostream"
#include
#include
#include
#include "iomanip"
#include
using namespace std;
int N0=0, N1=0;
double a=3, b=-1.2, c=0.02, d=1.3;
double f (double x1, double x2)
{
double f;
N0++;
f=3*x1-1.2*x2+exp (0.02*x1*x1+1.3*x2*x2);
return (f);
}
double fdx1 (double x1,double x2)
{double fx1;
N1++;
fx1=3+0.04*x1*exp (0.02*x1*x1+1.3*x2*x2);
return (fx1); }
double fdx2 (double x1,double x2)
{ double fx2;
N1++;
fx2=-1.2+2.6*x2*exp (0.02*x1*x1+1.3*x2*x2);
return (fx2); }
void evrist ()
{ double x1 [100],x2 [100],A1,A2,E2,del1,del2,f1,f2,h [4],g [4],b [4],r [4];
double d,N;
int k;
x1 [0] =-1;
x2 [0] =0;
E2=0.0001;
del1=0.01;
del2=3;
A1=0.5;
A2=2;
k=0;
label1:
do{
h [1] =fdx1 (x1 [k],x2 [k]);
if (fabs (h [1]) >del1) {g [1] =h [1]; }
else {g [1] =0; }
h [2] =fdx2 (x1 [k],x2 [k]);
if (fabs (h [2]) >del1) {g [2] =h [2]; }
else {g [2] =0; }
x1 [k+1] =x1 [k] - A1*g [1];
x2 [k+1] =x2 [k] - A1*g [2];
// cout<<":: "<<x1 [k] <<":: "<<x2 [k] <<endl;
f1=f (x1 [k+1],x2 [k+1]);
f2=f (x1 [k],x2 [k]);
k++;
}
while (f1<f2);
k--;
do{
r [1] =fdx1 (x1 [k],x2 [k]);
if (fabs (r [1]) >del2) {b [1] =0; }
else {b [1] =r [1]; }
r [2] =fdx2 (x1 [k],x2 [k]);
if (fabs (r [2]) >del2) {b [2] =0; }
else {b [2] =r [2]; }
x1 [k+1] =x1 [k] - A2*b [1];
x2 [k+1] =x2 [k] - A2*b [2];
cout<<x1 [k+1] <<":: "<<x2 [k+1] <<endl;
f1=f (x1 [k+1],x2 [k+1]);
f2=f (x1 [k],x2 [k]);
k++;
}while (f1<f2);
k--;
d=pow (r [1],2) +pow (r [2],2);
if (sqrt (d) >E2) {A1=A1/2.0; A2=A2/2.0; goto label1; }
else {cout<<"X1="<<x1 [k] <<" X2="<<x2 [k] <<" F (x) ="<<f (x1 [k],x2 [k]) <<endl;
N=N1+N0;
cout<<"Кол-во экспер.: "<<N<<" Кол-во итераций: "<<k<<":: "<<N0<<endl; }
N0=0; N1=0;
}
void main ()
{
evrist ();
getch ();
}
Скрин до методу 1