Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
1 отчет.docx
Скачиваний:
10
Добавлен:
27.03.2015
Размер:
103.52 Кб
Скачать

Ход работы

Так, например, если мы берем начальное значение , то получаем следующий результат программы(приложение 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;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]