
Блок-схема метода Свенна-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();
}