Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

C++. Метод золотого сечения для поиска екстремумов

76K
29 ноября 2011 года
prostdj
5 / / 29.11.2011
#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;

#define epsilon 0.0001
//------------------------------------------------------------------------------

double func(double x){
return x*x*x + 10*x*x + 31*x +30;
}

//------------------------------------------------------------------------------

double double_find_zp_min(double a, double b, double eps){

if ( a > b )
{
double temp = a;
a = b;
b = temp;
}

while ( fabs( a - b ) > eps )
{
if (
func( a + fabs(b-a) * 0.38)

< // МІНІМУМ

func( b - fabs(b-a) * 0.38)
)
{
b -= fabs(a-b) * 0.38;
}
else
{
a += fabs(a-b) * 0.38;
}
}

return (a+b)/2;
}

//------------------------------------------------------------------------------

double double_find_zp_max(double a, double b, double eps){
if ( a > b )
{
double temp = a;
a = b;
b = temp;
}

while ( fabs( a - b ) > eps )
{
if (
func( a + fabs(b-a) * 0.38)

>

func( b - fabs(b-a) * 0.38)
)
{
b -= fabs(a-b) * 0.38;
}
else
{
a += fabs(a-b) * 0.38;

}
}

return (a+b)/2;
}

//------------------------------------------------------------------------------

int main(int argc, char* argv[])
{

double min_x=double_find_zp_min(-3, -2, epsilon);
double max_x=double_find_zp_max(-5, -3, epsilon);
printf(" Min of func ( %.4f ) = %.4f \n",min_x, func(min_x));
printf(" Max of func ( %.4f ) = %.4f \n",max_x, func(max_x));


system("pause");
return 0;
}
вот написал кое какой код...я пересчитовал на бумаге и оказалось что прога считает почему то неправильно.. и еще препод требует чтоб а и б вводили сами ... то есть чтобы поиск екстремумов проводился на любом промежутке заданом нами..буду благодарен за любую помощь в коректировке кода...
14
30 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
а 0.38 это что?
76K
30 ноября 2011 года
prostdj
5 / / 29.11.2011
Цитата: Phodopus
а 0.38 это что?


когда я писал прогу то брал теорию с учебника Калиткин на 196 странице там расписан этот метод и там было:
(б-х2)/(б-а)=(х1-а)/(б-а)=кси! а кси=2/(3+sqrt(5))=0.38

76K
30 ноября 2011 года
prostdj
5 / / 29.11.2011
так что? поможет кто код исправить?
14
30 ноября 2011 года
Phodopus
3.3K / / 19.06.2008
Ну если считает неправильно, значит метод реализован неправильно. А вводить можно с помощью cin >> arg1 cin>>arg2
76K
30 ноября 2011 года
prostdj
5 / / 29.11.2011
ну ладно... никто не хочет нормально помоч... тему можно закрывать! сам розберусь....
76K
07 декабря 2011 года
prostdj
5 / / 29.11.2011
#include <math.h>
#include <iostream>
using namespace std;

double f(double x)
{
return x*x*x+10*x*x+31*x+30;
}
double max(double a, double b, double eps)
{

double g, h, fu1, fu2;
double fi = (1+sqrt(5.0))/2;
//cout<<"Input a for max"<<endl;
//cin>>a;
//cout<<"Input b for max"<<endl;
//cin>>b;
g = (a+(b-a))/fi;
h = (b-(b-a))/fi;
fu1 = f(g);
fu2 = f(h);

do{

if( fu1<=fu2 )
{
b = h;
h = g;
fu2 = fu1;
g = (a+(b-a))/fi;
fu1 = f(g);
}
else
{
a = g;
g = h;
fu1 = fu2;
h = (b-(b-a))/fi;
fu2 = f(h);
}
}
while(fabs(b-a)<eps);
cout<<"Maximum "<<f((a+b)/2)<<" v tochke "<<h<<endl;
}
double min(double a, double b, double eps)
{

double g, h, fu1, fu2;
double fi = (1+sqrt(5.0))/2;
//cout<<"Input a for min"<<endl;
//cin>>a;
//cout<<"Input b for min"<<endl;
//cin>>b;
g = (a+(b-a))/fi;
h = (b-(b-a))/fi;
fu1 = f(g);
fu2 = f(h);

do{

if( fu1>=fu2 )
{
b = h;
h = g;
fu2 = fu1;
g = (a+(b-a))/fi;
fu1 = f(g);
}
else
{
a = g;
g = h;
fu1 = fu2;
h = (b-(b-a))/fi;
fu2 = f(h);
}
}
while(fabs(b-a)<eps);
cout<<"Minimum "<<f((a+b)/2)<<" v tochke "<<h<<endl;
}
int main()
{
double a, b,eps;
cout<<"Input a"<<endl;
cin>>a;
cout<<"Input b"<<endl;
cin>>b;
cout<<"Input eps"<<endl;
cin>>eps;
max(a,b,eps);
min(a,b,eps);
system ("PAUSE");
return 0;
}
вот переписал код... считает неправльно...буду благодарен за любые исправления
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог