You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ps...@apache.org on 2004/07/12 02:27:09 UTC

cvs commit: jakarta-commons/math/src/test/org/apache/commons/math/complex ComplexUtilsTest.java ComplexMathTest.java

psteitz     2004/07/11 17:27:09

  Added:       math/src/java/org/apache/commons/math/complex
                        ComplexUtils.java
               math/src/test/org/apache/commons/math/complex
                        ComplexUtilsTest.java
  Removed:     math/src/java/org/apache/commons/math/complex
                        ComplexMath.java
               math/src/test/org/apache/commons/math/complex
                        ComplexMathTest.java
  Log:
  Renamed ComplexMath to ComplexUtils.
  
  Revision  Changes    Path
  1.1                  jakarta-commons/math/src/java/org/apache/commons/math/complex/ComplexUtils.java
  
  Index: ComplexUtils.java
  ===================================================================
  /*
   * Copyright 2003-2004 The Apache Software Foundation.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.commons.math.complex;
  
  import org.apache.commons.math.util.MathUtils;
  
  /**
   * Implementations of various transcendental functions for
   * {@link org.apache.commons.math.complex.Complex} arguments.
   *
   * Reference:
   * <ul>
   * <li><a href="http://myweb.lmu.edu/dmsmith/ZMLIB.pdf">
   * Multiple Precision Complex Arithmetic and Functions</a></li>
   * </ul>
   *
   * @version $Revision: 1.1 $ $Date: 2004/07/12 00:27:09 $
   */
  public class ComplexUtils {
      
      /**
       * Default constructor.
       */
      private ComplexUtils() {
          super();
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/InverseCosine.html">
       * inverse cosine</a> for the given complex argument.
       * @param z the value whose inverse cosine is to be returned.
       * @return the inverse cosine of <code>z</code>.
       */
      public static Complex acos(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
  
          return Complex.I.negate().multiply(log(z.add(
              Complex.I.multiply(sqrt1z(z)))));       
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/InverseSine.html">
       * inverse sine</a> for the given complex argument.
       * @param z the value whose inverse sine is to be returned.
       * @return the inverse sine of <code>z</code>.
       */
      public static Complex asin(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
  
          return Complex.I.negate().multiply(log(sqrt1z(z).add(
              Complex.I.multiply(z))));       
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/InverseTangent.html">
       * inverse tangent</a> for the given complex argument.
       * @param z the value whose inverse tangent is to be returned.
       * @return the inverse tangent of <code>z</code>.
       */
      public static Complex atan(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
          
          
          return Complex.I.multiply(
              log(Complex.I.add(z).divide(Complex.I.subtract(z))))
              .divide(new Complex(2.0, 0.0));
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/Cosine.html">cosine</a>
       * for the given complex argument.
       * @param z the value whose cosine is to be returned.
       * @return the cosine of <code>z</code>.
       */
      public static Complex cos(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
          
          double a = z.getReal();
          double b = z.getImaginary();
          
          return new Complex(Math.cos(a) * MathUtils.cosh(b),
              -Math.sin(a) * MathUtils.sinh(b));
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/HyperbolicCosine.html">
       * hyperbolic cosine</a> for the given complex argument.
       * @param z the value whose hyperbolic cosine is to be returned.
       * @return the hyperbolic cosine of <code>z</code>.
       */
      public static Complex cosh(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
          
          double a = z.getReal();
          double b = z.getImaginary();
          
          return new Complex(MathUtils.cosh(a) * Math.cos(b),
              MathUtils.sinh(a) * Math.sin(b));
      }
      
      /**
       * Compute the
       * <a href="http://mathworld.wolfram.com/ExponentialFunction.html">
       * exponential function</a> for the given complex argument.
       * @param z the value.
       * @return <i>e</i><sup><code>z</code></sup>.
       */
      public static Complex exp(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
          
          double b = z.getImaginary();
          double expA = Math.exp(z.getReal());
          double sinB = Math.sin(b);
          double cosB = Math.cos(b);
          return new Complex(expA * cosB, expA * sinB);
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/NaturalLogarithm.html">
       * natural logarithm</a> for the given complex argument.
       * @param z the value.
       * @return ln <code>z</code>.
       */
      public static Complex log(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
  
          return new Complex(Math.log(z.abs()),
              Math.atan2(z.getImaginary(), z.getReal()));        
      }
      
      
      /**
       * Returns of value of <code>y</code> raised to the power of <code>x</code>.
       * @param y the base.
       * @param x the exponent.
       * @return <code>y</code><sup><code>z</code></sup>.
       */
      public static Complex pow(Complex y, Complex x) {
          return exp(x.multiply(log(y)));
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/Sine.html">sine</a>
       * for the given complex argument.
       * @param z the value whose sine is to be returned.
       * @return the sine of <code>z</code>.
       */
      public static Complex sin(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
          
          double a = z.getReal();
          double b = z.getImaginary();
          
          return new Complex(Math.sin(a) * MathUtils.cosh(b),
              Math.cos(a) * MathUtils.sinh(b));
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/HyperbolicSine.html">
       * hyperbolic sine</a> for the given complex argument.
       * @param z the value whose hyperbolic sine is to be returned.
       * @return the hyperbolic sine of <code>z</code>.
       */
      public static Complex sinh(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
          
          double a = z.getReal();
          double b = z.getImaginary();
          
          return new Complex(MathUtils.sinh(a) * Math.cos(b),
              MathUtils.cosh(a) * Math.sin(b));
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/SquareRoot.html">squre
       * root</a> for the given complex argument.
       * @param z the value whose square root is to be returned.
       * @return the square root of <code>z</code>.
       */
      public static Complex sqrt(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
          
          double a = z.getReal();
          double b = z.getImaginary();
          
          double t = Math.sqrt((Math.abs(a) + z.abs()) / 2.0);
          if (a >= 0.0) {
              return new Complex(t, b / (2.0 * t));
          } else {
              return new Complex(Math.abs(z.getImaginary()) / (2.0 * t),
                  MathUtils.indicator(b) * t);
          }
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/SquareRoot.html">squre
       * root of 1 - <code>z</code><sup>2</sup> for the given complex argument.
       * @param z the value.
       * @return the square root of 1 - <code>z</code><sup>2</sup>.
       */
      public static Complex sqrt1z(Complex z) {
          return sqrt(Complex.ONE.subtract(z.multiply(z)));
      }
      
      /**
       * Compute the <a href="http://mathworld.wolfram.com/Tangent.html">
       * tangent</a> for the given complex argument.
       * @param z the value whose tangent is to be returned.
       * @return the tangent of <code>z</code>.
       */
      public static Complex tan(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
          
          double a2 = 2.0 * z.getReal();
          double b2 = 2.0 * z.getImaginary();
          double d = Math.cos(a2) + MathUtils.cosh(b2);
          
          return new Complex(Math.sin(a2) / d, MathUtils.sinh(b2) / d);
      }
      
      /**
       * Compute the
       * <a href="http://mathworld.wolfram.com/HyperbolicTangent.html">
       * hyperbolic tangent</a> for the given complex argument.
       * @param z the value whose hyperbolic tangent is to be returned.
       * @return the hyperbolic tangent of <code>z</code>.
       */
      public static Complex tanh(Complex z) {
          if (z.isNaN()) {
              return Complex.NaN;
          }
          
          double a2 = 2.0 * z.getReal();
          double b2 = 2.0 * z.getImaginary();
          double d = MathUtils.cosh(a2) + Math.cos(b2);
          
          return new Complex(MathUtils.sinh(a2) / d, Math.sin(b2) / d);
      }
  }
  
  
  
  1.1                  jakarta-commons/math/src/test/org/apache/commons/math/complex/ComplexUtilsTest.java
  
  Index: ComplexUtilsTest.java
  ===================================================================
  /*
   * Copyright 2003-2004 The Apache Software Foundation.
   * 
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   * 
   *      http://www.apache.org/licenses/LICENSE-2.0
   * 
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package org.apache.commons.math.complex;
  
  import org.apache.commons.math.TestUtils;
  
  import junit.framework.TestCase;
  
  /**
   * @version $Revision: 1.1 $ $Date: 2004/07/12 00:27:09 $
   */
  public class ComplexUtilsTest extends TestCase {
      
      public void testAcos() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(0.936812, -2.30551);
          TestUtils.assertEquals(expected, ComplexUtils.acos(z), 1.0e-5);
      }
      
      public void testAcosNaN() {
          assertTrue(ComplexUtils.acos(Complex.NaN).isNaN());
      }
      
      public void testAsin() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(0.633984, 2.30551);
          TestUtils.assertEquals(expected, ComplexUtils.asin(z), 1.0e-5);
      }
      
      public void testAsinNaN() {
          assertTrue(ComplexUtils.asin(Complex.NaN).isNaN());
      }
      
      public void testAtan() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(1.44831, 0.158997);
          TestUtils.assertEquals(expected, ComplexUtils.atan(z), 1.0e-5);
      }
      
      public void testAtanNaN() {
          assertTrue(ComplexUtils.atan(Complex.NaN).isNaN());
      }
      
      public void testCos() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(-27.03495, -3.851153);
          TestUtils.assertEquals(expected, ComplexUtils.cos(z), 1.0e-5);
      }
      
      public void testCosh() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(-6.58066, -7.58155);
          TestUtils.assertEquals(expected, ComplexUtils.cosh(z), 1.0e-5);
      }
      
      public void testCoshNaN() {
          assertTrue(ComplexUtils.cosh(Complex.NaN).isNaN());
      }
      
      public void testCosNaN() {
          assertTrue(ComplexUtils.cos(Complex.NaN).isNaN());
      }
      
      public void testExp() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(-13.12878, -15.20078);
          TestUtils.assertEquals(expected, ComplexUtils.exp(z), 1.0e-5);
      }
      
      public void testExpNaN() {
          assertTrue(ComplexUtils.exp(Complex.NaN).isNaN());
      }
      
      public void testLog() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(1.60944, 0.927295);
          TestUtils.assertEquals(expected, ComplexUtils.log(z), 1.0e-5);
      }
      
      public void testLogNaN() {
          assertTrue(ComplexUtils.log(Complex.NaN).isNaN());
      }
      
      public void testPow() {
          Complex x = new Complex(3, 4);
          Complex y = new Complex(5, 6);
          Complex expected = new Complex(-1.860893, 11.83677);
          TestUtils.assertEquals(expected, ComplexUtils.pow(x, y), 1.0e-5);
      }
      
      public void testPowNaNBase() {
          Complex x = new Complex(3, 4);
          assertTrue(ComplexUtils.pow(Complex.NaN, x).isNaN());
      }
      
      public void testPowNaNExponent() {
          Complex x = new Complex(3, 4);
          assertTrue(ComplexUtils.pow(x, Complex.NaN).isNaN());
      }
      
      public void testSin() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(3.853738, -27.01681);
          TestUtils.assertEquals(expected, ComplexUtils.sin(z), 1.0e-5);
      }
      
      public void testSinh() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(-6.54812, -7.61923);
          TestUtils.assertEquals(expected, ComplexUtils.sinh(z), 1.0e-5);
      }
      
      public void testSinhNaN() {
          assertTrue(ComplexUtils.sinh(Complex.NaN).isNaN());
      }
      
      public void testSinNaN() {
          assertTrue(ComplexUtils.sin(Complex.NaN).isNaN());
      }
      
      public void testSqrtRealPositive() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(2, 1);
          TestUtils.assertEquals(expected, ComplexUtils.sqrt(z), 1.0e-5);
      }
      
      public void testSqrtRealZero() {
          Complex z = new Complex(0.0, 4);
          Complex expected = new Complex(1.41421, 1.41421);
          TestUtils.assertEquals(expected, ComplexUtils.sqrt(z), 1.0e-5);
      }
      
      public void testSqrtRealNegative() {
          Complex z = new Complex(-3.0, 4);
          Complex expected = new Complex(1, 2);
          TestUtils.assertEquals(expected, ComplexUtils.sqrt(z), 1.0e-5);
      }
      
      public void testSqrtImaginaryZero() {
          Complex z = new Complex(-3.0, 0.0);
          Complex expected = new Complex(0.0, 1.73205);
          TestUtils.assertEquals(expected, ComplexUtils.sqrt(z), 1.0e-5);
      }
      
      public void testSqrtImaginaryNegative() {
          Complex z = new Complex(-3.0, -4.0);
          Complex expected = new Complex(1.0, -2.0);
          TestUtils.assertEquals(expected, ComplexUtils.sqrt(z), 1.0e-5);
      }
  
      public void testSqrt1z() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(4.08033, -2.94094);
          TestUtils.assertEquals(expected, ComplexUtils.sqrt1z(z), 1.0e-5);
      }
      
      public void testSqrt1zNaN() {
          assertTrue(ComplexUtils.sqrt1z(Complex.NaN).isNaN());
      }
      
      public void testSqrtNaN() {
          assertTrue(ComplexUtils.sqrt(Complex.NaN).isNaN());
      }
      
      public void testTan() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(-0.000187346, 0.999356);
          TestUtils.assertEquals(expected, ComplexUtils.tan(z), 1.0e-5);
      }
      
      public void testTanh() {
          Complex z = new Complex(3, 4);
          Complex expected = new Complex(1.00071, 0.00490826);
          TestUtils.assertEquals(expected, ComplexUtils.tanh(z), 1.0e-5);
      }
      
      public void testTanhNaN() {
          assertTrue(ComplexUtils.tanh(Complex.NaN).isNaN());
      }
      
      public void testTanNaN() {
          assertTrue(ComplexUtils.tan(Complex.NaN).isNaN());
      }
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org