
Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Метод Дэвидсона / dsk-devidona
.cpp#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <iostream.h>
double P[2];
double X0[2];
double f(double X[2]) //Возвращает значение функции
{
return (1*pow(X[0],2)+3*pow(X[1],2)+2*X[0]*X[1]);
}
double df(double X[2]) //Возвращает производную исследуемой функции
{
double g1=2*X[0]+2*X[1];
double g2=6*X[1]+2*X[0];
return(g1*P[0]+g2*P[1]);
}
double Alpha(double x) //Alpha
{
double X2[2];
X2[0]=X0[0]+x*P[0];
X2[1]=X0[1]+x*P[1];
return (f(X2));
}
void DSK(void) //Method DSK
{
int k=0;
double e=0.01;
double xf, Y[2];
double tmp;
double e1=0.001;
double h=0.01;
double c, d;
double x1=fabs(2*(f(X0)-df(X0))/df(X0));
while(1)
{
double x2=x1+h;
if(Alpha(x2)>Alpha(x1)) h=-h;
x2=x1+h;
while (Alpha(x2)<Alpha(x1))
{
h=2*h;
x1=x2;
x2=x1+h;
}
double a=x1-h/2;
double b=x2;
if (b<a) {tmp=a; a=b; b=tmp;}
if (Alpha(x1)>Alpha((b+x1)/2)) {
a=x1;
c=b;
b=(b+x1)/2; }
else {
a=a;
c=(b+x1)/2;
b=x1;
}
if ((Alpha(a)>=Alpha(b)) && (Alpha(b)<=Alpha(c)))
d=b+0.5*((b-a)*(b-a)*(Alpha(b)-Alpha(a))-(b-c)*(b-c)*(Alpha(b)-
Alpha(c)))/((b-a)*(Alpha(b)-Alpha(a))-(b-c)*(Alpha(b)-Alpha(c)));
else
d=b+0.5*((b-a)*(Alpha(a)-Alpha(c)))/(Alpha(a)-2*Alpha(b)+Alpha(c));
if ((fabs((b-d)/b)<=e)&&(fabs((Alpha(b)-Alpha(d))/Alpha(b))<=e1))
{
xf=(b+d)/2; Y[0]=X0[0]+xf*P[0]; Y[1]=X0[1]+xf*P[1];
break;
}
h=h/2;
if (Alpha(b)<Alpha(d)) x1=b;
else x1=d;
k=k++;
}//while?
//vyvod rezyltata
cout<<"Method DSK"<<endl;
cout<<"\nx1= " << Y[0];
cout<<"\nx2= " << Y[1];
cout<<"\nk= " << k << " число итераций\n";
}//DSK proc
double david() //метод Давидона
{
int k=1;
double e=0.000000001, dfun, a, b, n, h, r, z, w, a0;
dfun=df(0);
cout<<"David--> ";
/*h=2*fabs(f(0)-5.998)/fabs(dfun);
if(h>1) h=1;*/
h=0.00001;
if(dfun>0)
{
p.x1=-p.x1;
p.x2=-p.x2;
dfun=df(0);
}
do
{
h=h+2*h;
}
while(dfun*df(h)<0);
a=h/3;
b=h;
/*a0=a;
b=b-a;
a=0;*/
do
{
z=df(a)+df(b)+3*(f(a)-f(b))/(b-a);
w=sqrt(z*z-df(a)*df(b));
r=(w-df(a)+z)/(2*w-df(a)+df(b));
r*=(b-a);
if(df(r)<=e) return r;
if(df(r)>0) b=r;
else a=r;
}
while(k<10);
return r;
}
int main(void) //Осн. процедура
{
P[0]=2; //Нач. направление.
P[1]=3; //Нач. направление.
X0[0]=1; Х0[1]=1;
clrscr();
DSK();
Cout<<David();
getch();
return 0;
}
Соседние файлы в папке Метод Дэвидсона