#include <iostream>
#include <math.h>
#include <conio.h>
#include <iomanip>
using namespace std;
double func(double x) // функция вызова функции
{
return (10*x*log10(x)/log10(2.7)-(x*x)/2); // заданная задачей функция
}
void mZolotSech(int N, double a,double b) // сам метод
{
long double x1,x2,y1,y2, ymin, xmin,t, er,ea; // er -> расчетная погрешность, еа->вычисляемая погрешность.
int m,j;
t=(1+sqrtl(5))/2; // то самое phi, отношение золотого сечения
er=(b-a)/(2*pow(t, (N-1)));
x1=b-(b-a)/t; y1=func(x1);
x2=a+(b-a)/t; y2=func(x2);
m=2;
do
{
if(y1<y2)
{b=x2;
x2=x1; y2=y1;
x1=b-(b-a)/t;
y1=func(x1);
cout<<"m="<<m<<" x1="<<x1<<" x2="<<x2<<" y1="<<y1<<" y2="<<y2<<endl;
}
else
{ a=x1;
x1=x2; y1=y2;
x2=a+(b-a)/t;
y2=func(x2);
cout<<"m="<<m<<" x1="<<x1<<" x2="<<x2<<" y1="<<y1<<" y2="<<y2<<endl;
}
m++;
}
while(m<N);
if(y1<y2) b=x2;
else a=x1;
cout<<endl;
cout<<a<<b;
xmin=(a+b)/2.0; ymin=func(xmin); ea=(b-a)/2.0;
cout<<endl;
cout<<setw(15)<<xmin<<setw(15)<<ymin<<setw(15)<<er<<setw(15)<<ea<<endl;
_getch();
}
int main()
{
setlocale(LC_ALL, "Russian");
cout<<"Добро Пожаловать в программу\n";
int N; double a,b;
cout<<"Введите количество экспериментов=";cin>>N;cout<<"\nВведите a=";cin>>a;cout<<"\nВведите b=";cin>>b;
mZolotSech(N,a,b);
}
Вот скриншот выполнения программы:

Видим 5 строк каждая соответствует: 10,20,30,40,50 итераций. Последние 2 строки отличаются, значительно чего не должно быть.
Описание принципа метода (только при заданном Е (погрешность))
Мой случай: 10х*ln(x)-x*x/2
ограничения: [0.1;1]
Задано количество итерация(подсчетов), нужно найти Хmin, Ymin, Ер, Ев.
Ер-расчетная погрешность, Ев-вычислительная.
Вы просто неправильно запрограммировали шаг 2 алгоритма по Вашей ссылке. Там же на каждой итерации надо пересчитывать x1 и x2 по скорректированным a и b.
Посмотрите еще раз внимательно на алгоритм и Вашу программу (код в цикле do { ... } while();)
– avp Oct 21 '13 at 19:45где
phiэто пресловутое золотое сечение == 1.618... (сeps, надеюсь, все понятно).А у Вас какой-то совсем не тот алгоритм. Может он и правильный, но причем здесь тогда эта ссылка?
– avp Oct 23 '13 at 19:07И, кстати, из сонсольного (cmd.exe) окна лучше делать copy с последующим paste в текст вопроса, чем лепить скриншот.
– alexlz Oct 24 '13 at 12:56Так вот, очевидно что иррациональное число фи комп точно посчитать не может, считает он его с некоторой погрешностью. И эта погрешность накладывает ограничения на точность самого метода, читай в любой методичке по численным методам, например тут: http://www.machinelearning.ru/
Ну и вообще по логике вещей: у тебя порядок длины отрезка который ты хочешь получить -17, а выражения с помощью которых ты этот отрезок ищещь считаются с точностью скажем -10. Ничего странного не видишь?
– Утка Учится Укрываться Oct 24 '13 at 18:14В правилах ХК объясняется, что если ответ нравится, то +, а если нет - то -.
Видимо такой ответ не понравился, может его надо было как комментарий написать?
– avp Oct 24 '13 at 18:43