Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №52 / 5_2
.CPP#include <math.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
//class vector
//{
// public:
double tmp[2],X[2]={1,2} ,p[2]={1,1},D1[3]={1,1,1},D[3]={1,1,1},P[3]={1,1,1},C[2]={1,1};
//double X[2] = {8, 9},p[2] = {1, 0};
double e2 = 0.0000001, e = e2;
int w=25,nomF,k1=1,k0=0;;
char t;
double vect(double c,int i){
return(X[i] + c*p[i]);
}
void sum(double z[2],double s[2],double k[2]){
k[0]=z[0]+s[0];
k[1]=z[1]+s[1];
}
void copy(double z[2],double s[2]) {
z[0]=s[0];
z[1]=s[1];
}
double dlin(double y[2]){
return (sqrt(y[0]*y[0]+y[1]*y[1]));
}
void rmin(double c)
{C[0] = X[0] + c*p[0];
C[1] = X[1] + c*p[1];}
double y(double);
double dy(double);
double Swenn4(double);
double Bolstano(double, double, int);
double DSK(double); //Returns Minimum, found with Method DSK (Point to start serching)
double y(double a)
{
double x[2] = {vect(a,k0), vect(a,k1)};
// double d[3] = {D[0] + a*P[0], D[1] + a*P[1], D[2] + a*P[2]};
if (nomF==1) {return pow((x[1] -pow(x[0],2)),2) + 100*pow((1-pow(x[0],2)),2);}
if (nomF==2) {return 4*pow((x[0] -5),2) + pow((x[1] - 6),2);}
if (nomF==3) {return (x[1]-x[0]*x[0])*(x[1]-x[0]*x[0])+(1-x[0])*(1-x[0]);}
// if (nomF==4) {return (d[0]-1)*(d[0]-1)+(d[1]-3)*(d[1]-3)+4*(d[2]+5)*(d[2]+5);}
}
double dy(double ax)
{
return (y(ax+e) - y(ax))/e;
}
double Swenn4(double x)
{
int i=0; //Количество итераций
double a = e2, A;
static double B = 0, f = 0;//какой вход
if (f) //f=0 не первый вход
{
A = B;
B = 0;
f = 0;
return(A);
}
if (dy(x) > 0)
{
p[0] = -p[0];
p[1] = -p[1];
}
do
{
a = 2*a;
x += a;
i++;
}
while((dy(0)*dy(x) > 0)&&(i<w));
A = x-a;
B = x;
f = 1;
cout<<"iteracii: "<<i<<"\n";
return A;
}
double Bolstano(double A, double B)
{
double sq;
double x, L;
int i=0;
x = (A + B)/2;
while(((fabs(dy(x)) > e) && (fabs(L) > e))&&(i<w))
{
if (dy(x) < 0)
A = x;
else
B = x;
L = B - A;
x = (A + B)/2;
i++;
sq=fabs(dy(x));
}
cout<<"Bolcano iteracii: "<<i<<"\n";
return x;
}
double DSK(double X1)
{
double X2, a, b, c, d, h, Min;
int i=0;
h = 0.01*X1;
if (!h)
h = 0.1;
X2 = X1 + h;
if (y(X1) < y(X2)) //направление убывания
h = -h;
do
{
X2 = X1 + h;
while(y(X1) > y(X2)) //убывает
{
h = 2*h;
X1 = X2;
X2 = X1 + h;
}
if (y(X1) < y((X1+X2)/2))
{
b = X1;
c = (X1+X2)/2;
a = 2*b - c;
}
else
{
a = X1;
b = (X1+X2)/2;
c = 2*b - a;
}
d = b + (b-a)*(y(a)-y(c))/(y(a) - 2*y(b) + y(c))/2;
h = h/2;
if (y(b) < y(d))
X1 = b;
else
X1 = d;
i++;
if (i==w) {break;}
}
while((fabs((d - b)/b) > e) || (fabs((y(d) - y(b))/y(b)) > e2) );
Min = (b+d)/2;
cout<<"Dsk iteracii: "<<i<<"\n";
return Min;
}
void main1 (double C[2])
{
double a, b, c;
a = Swenn4(0);
b = Swenn4(0);
cout << "Swenn-4: interval[" << a << ", " << b << "]\n";
double A[2] = {vect(a,k0), vect(a,k1)}, B[2] = {vect(b,k0), vect(b,k1)};
cout << "[ {" << A[0] << "," << A[1] << "} : {" << B[0] << "," << B[1] << "} ]\n";
c = Bolstano(a, b);
C[0] = vect(c,k0);
C[1] = vect(c,k1);
cout << "Method Bolstano: Min = " << c << " - {" << C[0] << "," << C[1] << "}\n";
c = DSK(0);
C[0] = vect(c,k0);
C[1] = vect(c,k1);
cout << "Method DSK: Min = " << c << " - {" << C[0] << "," << C[1] << "}\n";
}
//---------------------------------------------------------
void main2(void){
// X[2]={1.5,2};
char n;
double x1=2.5,C[2],first[2]={1.5,2},dlinaD=e,dlinaF;
int i=0,k=0,d=2,l=0;
copy(C,tmp);
do {
dlinaF=dlinaD;
if (d==2) {
p[0]=1;
p[1]=0;
}
else {
p[0]=0;
p[1]=1;
d=1;
}
do {
main1(C);
copy(X,C);
cout<<C[0]<<"___"<<C[1]<<"\n";
if (t=='n') {n=getch();}
i++;
}
while (i<2);
l++;
i=0;
k++;
d++;
dlinaD=dlin(C);
x1=fabs(dlinaD-dlinaF);
}
while (x1>=e);
cout<<"\n\n\n Minimum najden za " <<l<<" iteracij";
copy(tmp,C);
}
//---------------------------------------------------------
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//---------------------------------------------------------
void main(void){
char n,k,all;
double a=1, b=2, c=3;
double A[2] = {vect(a,k0), vect(a,k1)}, B[2] = {vect(b,k0), vect(b,k1)};
clrscr();
textcolor(49);
textbackground(3);
nomF=1;
all='1';
do{
switch (all){
case '1':{
do {
clrscr();
cout<<"\n Setup:\n\n";
cout<<"1. Tochnost\n2. Kolichestvo wagov\n3. Vibor Funkcii\n4. Ustanovka pervoj tochki\n5. Sbros to4ek \n\n0. Continue";
cout<<"\n\n\n Tekuwie:\n\n Tochnost "<<e2<<"\n Kolichestvo wagov "<<w<<"\n Tekuwaja funkcija #"<<nomF<<"\n To4ki: a= "<<a<<" b= "<<b<<"\n";
n=getch();
switch (n){
case '1': {
clrscr();
cout<<"\n Tochnost po umolchaniju 0.0000001\n\n Izmenit? (y/n)";
k=getch();
if (k=='y') {
cout<<"\n\n Vvedite tochost: ";
cin>>e2;
}
break;}
case '2': {
clrscr();
cout<<"\n Kolichestvo wagov po umolchaniju 25\n\n Izmenit? (y/n)";
k=getch();
if (k=='y') {
cout<<"\n\n Vvedite Kolichestvo wagov: ";
cin>>w;
}
break;}
case '3': {
clrscr();
cout<<"Tekuwaja funkcija #"<<nomF<<"\n\nIzmenit? (y/n)";
k=getch();
if (k=='y') {
cout<<"\n Viberete fukciu:\n\n1. pow((x[1] -pow(x[0],2)),2) + 100*pow((1-pow(x[0],2)),2)\n2. 4*pow((x[0] -5),2) + pow((x[1] - 6),2) \n3. (x[1]-x[0]*x[0])*(x[1]-x[0]*x[0])+(1-x[0])*(1-x[0])" ;
k=getch();
switch(k) {
case '1': { nomF=1;
cout<<"\n\n Tekuwaja funkcija #1";
break;}
case '2': { nomF=2;
cout<<"\n\n Tekuwaja funkcija #2";
break;}
case '3': { nomF=3;
cout<<"\n\n Tekuwaja funkcija #3";
break;}
case '4': { nomF=4;
cout<<"\n\n Tekuwaja funkcija #4";
break;}
}}
break;}
case '4': {clrscr();
cout<<" Vvedite interval a..b\n a: ";
cin>>a;
cout<<" b: ";
cin>>b;
break;}
case '5': {a=1; b=2; c=3;tmp[0]=1;tmp[1]=1;X[0]=1;X[1]=2;break;}
case '0': {all='2';break;}
default: {clrscr();cout<<"\n\n\n\n\n\n\n\n\n!!!nepravilno vibran parametr!!!";getch();break;}
}
} while (n!='0'); }
case '2':{
do {
clrscr();
cout<<"\n Viberite metod:\n\n";
cout<<"1. Metod Swenna\n2. Metod Boltsano\n3. Metod DSK\n4. Metod Ciklicheskogo Pokoardinatnogo Spuska\n5. Setup\n\n0. Exit";
n=getch();
switch (n){
case '1': {
clrscr();
cout<<"\n Vi vibrali metod Swenna\n";
a = Swenn4(a);
b = Swenn4(b);
cout << "Swenn-4: interval[" << a << ", " << b << "]\n";
cout << "[ {" << A[0] << "," << A[1] << "} : {" << B[0] << "," << B[1] << "} ]\n";
getch();break;}
case '2': {
clrscr();
cout<<"\n Vi vibrali metod Boltsano\n";
c = Bolstano(a, b);
b=a;
a=c;
rmin(c);
cout << "Method Bolstano: Min = " << c << " - {" << C[0] << "," << C[1] << "}\n";
getch();break;}
case '3': {
clrscr();
cout<<"\n Vi vibrali metod DSK\n" ;
c = DSK(a);
b=a;
a=c;
// if (nomF==4) {
// D1[0] = D[0] + c*P[0];
// D1[1] = D[1] + c*P[1];
// D1[2] = D[2] + c*P[2];
// cout << "Method DSK: Min = " << c << " - {" << D1[0] << "," << D1[1] <<"," << D1[2]<< "}\n";}
// else {
rmin(c);
cout << "Method DSK: Min = " << c << " - {" << C[0] << "," << C[1] << "}\n";
// }
getch();break;}
case '4': {
clrscr();
cout<<"\n Vi vibrali metod Ciklicheskogo Pokoardinatnogo Spuska\n";
cout<<"\n\n\nauto? (y/n)\n\n";
t=getch();
main2();
getch();
break;}
case '5': {all='1';break;}
case '0': {all='0';break;}
default: {clrscr();cout<<"\n\n\n\n\n\n\n\n\n!!!nepravilno vibran parametr!!!";getch();break;}
}
} while (n<'0'||n>'6');
break;}
default: {clrscr();cout<<"\n\n\n\n\n\n\n\n\n!!!nepravilno vibran parametr!!!";getch();break;}
}
}
while (all!='0');
}