複素平面の周回積分を計算する応用数学プログラムを書こうとしています。手始めに、台形法のアルゴリズムを書きたかったのですが、それがどのようになるかを理解するのに少し固執しています。結局のところ、私たちは通常、2Dグラフの場合は台形法を考えますが、ここではf:C-> Cであるため、4Dについて話します。
最終的には、このアルゴリズムで残差を計算したいと思っていますが、原点を中心に半径1の円として等高線を使用して、最も単純な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)のオーダーの数字を得る傾向があります。何か提案があれば、よろしくお願いします。
ありがとう。