Скачиваний:
12
Добавлен:
03.06.2014
Размер:
144.31 Кб
Скачать

Блок-схема метода Свенна-3

Спецификация программы

В программе реализован метод прямого поиска начального интервала локализации. Далее в программе производится сравнение двух методов простого линейного поиска и интерполяционного метода. Сравниваются методы Фибоначчи 2 и метод Дэвиса-Свенна-Кемпи

Текст программы

#include "stdafx.h"

#include <iostream>

#include <conio.h>

#include <math.h>

using namespace std;

int k,temp;

double f (double x)

{

return (2*pow(x,2)-exp(x));

}

long fibonachi (long x)

{

long s, tmp;

if(x>=1)

{

s=1; //F1

tmp=0;

for(long k=0; k<x; k++)

{

s=s+tmp;//Fn=F(n-1)+F(n-2)

tmp = s-tmp;//F(n-1)=F(n)-F(n-2)

}

return s;

}

else

return 1;

}

void swann(double *a, double *b, double x0, double h)

{

double x1=x0+h;

if(f(x0)<f(x1))

{

h=-h;

x1=x0+h;

}

do

{

h=2*h;

x1=x1+h;

k++;

}

while(f(x1-h)>f(x1));

if(h > 0){

*a = x1-h;// определение а и b в зависимости от направления h

*b = x1+h;

} else {

*a = x1+h;

*b = x1-h;

}

}

void fib( double a, double b)

{

double x2, x0 , x1;

int k=0, n=0;

double a1, b1;

double L1, Ln, Fn, e;

L1 = fabs(b - a);

Ln = 0.000001;

Fn = L1/Ln;

while (fibonachi(n)<Fn) {n++;}

Fn=fibonachi(n);

e = ( L1 / fibonachi(n+1) ) - Ln * 0.1;

if (e<0) {cout<<"Error!"<<endl; exit;}

x1 = a + fibonachi(n-1) * L1 / Fn + pow(double(-1),n) * e / Fn;

k=1;

while (n!=k)

{

x2 = a + b - x1;

if ((x1<x2) & (f(x1)<f(x2)))

{

b=x2;

}

if ((x1<x2) & (f(x1)>=f(x2)))

{

a=x1;

x1=x2;

}

if ((x1>x2) & (f(x1)<f(x2)))

{

a=x2;

}

if ((x1>x2) & (f(x1)>=f(x2)))

{

b=x1;

x1=x2;

}

k++;

}

cout<<endl;

cout<<"Fibbonachi - "<<x2<<", Iterations n="<<k<<endl;

}

void Sveng3( double x1, double *a, double* b, double* c, double h, double d) {

double x2, mu, la;

int k=0;

if(d!=0)

x1=d;

x2=x1+h;

if (f(x2)>f(x1)){

h=-h;

x2=x1+h;}

while(f(x2)<f(x1)){

x1=x2;

x2=x1+h;

k++;}

mu=(x1+x2)/2;

la=x1-0.5*h;

if(f(x1)<f(mu)){

*b=x1;

if(la<mu){

*a=la;

*c=mu;}

else{

*a=mu;

*c=la;}}

else{

*b=mu;

if(x1<x2){

*a=x1;

*c=x2;}

else{

*a=x2;

*c=x1;}}}

double d_swann_k(double *a,double *b, double *c,double x0, double h)

{

k=1;

temp=1;

double x1,d,x,e=0.00000001;

d=0;

do {

Sveng3(x0, a, b, c, h, d);

d = *b + 0.5*(*b - *a)*(f(*a) - f(*c))/(f(*a) - 2*f(*b) + f(*c));

if(fabs((*b-d)/(*b))<=e && fabs((f(*b)-f(d))/f(*b))<=e)

return (*b+d)/2;

else

{

if(f(*b)<f(d))

x0=(*b);

else

x0=d;

}

h=h/2;

temp++;

}

while(1);

}

void main()

{

double h=0.01,a,b,c,x0=1,e=0.001;

cout<<"Epsilon="<<e<<" x0="<<x0<<endl;

cout<<endl;

cout<<"Swann "<<endl;

swann(&a,&b,x0,h);

cout<<"a="<<a;

cout<<" b="<<b;

cout<<" k="<<k<<endl;

cout<<endl;

double x=x0;

fib(a,b);

double min=d_swann_k(&a,&b,&c,x0,h);

cout<<"d_Swann_k"<<" "<< min <<" Iterations" <<" " << temp;

getch();

}

Соседние файлы в папке р 1-5, 2 вар.; 7 лаб. метод Полака Рибьера + Лекции МО + перевод ГА