Java source code of 'jhplot.math.Complex'

package jhplot.math;

import java.io.Serializable;
import java.lang.Math;

/**
 * Complex implements a complex number and defines complex arithmetic and
 * mathematical functions Last Updated February 27, 2001 Copyright 1997-2001
 * 
 * @version 1.0
 * @author Andrew G. Bennett, S.Chekanov
 */
public class Complex extends Object implements Cloneable, Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private double x, y;


	
	/**
	 * Constructs the complex number z = u + i*v
	 * 
	 * @param u
	 *            Real part
	 * @param v
	 *            Imaginary part
	 */
	public Complex(double u, double v) {
		x = u;
		y = v;
	}

	/**
	 * Real part of this Complex number (the x-coordinate in rectangular
	 * coordinates).
	 * 
	 * @return Re[z] where z is this Complex number.
	 */
	public double real() {
		return x;
	}

	/**
	 * Imaginary part of this Complex number (the y-coordinate in rectangular
	 * coordinates).
	 * 
	 * @return Im[z] where z is this Complex number.
	 */
	public double imag() {
		return y;
	}

	/**
	 * Modulus of this Complex number (the distance from the origin in polar
	 * coordinates).
	 * 
	 * @return |z| where z is this Complex number.
	 */
	public double mod() {
		if (x != 0 || y != 0) {
			return Math.sqrt(x * x + y * y);
		} else {
			return 0d;
		}
	}

	/**
	 * Argument of this Complex number (the angle in radians with the x-axis in
	 * polar coordinates).
	 * 
	 * @return arg(z) where z is this Complex number.
	 */
	public double arg() {
		return Math.atan2(y, x);
	}

	/**
	 * Complex conjugate of this Complex number (the conjugate of x+i*y is
	 * x-i*y).
	 * 
	 * @return z-bar where z is this Complex number.
	 */
	public Complex conj() {
		return new Complex(x, -y);
	}

	/**
	 * Addition of Complex numbers (doesn't change this Complex number). 
* (x+i*y) + (s+i*t) = (x+s)+i*(y+t). * * @param w * is the number to add. * @return z+w where z is this Complex number. */ public Complex plus(Complex w) { return new Complex(x + w.real(), y + w.imag()); } /** * Subtraction of Complex numbers (doesn't change this Complex number).
* (x+i*y) - (s+i*t) = (x-s)+i*(y-t). * * @param w * is the number to subtract. * @return z-w where z is this Complex number. */ public Complex minus(Complex w) { return new Complex(x - w.real(), y - w.imag()); } /** * Subtraction from real part * * @param w real value for subtraction */ public Complex minusReal(double w) { return new Complex(x - w, y); } /** * Complex multiplication (doesn't change this Complex number). * * @param w * is the number to multiply by. * @return z*w where z is this Complex number. */ public Complex times(Complex w) { return new Complex(x * w.real() - y * w.imag(), x * w.imag() + y * w.real()); } /** * Returns this complex multiplied by the specified factor. * * @param k the factor multiplier. * @return this * k. */ public Complex times(double k) { this.x = x * k; this.y = y * k; return this; } /** * Returns this complex divided by the specified factor. * * @param k the factor divisor. * @return this / k. */ public Complex divide(double k) { this.x = x / k; this.y = y / k; return this; } /** * Division of Complex numbers (doesn't change this Complex number).
* (x+i*y)/(s+i*t) = ((x*s+y*t) + i*(y*s-y*t)) / (s^2+t^2) * * @param w * is the number to divide by * @return new Complex number z/w where z is this Complex number */ public Complex div(Complex w) { double den = Math.pow(w.mod(), 2); return new Complex((x * w.real() + y * w.imag()) / den, (y * w.real() - x * w.imag()) / den); } /** * Complex exponential (doesn't change this Complex number). * * @return exp(z) where z is this Complex number. */ public Complex exp() { return new Complex(Math.exp(x) * Math.cos(y), Math.exp(x) * Math.sin(y)); } /** * Principal branch of the Complex logarithm of this Complex number. * (doesn't change this Complex number). The principal branch is the branch * with -pi < arg <= pi. * * @return log(z) where z is this Complex number. */ public Complex log() { return new Complex(Math.log(this.mod()), this.arg()); } /** * Complex square root (doesn't change this complex number). Computes the * principal branch of the square root, which is the value with 0 <= arg < * pi. * * @return sqrt(z) where z is this Complex number. */ public Complex sqrt() { double r = Math.sqrt(this.mod()); double theta = this.arg() / 2; return new Complex(r * Math.cos(theta), r * Math.sin(theta)); } /** * Real cosh function (used to compute complex trig functions) * @param theta */ private double cosh(double theta) { return (Math.exp(theta) + Math.exp(-theta)) / 2; } /** * Real sinh function (used to compute complex trig functions) * @param theta */ private double sinh(double theta) { return (Math.exp(theta) - Math.exp(-theta)) / 2; } /** * Sine of this Complex number (doesn't change this Complex number).
* sin(z) = (exp(i*z)-exp(-i*z))/(2*i). * * @return sin(z) where z is this Complex number. */ public Complex sin() { return new Complex(cosh(y) * Math.sin(x), sinh(y) * Math.cos(x)); } /** * Cosine of this Complex number (doesn't change this Complex number).
* cos(z) = (exp(i*z)+exp(-i*z))/ 2. * * @return cos(z) where z is this Complex number. */ public Complex cos() { return new Complex(cosh(y) * Math.cos(x), -sinh(y) * Math.sin(x)); } /** * Hyperbolic sine of this Complex number (doesn't change this Complex * number).
* sinh(z) = (exp(z)-exp(-z))/2. * * @return sinh(z) where z is this Complex number. */ public Complex sinh() { return new Complex(sinh(x) * Math.cos(y), cosh(x) * Math.sin(y)); } /** * Hyperbolic cosine of this Complex number (doesn't change this Complex * number).
* cosh(z) = (exp(z) + exp(-z)) / 2. * * @return cosh(z) where z is this Complex number. */ public Complex cosh() { return new Complex(cosh(x) * Math.cos(y), sinh(x) * Math.sin(y)); } /** * Tangent of this Complex number (doesn't change this Complex number).
* tan(z) = sin(z)/cos(z). * * @return tan(z) where z is this Complex number. */ public Complex tan() { return (this.sin()).div(this.cos()); } /** * Negative of this complex number (chs stands for change sign). This * produces a new Complex number and doesn't change this Complex number.
* -(x+i*y) = -x-i*y. * * @return -z where z is this Complex number. */ public Complex chs() { return new Complex(-x, -y); } public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError(e.toString()); } } /** * String representation of this Complex number. * * @return x+i*y, x-i*y, x, or i*y as appropriate. */ public String toString() { if (x != 0 && y > 0) { return x + " + " + y + "i"; } if (x != 0 && y < 0) { return x + " - " + (-y) + "i"; } if (y == 0) { return String.valueOf(x); } if (x == 0) { return y + "i"; } // shouldn't get here (unless Inf or NaN) return x + " + i*" + y; } }