C++. Метод золотого сечения для поиска екстремумов
#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;
}
вот написал кое какой код...я пересчитовал на бумаге и оказалось что прога считает почему то неправильно.. и еще препод требует чтоб а и б вводили сами ... то есть чтобы поиск екстремумов проводился на любом промежутке заданом нами..буду благодарен за любую помощь в коректировке кода...
а 0.38 это что?
Цитата: Phodopus
а 0.38 это что?
когда я писал прогу то брал теорию с учебника Калиткин на 196 странице там расписан этот метод и там было:
(б-х2)/(б-а)=(х1-а)/(б-а)=кси! а кси=2/(3+sqrt(5))=0.38
так что? поможет кто код исправить?
Ну если считает неправильно, значит метод реализован неправильно. А вводить можно с помощью cin >> arg1 cin>>arg2
ну ладно... никто не хочет нормально помоч... тему можно закрывать! сам розберусь....
#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;
}
вот переписал код... считает неправльно...буду благодарен за любые исправления