Как получить цель системы нелинейных функций / уравнений 2 для ее решения с использованием метода наискорейшего спуска C #? - PullRequest
0 голосов
/ 24 ноября 2018

поэтому у меня есть алгоритм наискорейшего спуска для решения нелинейных уравнений в MATLAB.Я пытаюсь заставить его работать в C #.Я уже переписал большую часть этого, но теперь я застрял в той части, где я должен получить цель системы 2 функция / уравнение.

Целевая функция в MATLAB:

%     Target function
function rez=target(x)
rez=f(x)'*f(x)/2;
return
end

f(x) определяется там:

function fff=f(x)
   fff=[x(1)^2+x(2)^2-2;
     x(1)^2-x(2)^2];
return
end

Код, который у меня есть в C # до сих пор (у меня естьввод функций и функции градиента с частными производными):

    // System of 2 nonlinear functions
    Vector<double> Func(double x1, double x2)
    {
        // First function of the system
        double f = Math.Pow(Math.Sin(x1 / 2), 3) + Math.Pow(Math.Cos(x2 / 2), 2) - 0.5;
        // Second function of the system
        double s = Math.Pow(x2 - 3, 2) + Math.Pow(x1, 2) + x1 * x2 - 4;
        return Vector<double>.Build.DenseOfArray(new double[] { f, s });
    }

    // Gradient of a 2 nonlinear functions system
    Vector<double> Gradient(double x1, double x2)
    {
        // Partial derivative of function1 by x1
        double f1 = 1.5 * Math.Pow(Math.Sin(x1 / 2), 2) * Math.Cos(x1 / 2);
        // Partial derivative of function1 by x2
        double f2 = -0.5 * Math.Sin(x2);
        // Partial derivative of function2 by x1
        double s1 = 2 * x1 + x2;
        // Partial derivative of function2 by x2
        double s2 = 2 * x2 - 6 + x1;

        return Vector<double>.Build.DenseOfArray(new double[] { f1, f2, s1, s2 });
    }

Весь алгоритм наискорейшего спуска в MATLAB (вы можете увидеть, где используется эта функция target(x)):

eps=1e-5;
step0=0.5;
step=step0;
itmax=10  % amount of how many times the direction of movement can be changed
x=[-3;4]; % start          
for iii=1:itmax

grad=gradient(x); 
target1=target(x);
for j=1:30  % moving that direction, where the function is decreasing
    deltax=grad/norm(grad)*step; 
    x=x-deltax';
    target2=target(x);
    if target2 > target1, x=x+deltax'; 
    step=step/10; 
    else,  target1=target2;
    end   
end
step=step0;

precision=norm(target1);
fprintf(1,'\n direction %d  precision %g',iii,precision);
if precision < eps, fprintf(1,'\n solution x =');
fprintf(1,'  %g',x); 
break;
elseif iii == itmax,fprintf(1,'\n ****precision could not be reached. Last 
point x =');
fprintf(1,'  %g',x); break;
end

end
  return
end

Итак, чтобы реализовать алгоритм наискорейшего спуска для решения нелинейных уравнений в C #, все, что мне нужно сделать, это как-то определить, что функция target(x) из MATLAB в моей программе на C #, и я не знаю, как это сделать, может быть, кто-томожет мне помочь?

...