Como minimizar uma função não-linear com restrições em c#?

0

Pergunta

Eu gostaria de minimizar a seguinte função

enter image description here

com restrições

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

em C#. Eu tentei fazê-lo com Math.Net's de Newton Método, mas eu não consigo descobrir como fazê-lo. Como posso minimizar a função por meio de programação em C# para determinada $F_1, F_2$?

Atualização: Após o comentário do @MinosIllyrien eu tentei o seguinte, mas eu não obter a sintaxe:

_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;
}

Isso não funciona, porque FindMinimum método requer IObjectiveFunction como função e não IScalarObjectiveFunction...

Atualização 2: Eu tentei uma solução a partir 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);

Isso gera o erro: *o operador não pode ser usado para "Variável" e "Variável". Alguém alguma idéia?

1

Melhor resposta

0

w₁2 + w₂2 = 1, basicamente, é o círculo unitário. O círculo da unidade também pode ser descrito pela seguinte equação paramétrica:

(cos t, sin t)

Em outras palavras, para cada par (w ₁ , w ₂ ), há um ângulo de t para o qual w ₁ = cos t e w ₂ = sin t.

Com essa substituição, a função torna-se:

y = F ₁ cos t + F ₂ pecado t

w ₁ ≥ 0, w ₂ ≥ 0 restringe t para um único quadrante. Isso deixa você com muito simples restrição, que consiste de uma única variável:

0 ≤ t ≤ ½π

Pelo jeito, a função pode ser simplificado para:

y = R cos(t - α)

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

Este é um simples de onda senoidal. Sem a restrição em t, a sua gama seria [-R, R], fazendo o mínimo -R. Mas a restrição limita o domínio e, assim, o intervalo:

  • Se F ₁ < 0 e F ₂ < 0, então o mínimo é em w ₁ = - F ₁ / R, w ₂ = - F ₂ / R, com y = -R
  • Para 0 < F ₁ ≤ F ₂ , um mínimo é em w ₁ = 1, w ₂ = 0, com y = F
  • Para 0 < F ₂ ≤ F ₁ , um mínimo é em w ₁ = 0, w ₂ = 1, com y = F

Notas:

  • se F ₁ = F ₂ > 0, então você tem dois mínimos.
  • se F ₁ = F ₂ = 0, então y é apenas plana a zero em todos os lugares.

Em código:

_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

Você também vai precisar de verificar a sua w1 e w2 são não-negativos. Se não, a solução será (0,1) ou (1,0).
Mark Pattison

@MarkPattison Obrigado por apontar isso; eu editei minha resposta em conformidade.
Ruud Helderman

Em outros idiomas

Esta página está em outros idiomas

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