如何最大限度地减少非线性函数的限制,在c#?

0

的问题

我想尽量减少下功能

enter image description here

与限制

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

在C#。 我试着做 Math.Net's牛顿的方法,但是我不能找出如何做到这一点。 我怎样才能最大限度地减少功能,以编程方式在C#对于给予美元F_1,F_2$?

更新: 后评论的@MinosIllyrien我试过了以下,但我不懂的语法:

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

这不起作用,因为FindMinimum方法需要IObjectiveFunction作为功能和不IScalarObjectiveFunction...

更新2: 我尝试解决方案,从 谷歌:

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);

这将引发的错误*运营商不能用于"可变"和"可变". 某人的任何想法?

1

最好的答案

0

w₁2+ w₂2=1基本 单元的圆圈. 该单元的圈子也可以通过下面说明的 参数方程式:

(因为 t,罪 t)

换句话说,每一个对(w₁, w₂), 有一个角度 tw₁=cos tw₂=sin t.

与替代、功能变为:

y = F₁因为 t + F₂罪 t

w₁≥0, w₂≥0限制 t 为一个象限。 这让你有一个非常简单的约束,即由一个单一的变量:

0≤ t ≤½π

顺便说一句,该功能可以 简化

y = R cos(t -α)

在那里 R =√(F₁2+ F₂2)和α= atan2(F₂, F₁)

这是一个简单的正弦波。 没有约束 t,其范围将[-R, R],使得最小R. 但是约束的限制的领域,从而可的范围:

  • 如果 F₁<0和 F₂<0,则最低的是在 w₁=-F₁/ R, w₂=-F₂/ Ry =-R
  • 为0< F₁≤ F₂,最低的是在 w₁=1, w₂=0, y = F
  • 为0< F₂≤ F₁,最低的是在 w₁=0, w₂=1, y = F

注:

  • 如果 F₁= F₂>0,然后你有两个最小值。
  • 如果 F₁= F₂=0,然后 y 只是扁零无处不在。

在代码:

_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

你还需要检查两w1和w2非消极的。 如果不是,该解决方案将是(0,1)或(1,0)的.
Mark Pattison

@MarkPattison谢谢你指出这一;我编辑我的答案相应。
Ruud Helderman

其他语言

此页面有其他语言版本

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