取负数Func <double [],double>

月亮骑士

我有一个数学函数-exp{-(x - 1)²} - exp{-0.5*(y - 2)²},使用该函数及其导数将其传递给BFGS算法

Func<double[], double> f = (x) => 
    Math.Exp(-Math.Pow(x[0] - 1, 2)) + Math.Exp(-0.5 * Math.Pow(x[1] - 2, 2));

Func<double[], double[]> g = (x) => new double[] 
{
    // df/dx = -2 * e^(-(x - 1)²)(x - 1).
    -2 * Math.Exp(-Math.Pow(x[0] - 1, 2)) * (x[0] - 1),

    // df/dy = -e^(-1/2(y - 2)²) * (y - 2).
    -Math.Exp(-0.5 * Math.Pow(x[1] - 2, 2)) * (x[1] - 2)
};

现在,已经对该算法进行了编码,以最小化传递给它的函数,并且效果很好。但是,我想添加使功能最大化的功能。为此,我将仅通过对函数和导数取反来包装最小化代码,并将结果传递给最小化代码。

算法的ctor。

public BroydenFletcherGoldfarbShanno(int numberOfVariables, 
    Func<double[], double> function, 
    Func<double[], double[]> gradient, 
    Random random = null)
        : this(numberOfVariables, random)
{
    if (function == null)
        throw new ArgumentNullException("function");
    if (gradient == null)
        throw new ArgumentNullException("gradient");
    this.Function = function;
    this.Gradient = gradient;
}

初始化Function/ Gradient此类有一个Minimize方法,现在我添加了

public double Maximize()
{
     // Negate the function.
     Func<double[], double> f;
     f = (x) => -this.Function(x);
     this.Function = f;

     // Negate the derivatives.
     ...
}

我的问题是我怎样才能只取消this.Function/this.Gradient对象?我在上面所做的事情抛出了一个错误StackOverflowException

谢谢你的时间。


编辑。带有函数声明

[TestMethod]
public void LBFGSMaximisationTest()
{
    // Suppose we would like to find the maximum of the function:
    // f(x, y) = exp{-(x - 1)²} + exp{-(y - 2)²/2}.
    // First we need write down the function either as a named
    // method, an anonymous method or as a lambda function.
    Func<double[], double> f = (x) =>
    Math.Exp(-Math.Pow(x[0] - 1, 2)) + Math.Exp(-0.5 * Math.Pow(x[1] - 2, 2));

    // Now, we need to write its gradient, which is just the
    // vector of first partial derivatives del_f / del_x.
    // g(x, y) = { del f / del x, del f / del y }.
    Func<double[], double[]> g = (x) => new double[] 
    {
        // df/dx = -2 * e^(-(x - 1)²)(x - 1).
        -2 * Math.Exp(-Math.Pow(x[0] - 1, 2)) * (x[0] - 1),

        // df/dy = -e^(-1/2(y - 2)²) * (y - 2).
        -Math.Exp(-0.5 * Math.Pow(x[1] - 2, 2)) * (x[1] - 2)
    };

    // Finally, we can create the L-BFGS solver, passing the functions as arguments.
    Random r = new SystemRandomSource(0, true);
    BroydenFletcherGoldfarbShanno lbfgs = new BroydenFletcherGoldfarbShanno(
        numberOfVariables: 2, function: f, gradient: g, random: r);

    // And then minimize the function.
    double maxValue = lbfgs.Maximize();
    ...
马克·格雷韦尔

是的,它会的:

f = (x) => -this.Function(x);
this.Function = f;

假设这Function是一个Funct<double[],double>在班级上的语言,基本上就是在写:

this.Function = (x) => -this.Function(x);

是的,那将会爆炸。这是因为this.Function是通过捕获的作用域延迟的。我怀疑您的意思是:

Func<double[], double> oldFunc = this.Function;
this.Function = (x) => -oldFunc(x);

现在,我们将旧函数捕获到委托中,并使用捕获的委托而不是递归调用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

取负数Func <double [],double>

来自分类Dev

取反Func <double [],double []>

来自分类Dev

对Func <double,double>对象的数组求和

来自分类Dev

如何#define调用(Double X)到func2(double X)

来自分类Dev

double(double)和double(*)(double)有什么区别

来自分类Dev

Java中的“ double,Double,HashSet”

来自分类Dev

将double []包装为Double []

来自分类Dev

C#:double [] []和double [,]

来自分类Dev

double *数组,vs double *指针

来自分类Dev

Java中的“ double,Double,HashSet”

来自分类Dev

“ [Double?]”不能转换为“ [Double]”

来自分类Dev

将 [[[Double]]] 投射回 [Double]

来自分类Dev

Func T,U,double等。作为构造函数中的参数

来自分类Dev

错误:无法将“ <lambda(double)>”转换为“ double(*)(double)”

来自分类Dev

在java中将float除以double与将double除以double

来自分类Dev

Swift中的double / float取整(2位数字)

来自分类Dev

如何通过在Scala中从Double取整来创建BigInt

来自分类Dev

Difference between double and DOUBLE in C++

来自分类Dev

C ++中double和DOUBLE之间的区别

来自分类Dev

在C#中将double []转换为double *

来自分类Dev

错误:函数“ atomicAdd(double *,double)”已经定义

来自分类Dev

double [] []不等于** double吗?

来自分类Dev

排序Double Double HashMap Java /处理

来自分类Dev

无法将double [] []转换为double **

来自分类Dev

获取无效的double,但错误显示正确的double

来自分类Dev

添加double.MaxValue + double.MaxValue

来自分类Dev

Flutter double解析错误,无效double

来自分类Dev

将double数组绑定为double *&

来自分类Dev

获取无效的double,但错误显示正确的double

Related 相关文章

热门标签

归档