Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №1 (Хасанов А.Ю.).doc
Скачиваний:
89
Добавлен:
02.05.2014
Размер:
902.14 Кб
Скачать

3.2.Блок-схема алгоритма

3. Алгоритм деления интервала пополам

3.1. Текст программы на С++

#include<iostream.h>

#include<math.h>

#include<conio.h>

#include<stdio.h>

double f(double x)

{double f;

f=pow(x, 3)-x+exp(-x);

return f;

}

void main()

{

const double e=0.00001; //tochnost`

double a=0, b=1;

double x[5], y[4], yl, xl;

int i, N, l;

clrscr();

printf("Method delenija intervala popolam \n");

x[2]=(a+b)/2; //seredina otrezka neopredelennosty

y[2]=f(x[2]);

N=1; //schetchik experimentov

while (b-a > 2*e)

{

x[0]=a;

x[4]=b;

x[1]=(a+x[2])/2;

y[1]=f(x[1]);

x[3]=(x[2]+b)/2;

y[3]=f(x[3]);

N+=2;

/*poisk minimuma*/

yl=y[1]; xl=x[1]; l=1;

for (i=2; i<4; i++)

if (yl>y[i]) {yl=y[i]; xl=x[i]; l=i;}

/*-------------*/

a=x[l-1];

b=x[l+1];

x[2]=xl;

y[2]=yl;

}

printf("\nx = %.5f \ny = %.5f \n\nKol-vo experimentov: %i", x[2], y[2], N);

getch();

}

3.2. Блок-схема алгоритма

5. Метод дихотомии

5.1. Текст программы на С++

#include<iostream.h>

#include<math.h>

#include<conio.h>

#include<stdio.h>

double f(double x)

{double f;

f=pow(x, 3)-x+exp(-x);

return f;

}

void main()

{

const double e=0.00001, d=e/10; //tochnost` i delta

double a=0, b=1;

double x, y1, y2;

int N;

clrscr();

printf("Method dihotomii \n\n");

N=0; //schetchik experimentov

while (b-a > 2*e)

{

x=(a+b)/2;

y1=f(x-d);

y2=f(x+d);

N+=2;

(y1 < y2 ? b=x+d : a=x-d);

}

x=(a+b)/2;

y1=f(x);

printf("x = %.5f \ny = %.5f \n\nKov-vo experimentov: %i",x, y1, N);

getch();

}

5.2. Блок-схема алгоритма

6. Метод золотого сечения

6.1. Текст программы на С++

#include<iostream.h>

#include<math.h>

#include<conio.h>

#include<stdio.h>

double f(double x)

{double f;

f=pow(x, 3)-x+exp(-x);

return f;

}

double sqr(double x) //kvadrat

{return x*x;

}

void main()

{

const double e=0.00001, t=0.5*(1+sqrt(5)); //tochnost` i proporcia (tau:)

double a=0, b=1;

double x1,x2, y1, y2, x;

int N=0;

clrscr();

printf("Method zolotogo sechenija \n\n");

x1=a+(b-a)/sqr(t);

y1=f(x1);

x2=a+(b-a)/t;

y2=f(x2);

N+=2;

while ((b-a)/t > 2*e)

if (y1<y2) {b=x2;

x2=x1;

y2=y1;

x1=a+b-x2;

y1=f(x1); N++;

}

else {a=x1;

x1=x2;

y1=y2;

x2=a+b-x1;

y2=f(x2); N++;

}

(y1<y2 ? x=(a+x2)/2 : x=(x1+b)/2);

y1=f(x);

printf("x = %.5f \ny = %.5f \n\nKov-vo experimentov: %i",x, y1, N);

getch();

}

6.2. Блок-схема алгоритма

7. Метод Фибоначчи

7.1. Текст программы на С++

#include<iostream.h>

#include<math.h>

#include<conio.h>

#include<stdio.h>

double f(double x)

{double f;

f=pow(x, 3)-x+exp(-x);

return f;

}

void main()

{

const double e=0.00001, d=e/10;

const long Fn=50000; //N > (b-a)/(2*e)

long i, fnext, fpred, F, N;

double x1,x2, y1,y2, a=0, b=1;

clrscr();

cout<<"Method chisel Fibonachchi"<<endl<<endl;

//vychislyaem chisla fibbonachi

fpred=1; fnext=1; //f[0], f[1]

F=0; N=2;

while (F<Fn)

{F=fnext+fpred; //f[i]=[i-1]+f[i-2]

N++;

if (F<Fn)

{fpred=fnext; //[f[i-1] -> f[i-2]

fnext=F; //f[i] -> f[i-1]

}

}

/*fpred=f[n-2] , fnext=f[n-1], F=f[n] */

cout<<"Kol-vo chisel Fibonachchi: "<<N<<endl;

//vychislyaem ishodnye tochki

x1=a+fpred*(b-a)/F;

x2=a+fnext*(b-a)/F;

y1=f(x1);

y2=f(x2);

i=2; //schetchik experimentov

//umenshaem otrezok neopredelennosty (stepS 4-6)

do

{if (y1<y2) {b=x2; x2=x1; y2=y1; x1=a+b-x2; y1=f(x1);}

else {a=x1; x1=x2; y1=y2; x2=a+b-x1; y2=f(x2);}

i++;

} while (i<N-1);

if (y1<y2) {b=x2; x2=x1; y2=y1;}

else a=x1;

x1=x2-d;

y1=f(x1); i++;

if (y1<y2) b=x2;

else a=x1;

x1=(a+b)/2; y1=f(x1);

printf("x = %.5f \n", x1);

printf("y = %.5f \n \n", y1);

cout<<"kol-vo experimentov: "<<i;

getch();

}