5

私は次の問題を抱えています:

次のクラスComplex(複素数を表す)を拡張し、指数形式のフィールドを追加する必要があります。さらに、Complexのメソッドをオーバーロードします。

class Complex{
public double re;
public double im;

public Complex(double r, double i){
    re =r;
    im = i;
}

public Complex add(Complex a,Complex b){
    return new Complex(a.re + b.re,a.im + b.im );
}

public Complex sub(Complex a,Complex b){
    return new Complex(a.re - b.re,a.im - b.im);
}

//more code
}

私のクラスは次のようなものです

class ComplexE extends Complex{
   public double exponential;
    public ComplexE(double a, double b){
        re=a;
        im = b;
    }
    public ComplexE(double _exp){
        super(0,0);
        this.exponential = _exp;
    }

   public void setExpFromComplex(Complex comp){
    double module = Math.sqrt(Math.pow(comp.re,2) + Math.pow(comp.im,2));
    double fi = Math.atan2(comp.re,comp.im);
    this.exponential = module * Math.pow(Math.E, fi);
   } 

   public ComplexE add(ComplexE a,ComplexE b){
        return new ComplexE(a.exponential + b.exponential );
    }

}

私の質問は次のとおりです:私はそれを正しくやっていますか?指数形式を見つける私の方法は正しいですか?

編集:私が使おうとした数学的な方法は次のとおりです。

z = |z|*(cos(phi) + i*sin(phi)) = |z|*e^(i*phi).
4

2 に答える 2

6

あなたにはたくさんの間違いがあります。まず、指数関数で極座標を意味すると仮定しますr*e^(i*theta)。長方形の複素数と複素数の複素数がISOMORPHICであることを除いて、つまり、一方を他方に変換したり、元に戻したりすることができます。

これは、指数複素数が通常の複素数から継承されるべきではないことを示唆しています...違いは実装、つまり数値がメモリに格納される方法にあります。言い換えれば、あなたのインターフェースは:

public interface IComplex {
    public double getReal();
    public double getImag();
    public double getR();
    public double getTheta();
    public IComplex add(IComplex first, IComplex second);
    public IComplex sub(IComplex first, IComplex second);
    // Etc.
}

そして長方形の実装:

public class RectComplex implements IComplex {
    private double realPart; // note privacy... use getters and setters
    private double imagPart;

    public RealComplex (double real, double imag) {
        realPart = real;
        imagPart = imag;
    }

    public double getReal() {
        return realPart;
    }

    public double getR() {
        return Math.sqrt(realPart * realPart + imagPart * imagPart);
    }

    // Etc.
}

そして指数関数的な実装:

public class ExpComplex implements IComplex {
    private double r;
    private double theta;

    public double getReal() {
        return r * Math.cos(theta);
    }

    public double getR() {
        return r;
    }

    // Etc.
}

これにより、冗長なフィールドが防止されます。ArrayListとの違いについて考えてくださいLinkedList。これらは両方ともリストです(上記は両方とも複素数です)が、実装の観点からはまったく異なる動作をします。しかし、これらのクラスを使用するコードは気にしませんが、おそらくパフォーマンスに基づいて正しいコードを選択します。わかる?

于 2012-11-20T21:29:27.457 に答える
5

これは本当に意味がありません。指数形式は、複素数を表現するための単なる代替方法です。例えば

 z = x + iy

は、ファーストクラスで使用する標準の実数および虚数のコンポーネント表現です。指数形式は

 z = r * exp(i * theta)

ここrで、はモジュラスでありtheta、は引数です。

 r = sqrt(x*x + y*y)

 z = r*( cos(theta) + i*sin(theta))

基本的に、これはデカルト座標を同等の極座標に変換するだけです。

exponential計算しようとしていると呼ばれる2番目の派生クラスにdoubleを格納していますが、実際にはこの値は無意味です。モジュラスをmodule正しく計算し、引数を計算してfiいますがexponential

 module*exp(fi)

これは本当に意味がありません。の値に正しいモジュラスと引数の値をxデカルトy実数および虚数成分として保存する場合は、より意味がありexponentialますが、質問から何かを省略しない限り、doubleだけを保存しても意味がありません。

reim変数からモジュラスと引数を計算して関数から返すか、追加のメンバー変数として保存する方が本当に良いようです。

于 2012-11-20T21:30:23.007 に答える