поэтому у меня есть алгоритм наискорейшего спуска для решения нелинейных уравнений в 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 #, и я не знаю, как это сделать, может быть, кто-томожет мне помочь?