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)。除了矩形复数和极坐标复数是同构的,也就是说,您可以将一个转换为另一个,然后再转换回来。

这表明您不应该从常规复数继承指数复数......不同之处在于实现,即数字如何存储在内存中。换句话说,您的界面:

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.
}

这可以防止冗余字段。想想ArrayLista 和 a之间的区别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您正在尝试计算的第二个派生类中存储一个双精度值,但实际上这个值没有意义。您正在计算正确的模数和module正确的参数,fi但看起来您exponential想要

 module*exp(fi)

这并没有真正的意义。如果您想存储对于您的值正确的模数和参数的值,x并且y作为笛卡尔实部和虚部更有意义,但仅存储双精度值exponential是没有意义的,除非您从问题中省略了某些内容。

看起来你真的会更好,要么只从你的reim变量中计算模数和参数,然后从函数中返回它们,要么将它们存储为额外的成员变量。

于 2012-11-20T21:30:23.007 回答