我想寫一個應用數學程序來計算複平面中的輪廓積分。對於初學者,我想寫一個梯形方法的算法,但我有點困惑,理解那將是什麼樣子。畢竟 - 我們通常認爲梯形方法與二維圖形相同,在這裏我們有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