我正在尝试编写一个应用数学程序来计算复平面中的轮廓积分。对于初学者,我想为梯形方法编写一个算法,但我有点难以理解它会是什么样子。毕竟 - 我们通常将梯形方法视为 2D 图,这里我们有 f: C -> C 所以我们说的是 4D。
最终我希望用这个算法计算残差,但是当我尝试最简单的简单 f(z) = 1/z 时,轮廓为围绕原点的半径为 1 的圆,我在 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;
}
在这里,'function' 只计算 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) 的数字。如果您有任何建议,我将不胜感激。
谢谢。