Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态定义函数_C#_Function_Dynamic - Fatal编程技术网

C# 动态定义函数

C# 动态定义函数,c#,function,dynamic,C#,Function,Dynamic,我正在测试极端优化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] }; Func[]f={ x=>Math.Exp(x[0])*Math.Cos

我正在测试极端优化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]
};
Func[]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]
};
问题是我试图解决的系统无法在设计时指定。它是一个由潮流方程组成的非线性系统,用于求解交流电路。方程由许多变量组成,这些变量取决于用户指定的网格中的节点数,方程如下:

基本上每个节点有2个方程,这是2*n方程,不能在一条直线上合成,因为它们依赖于I,j指数,因此我必须有2个嵌套的for循环来创建p和Q方程

有没有办法创建
Func[]f={可变长度方程组}

我看过这篇文章,但它没有回答我的问题(我相信)

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

方程式的创建是这样的:

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;
}
For(int i=0;i
当然,A和B包含变量,而这个循环公式本身没有什么意义


提前感谢。

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

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];
}
您必须修改它以真正适合您的情况,因为我不知道func数组是如何调用的,传递给函数的是什么,您想要什么作为常量或变量等等(在本例中,我刚刚将
V
替换为
x
),但它确实显示了基本思想

当然,您可能希望在某个地方引用
x
,否则您显然可以预先计算该值,但这几乎没有什么帮助:)


考虑到这一点,我不知道这是否是你想要的。您必须指定什么应该被视为常量,什么被传递给函数等等。

您能再举一些例子说明什么在变化吗?例如,显示当前的2个嵌套For循环…是的,因此常数是G和B,变量可以是(V,θ)或(Q,θ),具体取决于节点类型,但为了简单起见,变量是V和θ。如果我有3个节点,我将有6个方程P1,Q1,P2,Q2,P3,Q3和6个未知数(V1,θ1,V2,θ2,V3,θ3),但是节点的数量是在运行时指定的,您可能需要构建一个基本的DSL。。。。你能更新这个问题来包含你现有的代码吗?2嵌套的for loop我想我明白了,如果我能应用这个,我会试试。Luaan,你会如何定义求和,我对这类函数是新手,我不知道如何实现“for(int j=0;j表达式;然而,我很惊讶,这可能太复杂了,EO无法快速处理-你应该能够更好地近似解。这个问题叫做功率流,它是用牛顿-拉斐逊方程组(以及其他方法)来解决的,当然没有简单的方法来解决它。@user3020849是的,这就是我发现的。您希望EO图书馆如何帮助您?找到解决办法究竟能做什么?
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(...);
}