我有以下问题:
我需要扩展以下类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
}
Run Code Online (Sandbox Code Playgroud)
我的课就像是跟着
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 );
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:我做得对吗?我找到指数形式的方法是否正确?
编辑:我尝试使用的数学方法是:
z = |z|*(cos(phi) + i*sin(phi)) = |z|*e^(i*phi).
Run Code Online (Sandbox Code Playgroud)
你有很多错误.首先,我假设你指的是极坐标,即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.
}
Run Code Online (Sandbox Code Playgroud)
和矩形实现:
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.
}
Run Code Online (Sandbox Code Playgroud)
和指数实现:
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.
}
Run Code Online (Sandbox Code Playgroud)
这可以防止冗余字段.想想ArrayLista和a 之间的区别LinkedList.它们都是列表,(上面都是复数),但它们与实现的角度完全不同.但是任何使用这些类的代码都不会关心,但他们可能会根据性能选择正确的代码.合理?
这没有多大意义.指数形式只是表达复数的另一种方式.例如
z = x + iy
Run Code Online (Sandbox Code Playgroud)
是您在第一堂课中使用的标准真实和虚构组件表示.指数形式是
z = r * exp(i * theta)
Run Code Online (Sandbox Code Playgroud)
其中r是模量和theta是参数,其中
r = sqrt(x*x + y*y)
Run Code Online (Sandbox Code Playgroud)
和
z = r*( cos(theta) + i*sin(theta))
Run Code Online (Sandbox Code Playgroud)
基本上这只是将笛卡尔坐标转换为等效极坐标表示.
您正在exponential尝试计算的第二个派生类中存储一个double,但实际上这个值是没有意义的.你module正确地计算模数和参数,fi但看起来你想exponential成为
module*exp(fi)
Run Code Online (Sandbox Code Playgroud)
这不是真正有意义的.如果你想存储模数和参数的值,这些值对于你的值是正确的,x并且y作为笛卡尔实部和虚部的组合更有意义,但只存储一个双exponential精度是没有意义的,除非你从问题中省略了一些东西.
你可能真的会更好地从你re和im变量计算模数和参数,并从函数返回它们或将它们存储为额外的成员变量.
| 归档时间: |
|
| 查看次数: |
1775 次 |
| 最近记录: |