PEAR::Math_Complexを使ってみた。

カテゴリ: php / author: uechoco / 2007年09月18日 00:07:18
この記事を読む時間:548くらい

以前、PEARのパッケージリストで気になったものをリストアップしていたのだが、なんとなく暇だったのでリストを消費しようと思う。まずは、PEAR::Math_Complex。複素数を扱うライブラリだ。日本語限定でググったら、PEARマニュアルのコピーサイト以外出てこない。なんというマイナーライブラリ。

さて、実際の使用方法だが、やることは単純なので、ソースコードとその結果を見比べてもらったほうが早い。

PHP:
  1. require_once('Math/Complex.php');
  2. require_once('Math/ComplexOp.php');
  3.  
  4. /**
  5.  * 素数を作成する
  6.  */
  7. $a1 = 4;
  8. $b1 = 3;
  9. $z1 = new Math_Complex($a1, $b1);
  10.  
  11. /**
  12. * 簡単な文字列として表示する
  13. */
  14. echo "toString() : ", $z1->toString(), "<br />\n";
  15.  
  16. /**
  17.  * 実数部を返す
  18.  */
  19. echo "getReal() : ", $z1->getReal(), "<br />\n";
  20.  
  21. /**
  22.  * 虚数部を返す
  23.  */
  24. echo "getIm() : ", $z1->getIm(), "<br />\n";
  25.  
  26. /**
  27.  * 絶対値を返す
  28.  */
  29. echo "abs() : ", $z1->abs(), "<br />\n";
  30.  
  31. /**
  32.  * 絶対値の2乗を返す
  33.  */
  34. echo "abs2() : ", $z1->abs2(), "<br />\n";
  35.  
  36. /**
  37.  * 偏角を返す
  38.  */
  39. echo "arg() / angle() : ", $z1->arg(), "ラジアン<br />\n";
  40. echo "arg() / angle() : ", rad2deg($z1->arg()), "度<br />\n";
  41.  
  42. /**
  43.  * 共役複素数
  44.  */
  45. $z2 = Math_ComplexOp::conjugate($z1);
  46. echo "conjugate() : ", $z2->toString(), "<br />\n";
  47.  
  48. /**
  49.  * 負の数
  50.  */
  51. $z2 = Math_ComplexOp::negative($z1);
  52. echo "negative() : ", $z2->toString(), "<br />\n";

でその結果が、

CODE:
  1. toString() : 4 + 3i
  2. getReal() : 4
  3. getIm() : 3
  4. abs() : 5
  5. abs2() : 25
  6. arg() / angle() : 0.643501108793ラジアン
  7. arg() / angle() : 36.8698976458
  8.  
  9. Notice: Only variable references should be returned by reference in ???\pear\Math\ComplexOp.php on line 206
  10. conjugate() : 4 - 3i
  11.  
  12. Notice: Only variable references should be returned by reference in ???\pear\Math\ComplexOp.php on line 223
  13. negative() : -4 - 3i

ちなみに、phpのバージョンは5.2.0、xampp on Windowsで実行しています。T_NOTICE吐き出されてしまいました。このエラーはMojavi 2やXOOPSを使っていた人には懐かしい参照系のエラーです。ComplexOp.phpを見てみると、return new Math_Complex()がいたるところに(というか全関数に?)存在していました。

■実際のソースコードの一部

PHP:
  1. function &conjugate (&$c1)
  2. {
  3.   if (!Math_ComplexOp::isComplex($c1))
  4.     return PEAR::raiseError('argument is not a PEAR::Math_Complex object');
  5.   return new Math_Complex($c1->getReal(), -1 * $c1->getIm());
  6. }

■修正例

PHP:
  1. function &conjugate (&$c1)
  2. {
  3.   if (!Math_ComplexOp::isComplex($c1))
  4.     return PEAR::raiseError('argument is not a PEAR::Math_Complex object');
  5.   $c2 =& new Math_Complex($c1->getReal(), -1 * $c1->getIm());
  6.   return $c2;
  7. }

ということで、結論。Math_Complexは、複素数を作るだけなら簡単。計算をしようとすると、E_NOTICEが出るので、自分でライブラリ書き換える必要がある。でした。

ちなみに・・・PEAR::Math_Matrixも試そうとしたのですが、PHPUnitのVer0.6.2以前が必要とか・・・既にVer1.3.2が入ってるので諦めました。


コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URI

コメントする

Copyright © 2012 うえちょこ@ぼろぐ. WP Theme created by Web Top.