Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <stdio.h>
double proizv(double);
double f(double);
void svenn(double*);
int DSK(double*);
double fdsk(double, double*);
double P[2]={44,-241};
double Q=0.00005;
void main(void)
{
double X[2]={0,3};
clrscr();
svenn(X);
printf("\nA:[%.4f,%.4f]",X[0]+Q*P[0],X[1]+Q*P[1]);
printf("\nB:[%.4f,%.4f]",X[0]+Q*P[0]/2,X[1]+Q*P[1]/2);
printf("\n\nMetod DSK:[%.4f,%.4f]",X[0]+Q*P[0],X[1]+Q*P[1]);
DSK(X);
}
///////////////////////////////////////////////////////////////////
double f(double q)
{
double X[2]={0,3},Z[2];
Z[0]=X[0]+q*P[0];
Z[1]=X[1]+q*P[1];
return((Z[0]-2)*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)+(Z[0]-2*Z[1])*(Z[0]-2*Z[1]));
}
///////////////////////////////////////////////////////////////////
void svenn(double *X)
{
double Z[2];
if(proizv(0)>0)
{
P[0]=-P[0];
P[1]=-P[1];
}
int k=0;
do
{
k++;
Q=2*Q;
Z[0]=X[0]+Q*P[0];
Z[1]=X[1]+Q*P[1];
}
while((proizv(0)*proizv(Q))>0);
printf("Metod Swenna:\nk=%d",k);
}
/////////////////////////////////////////////////////////
double proizv(double q)
{
double a,b;
double X[2]={0,3},Z[2];
Z[0]=X[0]+q*P[0];
Z[1]=X[1]+q*P[1];
a=4*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)+2*(Z[0]-2*Z[1]);
b=-4*(Z[0]-2*Z[1]);
return(a*P[0]+b*P[1]);
}
///////////////////////////////////////////////////////////////////
int DSK(double *X)
{
double H,a,b,c,d,e=0.001,Z[2];
int k=1;
if( proizv(0) >0) {P[0]=-P[0];P[1]=-P[1];}
Q=H=0.00005;
for(;;)
{
k++;
while(fdsk(H,X)>fdsk(2*H,X)) { H=2*H; }
d=3*H/2;
if(fdsk(d,X)>fdsk(H,X))
{
a=H/2; b=H; c=2*H;
}
else
{
a=H; b=d; c=2*H;
}
d=b+0.5*( (b-a)*(b-a)*(fdsk(b,X)-fdsk(c,X))-(b-c)*(b-c)*(fdsk(b,X)-fdsk(a,X)) )/( (b-a)*(fdsk(b,X)-fdsk(c,X))-(b-c)*(fdsk(b,X)-fdsk(a,X)) );
if( fabs((d-b)/b)<=e || fabs((fdsk(d,X)-fdsk(b,X))/fdsk(b,X))<=e ) {Q=(b+d)/2;printf("\nk=%d",k); return(1);}
Q=H=Q/2;
if(fdsk(b,X)>fdsk(d,X)) {X[0]=X[0]+d*P[0];X[1]=X[1]+d*P[1];}
else {X[0]=X[0]+b*P[0];X[1]=X[1]+b*P[1];}
}
}
//////////////////////////////////////////////////////////
double fdsk(double q, double *X)
{
double Z[2];
Z[0]=X[0]+q*P[0];
Z[1]=X[1]+q*P[1];
return((Z[0]-2)*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)*(Z[0]-2)+(Z[0]-2*Z[1])*(Z[0]-2*Z[1]));
}
Соседние файлы в папке all