function testAsinReal()
 {
     /*{{{*/
     $tmp = Math_ComplexOp::asinReal(-0.22);
     $this->assertEquals('-0.221814470497 + 0i', $tmp->toString());
 }
Пример #2
0
 /**
  * Calculates the inverse sine of a complex number: z = asinAlt(c1)
  * Uses an alternative algorithm
  *
  * @param Math_Complex $c1
  * @return Math_Complex A valid Math_Complex number on success
  * @throws InvalidArgumentException
  */
 public static function asinAlt(Math_Complex $c1)
 {
     if (!Math_ComplexOp::isComplex($c1)) {
         throw new InvalidArgumentException('argument is not a Math_Complex object');
     }
     $r = $c1->getReal();
     $i = $c1->getIm();
     if ($i == 0) {
         return Math_ComplexOp::asinReal($r);
     } else {
         $x = abs($r);
         $y = abs($i);
         $r = hypot($x + 1, $y);
         $s = hypot($x - 1, $y);
         $a = ($r + $s) / 2;
         $b = $x / $a;
         $y2 = $y * $y;
         $ac = 1.5;
         $bc = 0.6417;
         // crossover values
         if ($b <= $bc) {
             $real = asin($b);
         } else {
             if ($x <= 1) {
                 $d = 0.5 * ($a + $x) * ($y2 / ($r + $x + 1) + ($s + (1 - $x)));
                 $real = atan2($x, sqrt($d));
             } else {
                 $ax = $a + $x;
                 $d = 0.5 * ($ax / ($r + $x + 1) + $ax / ($s + ($x - 1)));
                 $real = atan2($x, $y * sqrt($d));
             }
         }
         if ($a <= $ac) {
             if ($x < 1) {
                 $m = 0.5 * ($y2 / ($r + ($x + 1)) + $y2 / ($s + (1 - $x)));
             } else {
                 $m = 0.5 * ($y2 / ($r + ($x + 1)) + ($s + ($x - 1)));
             }
             $im = log1p($m + sqrt($m * ($a + 1)));
         } else {
             $im = log($a + sqrt($a * $a - 1));
         }
         $real = $r >= 0 ? $real : -1 * $real;
         $im = $i >= 0 ? $im : -1 * $im;
         return new Math_Complex($real, $im);
     }
 }
echo "sin(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::cos($a);
echo "cos(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::tan($a);
echo "tan(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::sec($a);
echo "sec(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::csc($a);
echo "csc(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::cot($a);
echo "cot(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::asin($a);
echo "asin(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::asinAlt($a);
echo "asinAlt(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::asinReal(-0.22);
echo "asinReal(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::acos($a);
echo "acos(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::atan($a);
echo "atan(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::asec($a);
echo "asec(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::acsc($a);
echo "acsc(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::acot($a);
echo "acot(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::sinh($a);
echo "sinh(a) = " . $z->toString() . "\n";
$z = Math_ComplexOp::cosh($a);
echo "cosh(a) = " . $z->toString() . "\n";