5

昨日、z ^ nを計算できるこのコードを作成しました。ここで、zは複素数、nは任意の正の整数です。

--snip--
float real = 0;
float imag = 0;

// d is the power the number is raised to [(x + yi)^d]
for (int n = 0; n <= d; n++) {
  if (n == 0) {
    real += pow(a, d);
  } else { // binomial theorem      
    switch (n % 4) {
      case 1: // i
        imag += bCo(d, n) * pow(a, d - n) * pow(b, n);
        break;
      case 2: // -1
        real -= bCo(d, n) * pow(a, d - n) * pow(b, n);
        break;
      case 3: // -i
        imag -= bCo(d, n) * pow(a, d - n) * pow(b, n);
        break;
      case 0: // 1
        real += bCo(d, n) * pow(a, d - n) * pow(b, n);
        break;
    }
  }
}
--snip--

int factorial(int n) {
  int total = 1;
  for (int i = n; i > 1; i--) { total *= i; }
  return total;
}

// binomial cofactor
float bCo(int n, int k) {
  return (factorial(n)/(factorial(k) * factorial(n - k)));
}

二項定理を使用してz^nを展開し、各項を虚数の累乗に応じて実数と虚数のどちらとして扱うかを知っています。

私がやりたいのは、z ^ nを計算できるようにすることです。ここで、nは任意の正の実数(分数)です。二項定理は整数ではない累乗に使用できることは知っていますが、複素数の処理方法がよくわかりません。i ^ 0.1には実数と虚数のコンポーネントがあるため、それを実数または虚数の変数に並べ替えることはできません。また、それを計算できるものをプログラムする方法もわかりません。

これを達成するのに役立つアルゴリズム、またはこれを可能にする複素数を処理するためのより良い方法を知っている人はいますか?

ああ、私はJavaを使用しています。

ありがとう。

4

4 に答える 4

7

まず、複数のソリューションが存在する可能性があります。ウィキペディア: 複素数/べき乗を参照してください。

同様の考察から、実数の場合と同様に有理実数べき乗を定義できることがわかります。そのため、z 1/nは z のn :乗根です。根は一意ではないため、複雑な累乗が多値であることはすでに明らかです。したがって、累乗を慎重に扱う必要があります。たとえば、(8 1/3 ) 4 ≠ 16 です。これは、8 の立方根が 3 つあるためです。したがって、8 4/3に短縮されることが多い式は、可能な限り単純です。

極座標表記に分解して、そこから進むべきだと思います。

于 2010-06-23T06:51:13.513 に答える
5

ぜのような複素数を考えてみましょうz = x + iy

したがって、極形式ぜは =re^ithetaです。ここで、

  • rの大きさはぜ、または平方根(x2+y2)、および
  • シータですx 上の atan y

これが完了したら、DeMoivre の定理z^nを使用して次のように計算できます。

z^n = r^ne^in theta

またはもっと簡単に

z^n = r^n (cos (n シータ) + i sin(n シータ))

詳細については、複素数の極形式を参照してください。

于 2010-06-23T07:11:52.973 に答える
0

n が整数ではなく、a が正の数でない場合、a^n は正しく定義されていません。

z が複素数の場合でも、z^a = exp(a log z) に意味を与えることができますが、z が正の数でない場合、log z が何を意味するかを理解する必要があります。

そして、唯一無二の選択肢はありません

于 2010-06-23T18:48:17.933 に答える
0

私は数学が苦手なので、あなたの課題を間違って理解していたのかもしれません。しかし、私が得た限りでは、Apache Commons の数学が役に立ちます: http://commons.apache.org/math/userguide/complex.html

例:

Complex first  = new Complex(1.0, 3.0);
Complex second = new Complex(2.0, 5.0);

Complex answer = first.log();        // natural logarithm.
        answer = first.cos();        // cosine
        answer = first.pow(second);  // first raised to the power of second
于 2010-06-23T06:49:44.303 に答える