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包含变量,而这个循环配方就没有多大意义了.
提前致谢.
您正在传递一个函数数组,因此应该很容易执行您想要的操作:
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 数组,传递给函数的内容,您想要作为常量或变量的内容等。(我刚刚替换在本例V
中x
),但它确实展示了基本思想。
当然,您需要引用x
某个地方,否则您显然可以预先计算该值 - 但这几乎没有帮助:)
鉴于此,我不知道这是否是您所追求的。您必须指定什么应该被视为常量,什么被传递给函数等等。