Метод Фибоначчи - C#

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, товарищи! В общем дали задачу: Написать программу для вычисления значений функции методом Фибоначчи! Она даже что-то считает, только всё не в ту степь! Подсобите, пожалуйста! Функция e-1-cos(x), интервал от 0 до 1, количество итераций - 11.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace FIBO
{
    class Program
    {
 
        static void Main(string[] args)
        {
            int n = 13;
 
            double x2, x4, e, a = 0, b = 1;
            double xf2, xf4;
            e = 0.0001;
            List<int> f = new List<int>();
            f.Add(0);
            f.Add(1);
 
            for (int i = 2; i < n; i++)
            {
                f.Add(f[f.Count - 1] + f[f.Count - 2]);
               
            }

            for (int i = 0; i < n; i++)
             
            {
                try
                {
                    x2 = a + (f[i - 1 - 1] * (b - a) + ((Math.Pow(-1, i - 1) * e))) / (f[i - 1]);
                    x4 = a - x2 + b;
                    xf2 = fun(x2);
                    xf4 = fun(x4);
 
                    if (x4 < x2)
                    {
                        if (xf4 < xf2)
                        {
                            b = x2;
                            xf2 = fun(x4);
                            x2 = x4;
                            
                        }
 
                        else
                        {
                            a = x4;
                            x4 = x2;
                            xf4 = fun(x2);
                           
                        }
                    }
 
                    if (x4 > x2)
                    {
                        if (xf4 < xf2)
                        {
                            a = x2;
                            x2 = x4;
                            xf2 = fun(x4);
                          
                        }
                        else
                        {
                            b = x4;
                            x4 = x2;
                            xf4 = fun(x2);
                           
                        }
                    }
 
                    double x = (a + b) / 2;
                    Console.WriteLine("x = " +x);
                    Console.WriteLine("y = " +fun(x));
                    Console.ReadKey(true);

                }
                catch (Exception)
                { }

            }
        }
 
            private static double fun(double x)
            {
            return Math.Pow(Math.E, -1) - Math.Cos(x);
            }
        }
    }

Решение задачи: «Метод Фибоначчи»

textual
Листинг программы
      static 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;
        }
 
        static double Fun(double x)
        {
            return Math.Pow(Math.E, -1) - Math.Cos(x);
        }
 
      static  void Fib(double a, double b, double eps)
        {
            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;
            }
            bool bix;
            int ix = N & 1;
            if (ix == 1)
                bix = true;
            else
                bix = false;
            x1 = a + (double)F(N - 2) / F(N) * (b - a) - (bix ? -1 : 1) * eps / F(N);
            x2 = a + (double)F(N - 1) / F(N) * (b - a) + (bix ? -1 : 1) * eps / F(N);
            xf1 = Fun(x1);
            xf2 = Fun(x2);
        P:
            ++k;
            if (xf1 >= xf2)
            {
                ix = (N - k) & 1;
                if (ix == 1)
                    bix = true;
                else
                    bix = false;
                a = x1;
                x1 = x2;
                xf1 = xf2;
                x2 = a + (double)F(N - k - 1) / F(N - k) * (b - a) + (bix ? -1 : 1) * eps / F(N - k);
                xf2 = Fun(x2);
            }
            else
            {
                ix = (N - k) & 1;
                if (ix == 1)
                    bix = true;
                else
                    bix = false;
                b = x2;
                x2 = x1;
                xf2 = xf1;
                x1 = a + (double)F(N - k - 2) / F(N - k) * (b - a) - (bix ? -1 : 1) * eps / F(N - k);
                xf1 = Fun(x1);
            }
            if (Math.Abs(b - a) <= eps)
            {
                _x = (a + b) / 2;
                Console.WriteLine("x = {0:F4}, F(x) = {1:F4}, Количество итераций: {2}", _x, Fun(_x), k );
            }
            else
                goto P;
        }
 
        static void Main(string[] args)
        {
            double a = 0, b = 1, eps = 0.0001;
            Fib(a, b,eps);
            Console.ReadKey();
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 3.786 из 5