Метод Фибоначчи - 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(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д