Форум программистов, компьютерный форум CyberForum.ru

Метод Золотого Сечения - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 32, средняя оценка - 4.78
CryNet
0 / 0 / 1
Регистрация: 13.04.2011
Сообщений: 78
Записей в блоге: 1
11.12.2011, 18:28     Метод Золотого Сечения #1
Помогите пожалуйста прокомментировать данную программу, а то не до конца пойму все действия.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#define eps 1e-3
#define tay 1.618
 
void Gold(double a, double b)
{
        std::cout<<"\n\n\n\tМетод золотого сечения:\n";
        double x1, x2, _x, xf1, xf2;
        int iter(0);
        x1 = a + (b - a) / (tay * tay);
        x2 = a + (b - a) / tay;
        xf1 = Fun(x1);
        xf2 = Fun(x2);
  P:
        iter++;
        if(xf1 >= xf2)
        {
                a = x1;
                x1 = x2;
                xf1 = Fun(x2);
                x2 = a + (b - a) / tay;
                xf2 = Fun(x2);
        }
        else
        {
                b = x2;
                x2 = x1;
                xf2 = xf1;
                x1 = a + (b - a) / (tay * tay);
                xf1 = Fun(x1);
        }
        if(fabs(b - a) < eps) 
        {
                _x = (a + b) / 2;
                std::cout<<"Результат:\nx = "<<_x<<"\t\tF(x) = "<<Fun(_x)<<
                        "\nКоличество итераций: "<<iter;
        }
        else
                goto P;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
11.12.2011, 18:39     Метод Золотого Сечения #2
Метод Золотого сечения подразумевает нахождения экстремума функции на промежутке [a;b] путём последовательного деления промежутка на две части(см систему)
http://www.cyberforum.ru/cgi-bin/latex.cgi?\begin{cases}  & \text {x}_{1} = b - \tau *(b - a) \\   & \text {x}_{2} = a + \tau *(b - a) \end{cases}
где
http://www.cyberforum.ru/cgi-bin/latex.cgi?\tau = \frac{\sqrt{5} - 1}{2}\approx 0,61803399 (http://www.cyberforum.ru/cgi-bin/latex.cgi?{x}_{1} < {x}_{2})
-=ЮрА=-
Заблокирован
Автор FAQ
11.12.2011, 19:08     Метод Золотого Сечения #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cmath>
using namespace std;
 
double f(double x)
{
    double ret = pow(x,3) + 8*pow(x,2) - 3*x + 3;
    return ret;
}
 
int main()
{
    long nIter = 1;
    double a, b, e, xmin;
    cout<<"Enter a : ";cin>>a;
    cout<<"Enter b : ";cin>>b;
    cout<<"Enter e : ";cin>>e;
    double t = (sqrt(5) - 1)*0.5;
    double x1 = b - t*(b - a);
    double x2 = a + t*(b - a);
    while(e <= fabs(b - a))
    {
        cout<<"Iteration : "<<(nIter++)<<endl;
        cout<<"x1 =  "<<x1<<endl;
        cout<<"x2 =  "<<x2<<endl;
        cout<<"f(x1) "<<f(x1)<<endl;
        cout<<"f(x2) "<<f(x2)<<endl;
        if(f(x2) < f(x1))
            a = x1;
        else
            b = x2;
        x1 = b - t*(b - a);
        x2 = a + t*(b - a);
    }
    cout<<"xmin =  "<<(xmin = (a + b)*0.5)<<endl;
    cout<<"f(xmin) "<<f(xmin)<<endl;
    system("pause");
    return 0;
}
Вывод в консоль
Enter a : -5
Enter b : 5
Enter e : 0.001
Iteration : 1
x1 = -1.18034
x2 = 1.18034
f(x1) 16.0422
f(x2) 12.2491
Iteration : 2
x1 = 1.18034
x
раскрыть
2 = 2.63932
f(x1) 12.2491
f(x2) 69.1957
Iteration : 3
x1 = 0.27864
x2 = 1.18034
f(x1) 2.80684
f(x2) 12.2491
Iteration : 4
x1 = -0.27864
x2 = 0.27864
f(x1) 4.43541
f(x2) 2.80684
Iteration : 5
x1 = 0.27864
x2 = 0.623059
f(x1) 2.80684
f(x2) 4.47832
Iteration : 6
x1 = 0.0657781
x2 = 0.27864
f(x1) 2.83756
f(x2) 2.80684
Iteration : 7
x1 = 0.27864
x2 = 0.410197
f(x1) 2.80684
f(x2) 3.18452
Iteration : 8
x1 = 0.197334
x2 = 0.27864
f(x1) 2.72721
f(x2) 2.80684
Iteration : 9
x1 = 0.147084
x2 = 0.197334
f(x1) 2.735
f(x2) 2.72721
Iteration : 10
x1 = 0.197334
x2 = 0.22839
f(x1) 2.72721
f(x2) 2.74404
Iteration : 11
x1 = 0.17814
x2 = 0.197334
f(x1) 2.7251
f(x2) 2.72721
Iteration : 12
x1 = 0.166278
x2 = 0.17814
f(x1) 2.72695
f(x2) 2.7251
Iteration : 13
x1 = 0.17814
x2 = 0.185472
f(x1) 2.7251
f(x2) 2.72516
Iteration : 14
x1 = 0.173609
x2 = 0.17814
f(x1) 2.72553
f(x2) 2.7251
Iteration : 15
x1 = 0.17814
x2 = 0.180941
f(x1) 2.7251
f(x2) 2.72502
Iteration : 16
x1 = 0.180941
x2 = 0.182672
f(x1) 2.72502
f(x2) 2.72503
Iteration : 17
x1 = 0.179871
x2 = 0.180941
f(x1) 2.72504
f(x2) 2.72502
Iteration : 18
x1 = 0.180941
x2 = 0.181602
f(x1) 2.72502
f(x2) 2.72502
Iteration : 19
x1 = 0.181602
x2 = 0.18201
f(x1) 2.72502
f(x2) 2.72502

Iteration : 20
x1 = 0.181349
x2 = 0.181602
f(x1) 2.72502
f(x2) 2.72502
xmin = 0.181271
f(xmin) 2.72502
Для продолжения нажмите любую клавишу . . .
Миниатюры
Метод Золотого Сечения   Метод Золотого Сечения  
CryNet
0 / 0 / 1
Регистрация: 13.04.2011
Сообщений: 78
Записей в блоге: 1
11.12.2011, 19:56  [ТС]     Метод Золотого Сечения #4
а строчки кода прокоментировать можеш?
Yandex
Объявления
11.12.2011, 19:56     Метод Золотого Сечения
Ответ Создать тему
Опции темы

Текущее время: 15:41. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru