Oct 17, 2007

proc_openとMaxima

ポスト @ 21:22:02 , 修正 @ Oct 17, 2007 12:22:02 | PHP

 今度はMaximaをproc_openで操作してみた。

#!/usr/bin/php
<?php
$array = array(1,2,0,2,1,1,0,1,1);
$matrix = "[";
$i=1;
foreach($array as $val){
  $matrix .= $val;
  if(fmod($i,3)==0){
    $matrix .= "],[";
  }else{
    $matrix .=",";
  }
  $i++;
}
$matrix = preg_replace("/,\[$/","",$matrix);
  
$descriptorspec = array(
  0 => array("pipe","r"),
  1 => array("pipe","w"),
);
$process = proc_open("maxima",$descriptorspec,$pipes);
if(is_resource($process)){
  fwrite($pipes[0], "load(eigen);\n");
  fwrite($pipes[0], "A:matrix(".$matrix.");\n");
  fwrite($pipes[0], "eigenvalues(A);\n");
  fwrite($pipes[0], "eigenvectors(A);\n");
  fwrite($pipes[0], "quit();\n");
  fclose($pipes[0]);
  while(!feof($pipes[1])){
    $result .= fread($pipes[1], 4096);
  }
fclose($pipes[1]);
proc_close($process);
}
echo $result;
 
?>
 行列を入力する形式が面倒臭い。正しく行列を入力して固有値と固有ベクトルを求めてみると、
Maxima 5.10.0 http://maxima.sourceforge.net
Using Lisp GNU Common Lisp (GCL) GCL 2.6.7 (aka GCL)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
This is a development version of Maxima. The function bug_report()
provides bug reporting information.
(%i1) (%o1)             /usr/share/maxima/5.10.0/share/matrix/eigen.mac
(%i2)                             [ 1  2  0 ]
                                  [         ]
(%o2)                             [ 2  1  1 ]
                                  [         ]
                                  [ 0  1  1 ]
(%i3) (%o3)               [[1 - sqrt(5), sqrt(5) + 1, 1], [1, 1, 1]]
(%i4)                                                    sqrt(5)  1
(%o4) [[[1 - sqrt(5), sqrt(5) + 1, 1], [1, 1, 1]], [1, - -------, -], 
                                                            2     2
                                                      sqrt(5)  1
                                                  [1, -------, -], [1, 0, - 2]]
                                                         2     2
(%i5)
という具合になる。正しく結果を受け取れるのだが、最初にMaximaの説明がついてくるとか、計算結果の表示形式も、あまり受け取った後の処理には向いていないようだ。コマンドラインで操作できるものなら大抵のものはproc_openで操作出きそうなのだけれども、それに向いているものと向いていないものがあるようだ。

R 2.6.0が出ていた。全然気づかなかった。何度かRのトップページを見ているのに。

Trackback

No Trackbacks

Track from Your Website

http://nakano.no-ip.org/attic/trackback/tb.php?id=13
(言及リンクのないトラックバックは無視されます)