Maximaの結果をcsv形式で出力する方法

Maximaの結果をcsv形式で出力する方法

Maximaの結果をcsv形式で出力する方法

はじめに

数式処理ソフトMaximaで得た結果をcsv形式のファイルで保存する方法について説明します。

Maximaで出力される数値をエクセルなどでまとめたい場合に役に立ちます。

開発環境

  • Maxima: ver5.42.2
  • GUI: wxMaxima19.01.2x
  • 使用ライブラリ: numericalio
    →デフォルトでMaximaのディレクトリに保管されていると思います。
  • OS: Windows10

サンプルコード

Maximaは、「Common LISP」

と言うプログラミング言語で記述されており、

その文法に則ってコーディングをする必要があります。

下図がcsvファイルを保存するためのサンプルコードです。

f(x):=sin(x);

numer;true;

M:matrix(["x","sinx"]);
for i:0  thru 10 step 0.01 do  M:addrow(M,[i,f(i)]);

load("numericalio");
write_data(M,"C:/test/sinx.csv",csv);

1ブロック目:

使用する関数を定義しています。

今回はサイン関数の変数xの値を様々に変化させて時の結果を出力することを考えます。

2ブロック目:

「numer;true;」

この記述で、出力を数値で行うように指定しています。

これを指定しておかなければ、円周率%piなどの定数を使った場合に出力結果に文字列が残ってしまいます。(逆に残したい場合には、この記述は不要です。

3ブロック目:

csv形式で出力するための準備として、matrix(行列)を定義しています。

「M:matrix([“x”,”sinx”]);」

この記述で、1行×2列のmatrix Mを定義しています。
記述した” ”内の文字列はcsv一行目のラベルとなります。

続くfor文の中の「addrow」コマンドを使って、xとsinxの値を行として追加していきます。

4ブロック目:

csvファイルを生成しています。
「load(“numericalio”);」は、numericalioと言うファイルの記録や操作を実施するためのライブラリをロードしています。
そして、

「write_data(行列,”フルパスとファイル名”,形式)」

という文法で、ファイルを生成することができます。
※ここで、フルパスを指定せずファイル名のみを記述した場合、Maximaが保存されているディレクトリにファイルが保存されます。

コードの実行

上のサンプルコードをwxMaxmaの画面にそのまま貼り付けて「Shift+Enter」で実行すると、


保存場所として指定した、

C:/testのフォルダに新たに「sinx.csv」というファイルが生成されました。


エクセルで開いて中身を確認してみると、

確かに綺麗なサインカーブが描かれていることがわかります。

Maximaでの重複for文の使い方

サンプルコード

ここでは応用編として、for文の中にfor文を入れる方法について説明します。

単純なfor文では、上で説明したような1変数の反復計算となります。

しかしながら複数の変数で反復計算を実施して結果を出力したい!

という場合も多いと思いますので、ここでは例として2変数で反復計算を実施する重複for文のサンプルコードをご紹介します。

f(k,x):=k*sin(x);

numer;true;

M:matrix(["x"]);
for i:0 step 0.01 thru 10 do M:addrow(M,[i]);

for j:1 thru 10 do (
    C:matrix(["k"=j]),
    for i:0 step 0.01 thru 10 do (
        C:addrow(C,[f(j,i)])
        ),
    M:addcol(M,C)
    );

load("numericalio");
write_data(M,"C:/test/ksinx.csv",csv);

for文の中にfor文を入れるには、

for…do(反復操作,for…do(反復操作));

と言う風にdo後の()内にもう一つのfor文を入れて使います。

上のサンプルコードでは、sinxにもう一つの変数として係数kを与え、xに加えてkに1から10までの値を入れた場合の結果も出力する様にしました。
※8〜14行目が二重のfor文にあたります。

実際に上のコードwxMaximaに貼り付けて実行してみます。

そのまま貼り付けて「Shift+Enter」で実行すると、

また同じ様に指定したC:/testのフォルダへ追加で「ksinx.csv」というファイルが生成されました。

ファイルをエクセルで開いて確認してみると、

下の様にk(振幅)の異なる10個のサインカーブが綺麗に描かれており、

思い通りのファイルが生成されていることがわかります。

※ちなみに右上のA1セルを選択した状態で、「挿入」→「線グラフの絵」をクリックすると、一発で下のようなグラフが生成されます。ひとつひとつ列をクリックしてグラフを作る必要はありません。

まとめ

今回はMaximaの結果をcsvで出力する方法について説明しました。

「Common LISP」という少しマイナーな言語でプログラムを記述してやる必要があるということもあり、思い通りのプログラムを実装するには少し骨が折れますが、

簡単なファイル出力ならば、今回ご紹介したサンプルコードで実施できます。

もしMaximaの結果をエクセルで集計したいけどやり方がわからない!

といった方がおられましたら、上のコードを参考に出力プログラムを作成してみてはいかがでしょうか。

Maximaカテゴリの最新記事