我想写一个应用数学程序来计算复平面中的轮廓积分。对于初学者,我想写一个梯形方法的算法,但我有点困惑,理解那将是什么样子。毕竟 - 我们通常认为梯形方法与二维图形相同,在这里我们有f:C - > C,所以我们说的是4D。轮廓整合算法C++
最终我希望用这个算法计算残基,但是当我尝试简单的f(z)= 1/z的轮廓作为围绕原点的半径为1的圆的最简单时,这是我应该得到的)。这里是我的梯形法代码:
complexCartesian trapezoid(complexCartesian *c1, complexCartesian *c2)
{
complexCartesian difference = *c1 - *c2;
complexCartesian ans(0.5 * (function(c1).real + function(c2).real) *
difference.mag(),
0.5 * (function(c1).imag + function(c2).imag) *
difference.mag());
return ans;
}
在这里,“功能”只计算F(Z)= 1/Z(我敢肯定,这是正确完成),并complexCartesian是我在复杂点类a + bi格式:
class complexCartesian
{
public:
double real;
double imag;
complexCartesian operator+ (const complexCartesian& c) const;
complexCartesian operator- (const complexCartesian& c) const;
complexCartesian(double realLocal, double imagLocal);
double mag(); //magnitude
string toString();
complexPolar toPolar();
};
我感觉很自信,每个函数都在做它应该做的事情。 (我知道有一个复杂数字的标准类,但我想我会写自己的练习)。要真正整合,我使用以下命令:
double increment = .00001;
double radius = 1.0;
complexCartesian res(0,0); //result
complexCartesian previous(1, 0); //start the point 1 + 0i
for (double i = increment; i <= 2*PI; i+=increment)
{
counter++;
complex cur(radius * cos(i), radius * sin(i));
res = res + trapezoid(&cur, &previous);
previous = cur;
}
cout << "computed at " << counter << " values " << endl;
cout << "the integral evaluates to " << res.toString() << endl;
当我只沿实轴整合,或当我用恒定替换我的功能,我得到正确的结果。否则,我倾向于获得10 ^( - 10)至10 ^( - 15)的数量级。如果您有任何建议,我会非常感激他们。
谢谢。
自从我进行轮廓积分以来,这已经有一段时间了,但是上面的积分有没有机会评估为0呢? – templatetypedef
1/z在原点有一个极点,这个极点的余数是1(lim_ {z \到0} z(1/z)= 1)。因此积分应该由残差定理估计为2(pi)(i)。 – alexvas
啊,好的。谢谢你让我知道!我很好奇,如果这可能只是数值不稳定。 – templatetypedef