Comment minimiser une fonction non linéaire avec contraintes en c#?

0

La question

Je tiens à minimiser la fonction suivante

enter image description here

avec des contraintes

$$w_i \geq 0, \sqrt{w_1^2 + w_2^2} = 1$$

en C#. J'ai essayé de le faire avec Math.Net s'Méthode de Newton, mais je ne peux pas comprendre comment le faire. Comment puis-je réduire la fonction par programmation en C# pour $F_1, F_2$?

Mise à jour: Après le commentaire de @MinosIllyrien j'ai essayé le suivant, mais je n'ai pas la syntaxe:

_f1 = 0.3; // Global fields.
_f2 = 0.7;

var minimizer = new NewtonMinimizer(1E-4, 100, false);
var objectiveFunction = ObjectiveFunction.ScalarDerivative(FunctionToMinimize, GradientOfFunctionToMinimize);
var firstGuess = CreateVector.DenseOfArray(new[] {0.5});
var minimalWeight1 = minimizer.FindMinimum(objectiveFunction, firstGuess).MinimizingPoint;

private double GradientOfFunctionToMinimize(double w1){
  return _f1 - (w1 * _f2) / Math.Sqrt(1 - Math.Pow(w1, 2));
}

private double FunctionToMinimize(double w1){
  return w1 * _f1 + Math.Sqrt(1 - Math.Pow(w1, 2)) * _f2;
}

Cela ne fonctionne pas, parce que FindMinimum méthode nécessite IObjectiveFunction comme fonction et pas IScalarObjectiveFunction...

Mise à jour 2: J'ai essayé la solution de Google:

var solver = Solver.CreateSolver("GLOP");
Variable w1 = solver.MakeNumVar(0.0, double.PositiveInfinity, "w1");
Variable w2 = solver.MakeNumVar(0.0, double.PositiveInfinity, "w2");

solver.Add(Math.Sqrt(w1*w1 + w2*w2) == 1);

Cela lève l'erreur *-opérateur ne peut être utilisé pour "Variable" et "Variable". Quelqu'un à des idées?

1

La meilleure réponse

0

w₁2 + w₂2 = 1 est essentiellement le cercle unité. Le cercle unité peut aussi être décrit par la suite équation paramétrique:

(cos t, sin t)

En d'autres termes, pour chaque paire (w ₁ , w ₂ ), il y a un angle de t pour laquelle w ₁ = cos t et w ₂ = sin t.

Avec cette substitution, la fonction devient:

y = F ₁ cos t + F ₂ sin t

w ₁ ≥ 0, w ₂ ≥ 0 limite t à un seul quadrant. Cela vous laisse avec une très simple contrainte, qui se compose d'une seule variable:

0 ≤ t ≤ ½π

Par ailleurs, la fonction peut être simplifié à:

y = R cos(t - α)

R = √(F₁2 + F₂2) et α = atan2(F ₂ , F ₁ )

C'est une simple onde sinusoïdale. Sans la contrainte sur les t, sa gamme serait [-R, R], en faisant le minimum -R. Mais la contrainte des limites du domaine et de ce fait la gamme:

  • Si F ₁ < 0 et F ₂ < 0, alors le minimum est au w ₁ = - F ₁ / R, w ₂ = - F ₂ / R, avec y = -R
  • Pour 0 < F ₁ ≤ F ₂ , un minimum est au w ₁ = 1, w ₂ = 0, avec y = F
  • Pour 0 < F ₂ ≤ F ₁ , un minimum est au w ₁ = 0, w ₂ = 1, y = F

Notes:

  • si F ₁ = F ₂ > 0, alors vous avez deux minima.
  • si F ₁ = F ₂ = 0, alors y est tout plat de zéro partout.

Dans le code:

_f1 = 0.3;
_f2 = 0.7;

if (_f1 == 0.0 && _f2 == 0.0) {
    Console.WriteLine("Constant y = 0 across the entire domain");
}
else if (_f1 < 0.0 && _f2 < 0.0) {
    var R = Math.sqrt(_f1 * _f1 + _f2 * _f2);
    Console.WriteLine($"Minimum y = {-R} at w1 = {-_f1 / R}, w2 = {-_f2 / R}");
}
else {
    if (_f1 <= _f2) {
        Console.WriteLine($"Minimum y = {_f1} at w1 = 1, w2 = 0");
    }
    if (_f1 >= _f2) {
        Console.WriteLine($"Minimum y = {_f2} at w1 = 0, w2 = 1");
    }
}
2021-11-26 10:11:03

Vous aurez également besoin de vérifier que les deux w1 et w2 sont non-négatives. Si non, la solution sera soit (0,1) ou (1,0).
Mark Pattison

@MarkPattison Merci de souligner ce point; j'ai édité ma réponse en conséquence.
Ruud Helderman

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................