Метод Фибоначчи - 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();
}