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

Метод чисел Фибоначчи. Вывести решение в виде численного значения в точке экстремума независимой переменной - C++

Восстановить пароль Регистрация
 
blager
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 2
22.05.2014, 00:29     Метод чисел Фибоначчи. Вывести решение в виде численного значения в точке экстремума независимой переменной #1
Написать программу которая должна выводить решение в виде численного значения в точке экстремума независимой переменной (x экстр.) и значения функции в этой точке y(x экстр.).
Метод расчета: Метод чисел Фибоначчи
Интервал поиска: x=-14..-0.7
Функция : max (8*x^2+7*x+1)/(x^4-17*x^3)+9
Величина точности поиска E=0.001
Нашёл что-то похожее, только тут условие другое "f(x)=2x*x*x-6*x+3, a=0, b=2,5".
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 #include <iostream>
#include <cmath>
#include <fstream>
#include "Methods.h"
 
void Fib(double, double, std::ofstream&);
 
int main()
{
    std::ofstream cout("rezult.txt", std::ios::out);
    setlocale(LC_ALL, "Russian");
    double a(0), b(2.5);
    Fib(a, b, cout);
    system("pause");
    return EXIT_SUCCESS;
}

Кликните здесь для просмотра всего текста
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#define eps 1e-3
 
double Fun(double x)
{
    return (2 * x * x * x - 6 * x + 3);
}
int F(int n)
{
    int f, f1(1), f2(1), m(0);
    while(m < n - 1)
    {
        f = f1 + f2;
        f1 = f2;
        f2 = f;
        ++m;
    }
    return f1;
}
void Fib(double a, double b, std::ofstream& cout)
{
    cout<<"\n\n\n\tМетод Фибоначчи:\n\n";
    double x1, x2, _x, xf1, xf2;
    int k(0);
    int N(0);
    double fn1(1), fn2(1), fn, f = (b - a) / eps;
    while(fn1 < f)
    {
        fn = fn1 + fn2;
        fn1 = fn2;
        fn2 = fn;
        ++N;
    }
    x1 = a + (double)F(N - 2) / F(N) * (b - a) - (N&1 ? -1 : 1) * eps / F(N);
    x2 = a + (double)F(N - 1) / F(N) * (b - a) + (N&1 ? -1 : 1) * eps / F(N);
    xf1 = Fun(x1);
    xf2 = Fun(x2);
  P:
    ++k;
    if(xf1 >= xf2)
    {
        a = x1;
        x1 = x2;
        xf1 = xf2;
        x2 = a + (double)F(N - k - 1) / F(N - k) * (b - a) + ((N - k)&1 ? -1 : 1) * eps / F(N - k);
        xf2 = Fun(x2); 
    }
    else
    {
        b = x2;
        x2 = x1;
        xf2 = xf1;
        x1 = a + (double)F(N - k - 2) / F(N - k) * (b - a) - ((N - k)&1 ? -1 : 1) * eps / F(N - k);
        xf1 = Fun(x1);
    }
    cout<<"Итерация № "<<k<<'\n'
        <<"x1 = "<<x1<<"\t\tF(x1) = "<<xf1
        <<"\nx2 = "<<x2<<"\t\tF(x2) = "<<xf2
        <<'\n'<<std::endl;
    if(fabs(b - a) <= eps)
    {
        _x = (a + b) / 2;
        cout<<"Результат:\nx = "<<_x<<"\t\tF(x) = "<<Fun(_x)<<
            "\nКоличество итераций: "<<k;
    }
    else
        goto P;
}

Добавил #include <math.h>, а то ругался на fabs. Но что-то у меня не работает даже с тем условием. Помогите переписать программу.

Добавлено через 30 минут
Не сразу понял как работает программа, всё оказывается работает. Помогите переписать код программы под моё условие.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2014, 00:29     Метод чисел Фибоначчи. Вывести решение в виде численного значения в точке экстремума независимой переменной
Посмотрите здесь:

Существует ли метод/функция перевода значения символьной переменной в int C++
Вывести последовательность из N чисел Фибоначчи (1, 1, 2, 3, 5, 8, 13…). C++
вывести на экран n первых чисел Фибоначчи C++
C++ Для заданного значения n сформировать массив X(n), являющийся последовательностью чисел Фибоначчи
C++ Вывести на экран первые 20 чисел Фибоначчи.
C++ Решение нелинейного уравнения в общем виде, ввод с клавиатуры, метод дихотомии
C++ Вывести на экран в виде таблицы значения чисел из интервала от A до B с шагом C в системах счисления с основан
C++ Вычислить количество чисел Фибоначчи до заданного значения

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
blager
0 / 0 / 0
Регистрация: 13.12.2012
Сообщений: 2
02.07.2014, 02:13  [ТС]     Метод чисел Фибоначчи. Вывести решение в виде численного значения в точке экстремума независимой переменной #2
Вообщем вот код, быть может кому нибудь пригодится/
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include<stdio.h>
double f(double x)
{double f;
f = (9+((8*x*x+7*x+1)/(x*x*x*x-17*x*x*x)));
return f;
}
void main()
{
const double e=0.001, d=e/10;
const long Fn=50000; //N > (b-a)/(2*e)
 
 
    int F1, F0, F, N; // F1=F[n-1], F0=F[n-2]
    double x1,x2,y1,y2,x,y,a,b;
        cout<<"Vvedite nijnii granicy: "<<endl;
    cin>>a;
    cout<<"Vvedite verxnii granicy: "<<endl;
    cin>>b;
    F0=1; F1=1;
    F=0; N=0;
 
   cout<<"Method chisel Fibonachchi"<<endl<<endl;
   cout<<"Dano:(8*x^2+7*x+1)/(x^4-17*x^3)+9; [a,b]=[-14,-0,7]; eps=0.001\n "<<endl;
    while (F<Fn)
    {
        F=F1+F0;
        if (F<Fn)
        {
            F0=F1;
            F1=F;
        }
    }
    x1=a+F0*(b-a)/F;
    x2=a+F1*(b-a)/F;
    y1=f(x1);
    y2=f(x2);
    N=0;
    do
    {
        if (y1<=y2)
        {
            b=x2; x2=x1; y2=y1; x1=a+b-x2; y1=f(x1);
        }
        else
        {
            a=x1; x1=x2; y1=y2; x2=a+b-x1; y2=f(x2);
        }
        N++;
    }
    while (b-a>2*e);
    if (y1<=y2)
    {
        b=x2, x2=x1, y2=y1;
    }
else a=x1;
      x1=x2-d; // ychet raslichimosti
      y1=f(x1);
    x=(a+b)/2; y=f(x);
    cout<<"x= "<<x<<endl;
   cout<<"y= "<<y<<endl;
   cout<<endl<<"Kolichestvo experimentov N="<<N<<endl;
   getch();
}
Yandex
Объявления
02.07.2014, 02:13     Метод чисел Фибоначчи. Вывести решение в виде численного значения в точке экстремума независимой переменной
Ответ Создать тему
Опции темы

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