C# 动态定义函数
我正在测试极端优化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
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(...);
}