动态定义函数

San*_*era 5 c# function dynamic

我正在测试Extreme Optimization C#库,正是非线性系统求解器.作为一个例子,我发现我必须以下列形状传递非线性系统的求解器:

Func<Vector, double>[] f = {
  x => Math.Exp(x[0])*Math.Cos(x[1]) - x[0]*x[0] + x[1]*x[1],
  x => Math.Exp(x[0])*Math.Sin(x[1]) - 2*x[0]*x[1]
};
Run Code Online (Sandbox Code Playgroud)

问题是我尝试解决的系统无法在设计时指定.它是由负载流方程组成的非线性系统,用于求解交流电(AC)的电路.方程由许多变量组成,这些变量取决于网格中节点的数量,由用户指定,方程式如下:

在此输入图像描述

所以基本上我每个节点有2个方程,这是2*n方程,由于它们依赖于i,j索引,因此不能在单行中组成,因此我必须有2个嵌套for循环来创建P和Q方程.

有没有办法创造Func<Vector, double>[] f = { equation system of variable lenght };

在运行时看到了动态创建函数的帖子,但它没有回答我的问题(我相信)

//************************编辑**************************************

方程的创建是这样的:

For (int i=0; i< n; i++){
   double A=0.0;
   double B=0.0;
   For (int j=0; j< n; j++){
      A+= G[i,j]*Math.Cos(Theta[i,j]) + B[i,j]*Math.Sin(Theta[i,j])
      B+= G[i,j]*Math.Sin(Theta[i,j]) + B[i,j]*Math.Cos(Theta[i,j])
   }
   P[i]=V[i]*A;
   Q[i]=V[i]*B;
}
Run Code Online (Sandbox Code Playgroud)

当然A和B包含变量,而这个循环配方就没有多大意义了.

提前致谢.

Lua*_*aan 2

您正在传递一个函数数组,因此应该很容易执行您想要的操作:

Func<Vector, double>[] funcs = new Func<Vector, double>[howeverManyYouWant];

for (var i = 0; i < howeverManyYouWant; i++)
{
  var someConstant = 0.1f * i; // You need to define "constants" in scope

  funcs[i] = x => Math.Exp(x[0])*Math.Cos(x[1]) - x[0]*x[0] + x[1]*x[1];
}
Run Code Online (Sandbox Code Playgroud)

然后您可以根据需要传递该数组。

如果无法提前确定数组的大小,可以使用List<Func<Vector, double>>而不是数组,然后ToArray()在准备好时调用它。

编辑:我刚刚意识到你实际上并没有传递Expression<Func<...>>- 这使得一切变得更加简单,因为你可以在你传递的函数中使用 for 循环:

List<Func<Vector, double>> funcs 
  = new List<Func<Vector, double>>(howeverManyYouWant * 2);

for (var i = 0; i < howeverManyYouWant; i++)
{
  // P[i] equation
  funcs.Add
  (
    x => 
    {
      var a = 0d;

      for (var j = 0; j < howeverManyYouWant; j++)
      {
        a += G[i, j] * Math.Cos(Theta[i, j]) + B[i, j] * Math.Sin(Theta[i, j]);
      }

      return x[i] * a;
    }
  );

  // Add your Q[i] equation here the same way.
  funcs.Add(...);
}
Run Code Online (Sandbox Code Playgroud)

您必须修改它以真正适合您的情况,因为我不知道如何调用 func 数组,传递给函数的内容,您想要作为常量或变量的内容等。(我刚刚替换在本例Vx),但它确实展示了基本思想。

当然,您需要引用x 某个地方,否则您显然可以预先计算该值 - 但这几乎没有帮助:)

鉴于此,我不知道这是否是您所追求的。您必须指定什么应该被视为常量,什么被传递给函数等等。