Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Метод Свенна / sven-zs1
.cppСпецификация программы:
Каждый метод реализован в виде функции.
Переменные в программе:
a, b – текущий интервала локализации
h – размер шага
x – аппроксимирующий минимум
x1 – стартовая точка
l, m - точки деления интервала локализации в ЗС1
k – счетчики числа итераций.
Текст программы:
#include <iostream.h>
#include <math.h>
#include <conio.h>
long double a,b;
int k1,k;
double Sven (long double,long double,long double);
double ZS1 (long double,long double);
double fx(long double);
/**************************************************************************/
void main()
{
clrscr();
long double h=0.01,x2,x1;
x1=1;
x2=x1+h;
if ( fx(x2) > fx(x1))
h=-h;
h=Sven (x1,x2,h);
cout << " a " << a << endl;
cout << " b " << b << endl;
long double m,l,x;
m=a+0.618*(b-a);
l=a+0.382*(b-a);
x=ZS1 (m,l);
cout << endl <<" x " << x << endl;
cout << endl <<" k(Svenn) " << k1 << endl;
cout << endl <<" k(ZS1) " << k << endl;
getch();
}
/**************************************************************************/
double Sven(long double x1, long double x2, long double h)
{
long double x3,z;
x2=x1+h;
while (1)
{
h=2*h;
x3=x2+h;
if (fx(x3)>fx(x2))
break;
x1=x2;
x2=x3;
k1=k1+1;
}
a=x1;
b=x3;
if (a>b)
{
z=b;
b=a;
a=z;
}
return h;
}
/**************************************************************************/
double ZS1(long double m, long double l)
{
long double x;
while (1)
{
if (fx(l) < fx(m))
{
b=m;
m=l;
l=a+0.382*(b-a);
}
else
{
a=l;
l=m;
m=a+0.618*(b-a);
}
if (abs(b-a)<0.001)
break;
k=k+1;
}
x=(a+b)/2;
return x;
}
/**************************************************************************/
double fx(long double x)
{
long double s,f;
s=(2*pow(x,2)+3*pow(2.7,(-x)));
return s;
}
Соседние файлы в папке Метод Свенна