Ход работы
Так, например, если мы берем начальное значение , то получаем следующий результат программы(приложение 1):
На рис.1 и рис .2 изображена траектория поиска, построенные по полученным точкам в трехмерном пространстве в программе MATLAB (приложение 2)
Рис. 1
Рис. 2
Так же в MATLABе были построены линии уровня функции (рис.3)
f(x,y)=
Рис. 3
Вывод
В ходе данной работы была написана программа минимизации функции n переменных одним из методов нулевого порядка, а именно, методом Розенброка, с использованием метода квадратичной интерполяции (одномерная задача минимизации) и алгоритма Свенна (нахождение интервала унимодальности).
Приложение 1
#include <iostream>
#include <fstream>
#include <cmath>
#define _USE_MATH_DEFINES
#define n 2
using namespace std;
double function(double x[n]);
double ff1(double x[n],double zam,int k);
double ff2(double x[n],double h[n]);
double ff3(double x[n],double h[n]);
double ff4(double x[n],double h,int k);
double ff5(double x[n],double h);
double ff6(double x[n],double h);
double ff7(double v[n]);
double scal(double v1[n],double v2[n]);
int main ()
{
ofstream file ("file.txt");
double h=0.000001,amin,a0,e=0.000001;
double x[n];
double p[n][n];
double a[n],b[n],x1[n],x2[n],x3[n],xpar[n],f1,f2[n],f3[n],xmin[n];
int q[n];
bool u=false;
double alf[n];
for(int i=0;i<n;i++)
{
alf[i]=0;
q[i]=0;
for(int j=0;j<n;j++)
{
if(i==j)
{
p[i][j]=1;
}
else {p[i][j]=0;}
}
}
double W=0.05,A[n][n],B[n][n],alfunction[n];
cout<< "Enter the starting point: "<<endl;
for(int i=0;i<n;i++)
{
cout<<"Enter x["<<i<<"]"<<endl;
cin>>x[i];
file<<x[i]<<endl;
cout<<endl;
}
while(!(ff6(x,h)>function(x) && function(x)<ff5(x,h)))
{
for(int i=0;i<n;i++)
{
if(p[i][i]!=0)
{
a0=-W+e;
amin=a0;
while(a0<=W)
{
a0=a0+e;
if(ff4(x,amin*p[i][i],i)>ff4(x,a0*p[i][i],i))
{
amin=a0;
}
}
alf[i]=amin;
}}
for(int i=0;i<n;i++)
{
alfunction[i]=alf[i]*p[i][i];
}
if ((ff3(x,alfunction)<function(x)&&function(x)<ff2(x,alfunction)))
{
for(int i=0;i<n;i++)
{
alf[i]=alf[i]/2;
p[i][i]=-p[i][i];
}
}
for(int i=0;i<n;i++)
{
x[i]=x[i]+alf[i]*p[i][i];
file<<x[i]<<endl;
if(i==(n-1)){
cout<<"x["<<i<<"]= "<<x[i]<<endl<<endl;
}
else{
cout<<"x["<<i<<"]= "<<x[i]<<endl;
}
}
for(int i=0;i<n;i++)
{
for(int k=0;k<n;k++)
{
A[i][k]=0;
for(int l=0;l<n;l++)
{
for(int m=l;m<n;m++)
{
A[i][k]=A[i][k]+alf[m]*p[l][m];
}
}
}
}
for(int i=0;i<n;i++)
{
p[0][i]=A[0][i]/ff7(A[0]);
}
for(int i=1;i<n;i++)
{
for(int j=0;j<n;j++)
{
double s=0;
for(int k=0;k<i-1;k++)
{
for(int l=0;l<n;l++)
{
s=s+scal(A[i],p[k])/p[k][l];
}
}
B[i][j]=A[i][j]-s;
}
}
for(int i=1;i<n;i++)
{
for(int j=0;j<n;j++)
{
p[i][j]=B[i][j]/ff7(B[i]);
}
}
}
for(int i=0;i<n;i++)
{
a[i]=x[i]-0.01;
b[i]=x[i]+0.01;
x1[i]=(a[i]+b[i])/2;
}
e=0.00000000001;
while(u!=true){
for(int i=0;i<n;i++)
{
x2[i]=x1[i]+h;
}
for(int i=0;i<n;i++){
if(function(x1)>ff1(x1,x2[i],i))
{
x3[i]=x1[i]+2*h;
}
else{x3[i]=x1[i]-h;}
}
f1=function(x1);
for(int i=0;i<n;i++)
{
f2[i]=ff1(x1,x2[i],i);
f3[i]=ff1(x1,x3[i],i);
}
for(int i=0;i<n;i++)
{
if(f1<f2[i] && f1<f3[i])
{
xmin[i]=x1[i];
}
else
{
if(f2[i]<f3[i] && f2[i]<f1)
{
xmin[i]=x2[i];
}
else
{
xmin[i]=x3[i];
}
}
if(((x2[i]-x3[i])*f1+(x3[i]-x1[i])*f2[i]+(x1[i]-x2[i])*f3[i])==0)
{
x1[i]=xmin[i];
}
xpar[i]=0.5*((x2[i]*x2[i]-x3[i]*x3[i])*f1 + (x3[i]*x3[i]-x1[i]*x1[i])*f2[i] + (x1[i]*x1[i]-x2[i]*x2[i])*f3[i])/((x2[i]-x3[i])*f1+(x3[i]-x1[i])*f2[i]+(x1[i]-x2[i])*f3[i]);
if(fabs(function(xmin)-ff1(xmin,xpar[i],i))<e && fabs(xmin[i]-xpar[i])<e)
{
q[i]=1;
}
else
if(x1[i]<=xpar[i] && xpar[i]<=x3[i])
{
if(function(xmin)<ff1(xmin,xpar[i],i))
{
x1[i]=xmin[i];
}
else
{
x1[i]=xpar[i];
}
}
else
{
x1[i]=xpar[i];
}}
double qq=0;
for(int i=0;i<n;i++)
{
qq=qq+q[i]*q[i];
}
if(qq==n)
{
u=true;
}
}
for(int i=0;i<n;i++){
cout<<endl<<"x["<<i<<"]min= "<<xmin[i]<<endl;
}
cin.get();
cin.get();
cin.get();
return 0;
}
double function(double xx[n]) //сама функция
{
return (xx[1]-xx[0]*xx[0])*(xx[1]-xx[0]*xx[0])+10*(1-xx[0]*xx[0]*xx[0])*(1-xx[0]*xx[0]*xx[0]);
}
double ff1(double xx[n],double zamena,int k)
{
double xnew[n];
for(int i=0;i<n;i++)
{
xnew[i]=xx[i];
}
xnew[k]=zamena;
return function(xnew);
}
double ff2(double xx[n],double hh[n])
{
double xnew[n];
for(int i=0;i<n;i++)
{
xnew[i]=xx[i]+hh[i];
}
return function(xnew);
}
double ff3(double xx[n],double hh[n])
{
double xnew[n];
for(int i=0;i<n;i++)
{
xnew[i]=xx[i]-hh[i];
}
return function(xnew);
}
double ff4(double xx[n],double hh,int kk)
{
double xnew[n];
for(int i=0;i<n;i++)
{
xnew[i]=xx[i];
}
xnew[kk]=xx[kk]+hh;
return function(xnew);
}
double ff5(double xx[n],double hh)
{
double xnew[n];
for(int i=0;i<n;i++)
{
xnew[i]=xx[i]+hh;
}
return function(xnew);
}
double ff6(double xx[n],double hh)
{
double xnew[n];
for(int i=0;i<n;i++)
{
xnew[i]=xx[i]-hh;
}
return function(xnew);
}
double ff7(double vv[n])
{
double dl=0;
for(int i=0;i<n;i++)
{
dl=dl+pow(vv[i],2);
}
return (pow(dl,0.5));
}
double scal(double vv1[n],double vv2[n])
{
double sc=0;
for(int i=0;i<n;i++)
{
sc=sc+vv1[i]*vv2[i];
}
return sc;
}