Оптимизация методом Фибоначчи - C#

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

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

Есть что-то похожее на pascal.
program fibonacci; 
uses crt; 
const n_m=40; 
type mas=array[1..n_m] of integer; 
type funo=function (x:real):real; 
var 
a,b,e:real; 
nom,n:integer; 
s:mas; 
procedure VvodIsxD_FC( var f:mas; var n:integer; var a,b,e:real); 
var i:integer; 
begin 
writeln('Ввод исходных данных для метода Фибоначчи'); 
write('Задайте N (количество разбиений): '); 
readln(n); 
writeln('Количество разбиений N = ',n); 
f[1]:=1; 
f[2]:=2; 
for i:=3 to n do 
f[i]:=f[i-1]+f[i-2]; 
write('Задайте EPSILON (точность) : '); 
readln(e); 
writeln('Задайте интервал (a,b)'); 
readln(a,b); 
writeln(a:12:8,', b = ',b:12:8); 
end; 
procedure Fibonach(z:funo; f:mas; n:integer; a,b,e:real); 
var 
k,i,p:integer; 
f2,f4,x1,x2,x3,x4:real; 
begin 
writeln; 
writeln('Нахождение минимума по методу Фибоначчи'); 
x1:=a; 
x2:=a+((b-a)*f[n-1]+e)/f[n]; 
x3:=b; 
f2:=z(x2); 
writeln(' Текущий интервал'); 
k:=1; 
writeln(x1:12:8,' ',x3:12:8); 
repeat 
x4:=x1-x2+x3; 
f4:=z(x4); 
if f4>f2 then 
begin 
if x2<x4 then 
begin 
x3:=x4; 
writeln(x1:12:8,' ',x3:12:8); 
end 
else 
begin 
x1:=x4; 
writeln(x1:12:8,' ',x3:12:8); 
end; 
end 
else 
begin 
if x2<x4 then 
begin 
x1:=x2; 
x2:=x4; 
f2:=f4; 
writeln(x1:12:8,' ',x3:12:8); 
end 
else 
begin 
x3:=x2; 
x2:=x4; 
f2:=f4; 
writeln(x1:12:8,' ',x3:12:8); 
end 
end; 
k:=k+1; 
until k>n; 
writeln; 
writeln('Минимум найден по методу Фибоначчи'); 
write('Конечный интервал ['); 
writeln(x1:12:8,',',x3:12:8,' ]'); 
writeln('Значение функции F = ',f2:15:12); 
end; 
function q(x:real):real; 
begin 
q:=cos(x); 
end; 
begin 
writeln('Нахождение оптимума по методу Фибоначчи'); 
VvodIsxD_FC(s,n,a,b,e); 
Fibonach(q,s,n,a,b,e); 
 
end.

Решение задачи: «Оптимизация методом Фибоначчи»

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 (x * x * x * x / Math.Log(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 = 1.1, b = 1.3, eps = 0.001;
            Fib(a, b,eps);
            Console.ReadKey();
        }

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


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

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

14   голосов , оценка 4.071 из 5
Похожие ответы