プログラミングの小部屋
プログラミングを始める前に
コマンドプロンプトについて
CygwinとMinGWについて
C言語のいくつかの例題

JAVA
JAVAのいくつかの例題
JavaScript

音声(WAVEフォーマット)データの扱い
画像データ(ビットマップ)の扱い

Mathematica入門
Maxima入門(Mathematicaに似てフリーで使えます)

基本的にこのページの著作権は放棄します.公開されているプログラムは勝手に使って
ください.ただし,結果に対する責任は持てません.


プログラミングを始める前に
学習の目的
まずは自分が何を勉強したいのかを整理する必要があります.例えば以下のような目的
(動機)が考えられます.
Windows,MacやUnixといったコンピュータの使い方とプログラミングを同時に学習する
数値計算とその可視化(研究データの処理)
C,FORTRAN,JAVAなど代表的な言語を「簡単なプログラミングならできます
」と言えるようになる
何千,何万行といった複雑なプログラムを作る.
とりあえずプログラミングの授業で単位が取れればよい.
シェアウェアとしてお金が取れるような実用的なプログラムを作る.
等等.

言語の選択
上記の目的がはっきりしていれば,後は自分の使える環境とソフトウェアに投資できる
金額で使用する言語は絞られてくると思います.また作ったプログラムの実行は自分だ
けなのか,他の人も使う可能性があるのかは,考えておいた方が良いと思います.

必要なステップ
では使用する言語が決まったら,プログラミングを習得するのに必要なステップは何で
しょうか?
ソフトのインストール
"HelloWorld"のような,最も単純なプログラムの実行
変数(配列)の定義,ファイルの処理,数学的な関数(sin,sqrtなど)の使い方,
サブルーチン(関数)の使い方,条件判断,繰り返しを最低限押さえておけば,大抵の
プログラミングはできるはずです.


コマンドプロンプトについて
フリーな環境でプログラミングをする場合,コマンドプロンプト(Win98以前ではMS-DOS
プロンプト)で作業をする場合が多いので,ポイントだけ説明したいと思います.(以下
はあくまでも初心者向けの使い方です.
コマンドプロンプトを開くには
WINXPの場合,スタート>すべてのプログラム>アクセサリ>コマンドプロンプト
の順に開く.
例えば,test1.cをコンパイルして実行形式ファイルtest1.exeを作れば,コマンドプロン
プト上でtest1.exe+Enterとすれば,プログラムが動きます.
現在自分がいるディレクトリ(カレントディレクトリ)に,test1.exeが無い場合には動か
せません.この場合,カレントディレクトリを移動するか,test1.exeが置いてあるディレ
クトリにパスを付けてやる必要があります.
バッチファイルとは
コマンドプロンプト上で複数のコマンドを続けて実行したい場合,一連の命令を拡張子bat
のテキストファイル(xxx.batなど)として保存しておけば,xxx.batだけで複数のコマンド
を続けて実行することが可能です.ファイルをコンパイルして実行するときは特に便利です.
またバッチファイルは,コマンドプロンプトを開かなくてもアイコンをダブルクリックする
だけで実行できます.
exeファイルやバッチファイルの場合,.exeや.batを省略しても実行できます.
主なコマンド(コマンドの後にはEnterキーを忘れずに)
cd xxx
ディレクトリxxxに移動する
dir
カレントディレクトリに含まれるファイルを表示する
a: b: d: 等
ドライブを移動する
path %path%;c:\minato
既存のパスにc:\minatoを追加する.こうするとc:\minatoに移動しなくてもc:\minato以下
にある実行形式ファイルを動かすことができる.
del
ファイルを消去する
type
テキストファイルを表示する
↑,↓
過去に使ったコマンドを呼び出す.↑ を押すだけ前に戻り,↓を押すだけ後に戻る.
その他の利用上のコツ(Tips)
コマンドプロンプトの左上をクリックするとコマンドプロンプトのプロパティが設定でき
ます.画面バッファのサイズを大きくすると,コンパイルエラーのメッセージが大量に出
てもスクロールできます.

test.exeで出力結果がコマンドプロンプトに表示されている場合,>を使うと新規
にファイルが作成されその中に結果が出力されます.
test.exe>out.txt(結果はファイルout.txt中に入る)

Cygwinとは
Cygwinは一言でいうとWindows上で使えるフリーなUNIXです.Cコンパイラ(gcc)が使えます.
ただしgccを使うためには,インストールの際注意が必要です.
インストールには,約100Mのディスクサイズが必要です.

MinGWとは
MinGWは"Minimalist GNU for Windows"の略で,Windows上で最小限の構成でGNUのソフト(gcc)
を使えます.コマンドプロンプトからコンパイルおよび実行ができます.
インストールには,約50Mのディスクサイズが必要です.

CygwinやMinGWのインストール,使い方についてはこちらを参考にして下さい.

C のプログラミングのためのいくつかの例題
関数を使う例題:戻り値あり

#include <stdio.h>
#include <math.h>

double func(int i){
return cos(i*M_PI/180.0);
}

main()
{
int i;
double x;
for(i=0;i<91;i++){
        x=func(i);
        printf("%d %f\n",i,x);}
return 0;
}

関数を使う例題:戻り値あり プロトタイプ宣言

#include <stdio.h>
#include <math.h>

double func(int);

main()
{
int i;
double x;
for(i=0;i<91;i++){
        x=func(i);
        printf("%d %f\n",i,x);}
return 0;
}

double func(int i){
return cos(i*M_PI/180.0);
}

関数を使う例題:戻り値なし

#include <stdio.h>
#include <math.h>

void func(int i){
double x;
x=cos(i*M_PI/180.0);
printf("%d %f\n",i,x);
}

main()
{
int i;
for(i=0;i<91;i++)func(i);
return 0;
}

関数を使う例題:グローバル変数を使う

#include <stdio.h>
#include <math.h>

int i;

void func(void){
double x;
x=cos(i*M_PI/180.0);
printf("%d %f\n",i,x);
}

main()
{
for(i=0;i<91;i++)func();
return 0;
}

関数を使う例題:静的変数を使う

#include <stdio.h>
#include <math.h>


void func(void){
static int i=0;
double x;
x=cos(i*M_PI/180.0);
printf("%d %f\n",i,x);
i++;
}

main()
{
int i;
for(i=0;i<91;i++)func();
return 0;
}

マクロを使う例題

#include <stdio.h>
#include <math.h>
#define FX(x) sqrt(1.0-(x)*(x))
#define N 10000

main()
{
int i;
double x,s=0.0,pi;
for(i=0;i<N;i++){
x=i*1.0/N;
s+=FX(x)/N;}
pi=s*4.0;
printf("PI=%f\n",pi);
return 0;
}

素数を計算する例題

/* prime number */
#include <stdio.h>
#define N 1000

int main()
{
int i,s[N],sp;
for(i=2;i<N;i++)s[i]=1;
sp=2;
while(sp<N){
for(i=2*sp;i<N;i+=sp)s[i]=0;
for(i=sp+1;s[i]!=1;i++);
sp=i;
}
for(i=2;i<N;i++)if(s[i]==1)printf("%d\n",i);
return 0;
}

素数を計算する例題(上のプログラムを簡略化したもの)

/* prime number */
#include <stdio.h>
#define N 1000
int main()
{
int i,s[N],pn=2;
for(i=2;i<N;i++)s[i]=1;
while(pn<N){
for(i=2*pn;i<N;i+=pn)s[i]=0;
for(pn++;s[pn]!=1;pn++);
}
for(i=2;i<N;i++)if(s[i]==1)printf("%d\n",i);
return 0;
}

乱数を使い0-1の乱数x,yに変換し,4分の1の円に入る確率から円周率を計算する

#include <stdio.h>
#include <stdlib.h>

void main()
{
int i,n=10000000,s=0;
double x,y,pi;
for(i=0;i<n;i++){
x=(double)rand()/RAND_MAX;
y=(double)rand()/RAND_MAX;
if(x*x+y*y<1.0)s++;
}
pi=(double)s/n*4.0;
printf("Estimated pi=%f\n",pi);
}

ジョルジュ・ルイ・ビュフォンの方法で円周率を計算する例題
(幅1の板が敷き詰められた平面上に長さ1の棒をランダムに落とすと棒が板の境界を
横切る確率が2/円周率となる)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void main()
{
int i,n=10000000,s=0;
double x0,x1,theta,pi;
for(i=0;i<n;i++){
x0=(double)rand()/RAND_MAX;
theta=2.0*M_PI*(double)rand()/RAND_MAX;
x1=x0+cos(theta);
if(x1<0.0 || x1>1.0)s++;
}
pi=2.0*n/s;
printf("Estimated pi=%f\n",pi);
}

微積分の例題
[a,b]の範囲でシンプソンの公式を用いてf(x)の数値積分を行う
nは領域の分割数
f(x)=4/(1+x*x)を[0,1]の範囲で積分すると答えは円周率になる)

#include <stdio.h>
#include <math.h>
double f(double x){
return 4.0/(1.0+x*x);
}
void main()
{
  int i,n=1000;
double a,b,d,x1,x2,x3,s;
a=0.0;
b=1.0;
d=(b-a)/n;
s=0.0;
for(i=0;i<n;i++)
        {
        x1=a+(b-a)/n*i;
        x2=a+(b-a)/n*i+d/2.0;
        x3=a+(b-a)/n*i+d;
        s+=(1.0/6.0*f(x1)+4.0/6.0*f(x2)+1.0/6.0*f(x3))*d;
        }
        printf("%15.8e\n",s);
}

JAVA のプログラミング入門
まずはJAVAのインストールから簡単なプログラムの実行までについて説明します.

(1)まずはJAVAをインストールする.JAVASDKがフリーで公開されている.JAVAをインス
トールするとできるフォルダがある.このフォルダ名をjavaに変えておいたほうが便利で
ある.以下ではC:\javaにJDKの一式をインストールするものとする.


(2)JAVAのソースプログラムを書く(ex.java)

プログラム例

//(0,0)-(100,100)の四角を書き,Hello!と表示する
import java.applet.Applet;
import java.awt.*;
public class ex extends Applet{
public void paint(Graphics g){
g.drawLine(0,0,200,200);
g.drawString("Hello World",10,20);
}
}

(3)ソースをコンパイルする.
コマンドプロンプト内で
(3-1)パスの設定する.(PATH c:\java\bin)
(3-2)JAVAのソースプログラムをコンパイルする(javac ex.java)とアプレット
(ex.class)ができる.

(4)ex.classと同じフォルダ内にJAVAを実行するための下記の内容のHTMLファイルを
作る(ex.html)
<HTML>
<BODY>
<APPLET CODE="ex.class" WIDTH="1000" HEIGHT="500"></APPLET>
</BODY>
</HTML>

(5)ex.htmlをダブルクリックすればウェブのブラウザが開いて,JAVAプログラムが実行される.
JDKでインストールされたappletviewerでHTMLファイルを開いてもJAVAプログラムは実行
できる.(appletviewer ex.html )


上記(3)-(5)の一連の作業は,バッチファイルにすることができる.
バッチファイルの例(ex.bat)
PATH c:\java\bin
javac ex.java
appletviewer ex.html

バッチファイルのアイコンをダブルクリックすればコンパイルから実行まで自動的に行わ
れる.1つのフォルダにex.java,ex.html,ex.batをセットで置けば管理が楽である.
新しいプログラムを作成,実行するときには,フォルダごとコピーして,ex.javaの中身
だけ書き換えて,ex.batをダブルクリックすれば良い.
この場合各フォルダに同じex.htmlとex.batが存在することになるが,サイズが小さいので
問題にならない.簡単なプログラムであれば,1枚のフロッピーに100近くプログラム(の
フォルダ)を収めることが可能である.

JAVAの例題
Integerのテキストデータを読み込む例題
アプレットで,スペース(0x20)で区切られた整数型データを配列に読み込み,先頭と最後
のデータを表示するプログラムです. FileInputStreamでread()を行った場合,ストリーム
の最後に達した場合は -1 が返されることを利用しています.

//Read Text data with space(0x20)
import java.awt.*;
import java.io.*;
public class ex extends java.applet.Applet {
public void paint(Graphics g){
int a,ix=0,iy=0,nn=200;
int dat[][]=new int[5][1000];
try {
FileInputStream f = new FileInputStream("data1.txt");
for(int j=0;j<1000; j++)for(int i=0;i<5; i++)dat[i][j]=0;
//read() returns -1 at the end of data
while((a=f.read())!=-1){
if(a>=0x30 && a<=0x39)dat[ix][iy]=dat[ix][iy]*10+a-0x30;
if(a==0x20)ix++;
if(a==0x0D){ix=0; iy++;}
}//while
} catch(IOException ioe) {ioe.printStackTrace();}
iy--; //number of lines -1

for(int i=0;i<10;i++)for(int j=0;j<5;j++)
        g.drawString(String.valueOf(dat[j][i]),50*(j+1),20*(i+1));
for(int i=0;i<10;i++)for(int j=0;j<5;j++)
        g.drawString(String.valueOf(dat[j][iy-9+i]),50*(j+1),20*(i+1)+250);
}// end paint

}// end applet

doubleを含むテキストデータを読み込む例題
アプレットで,スペース(0x20)で区切られたデータをdoubleの配列に読み込み,先頭
と最後のデータを表示するプログラムです.データの読み込みにはFileReaderを使って
います.Double.parseDouble()で文字列をdoubleに変換しています.

//Read Text data with double
// 0x20:space 0x0D:CR 0x0A:LF (ASCII)
import java.awt.*;
import java.io.*;
public class ex extends java.applet.Applet {
public void paint(Graphics g){
int a,ix=0,iy=0,nn=200;
String b="";
double dat[][]=new double[5][1000];
try {
FileReader f = new FileReader("data1.txt");
for(int j=0;j<1000; j++)for(int i=0;i<5; i++)dat[i][j]=0;
//read() returns -1 at the end of data
while((a=f.read())!=-1){
if(a>=0x21 && a<=0x7A)b=b+(char)a;
if(a==0x20){dat[ix][iy]=Double.parseDouble(b);b="";ix++;}
if(a==0x0D){dat[ix][iy]=Double.parseDouble(b);b="";ix=0; iy++;}
}//while
} catch(IOException ioe) {ioe.printStackTrace();}
iy--; //number of lines -1

for(int i=0;i<10;i++)for(int j=0;j<5;j++)
        g.drawString(String.valueOf(dat[j][i]),60*(j+1),20*(i+1));
for(int i=0;i<10;i++)for(int j=0;j<5;j++)
        g.drawString(String.valueOf(dat[j][iy-9+i]),60*(j+1),20*(i+1)+250);
}// end paint

}// end applet


Matinの公式を使って円周率を計算する例題

//Calicurate PI with Matin's Equation
//PI/4=4 arctan(1/5)-arctan(1/239)
//arctan(1/X)=1/x-1/(3x^3)+1/(5x^5)-1/(7x^7)....
import java.applet.Applet;
import java.awt.*;
public class ex extends Applet {
public void paint(Graphics g){
double pi,a=5.0,b=239.0;
pi=4.*(4./a-1./b);
pi-=4.*(4./(3.*a*a*a)-1./(3.*b*b*b));
pi+=4.*(4./(5.*a*a*a*a*a)-1./(5.*b*b*b*b*b));
pi-=4.*(4./(7.*a*a*a*a*a*a*a)-1./(7.*b*b*b*b*b*b*b));
pi+=4.*(4./(9.*a*a*a*a*a*a*a*a*a)-1./(9.*b*b*b*b*b*b*b*b*b));
g.drawString(String.valueOf(Math.PI-pi),100,100);
pi-=4.*(4./(11.*a*a*a*a*a*a*a*a*a*a*a)-1./(11.*b*b*b*b*b*b*b*b*b*b*b));
pi+=4.*(4./(13.*a*a*a*a*a*a*a*a*a*a*a*a*a)-1./(13.*b*b*b*b*b*b*b*b*b*b*b*b*b));
pi-=4.*(4./(15.*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a)-1./(15.*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b));
pi+=4.*(4./(17.*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a)
        -1./(17.*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b*b));
g.drawString(String.valueOf(Math.PI-pi),100,200);
}
}

ボタンをクリックすることによりランダムな直線を描く例題
JAVAでは,マウスやボタンを使ったイベント処理が可能です.

import java.awt.*;
import java.awt.event.*;
public class ex extends java.applet.Applet implements ActionListener {
public Button butt1;
public void init(){
butt1 = new Button("Next");
add(butt1);
butt1.addActionListener(this);
}
public void paint(Graphics g){
g.drawLine((int)(Math.random()*400.), (int)(Math.random()*400.),
(int)(Math.random()*400.), (int)(Math.random()*400.));
}
public void actionPerformed(ActionEvent e){
repaint();
} //action() end
} //Applet end


クリックしたマウスの位置まで直線を描く例題
repaint()でGraphicsは毎回更新されています.

import java.awt.*;
import java.awt.event.*;
public class ex extends java.applet.Applet implements MouseListener {
int x=0,y=0,x0=0,y0=0;
public void init() {
addMouseListener(this);
}
public void mouseClicked(MouseEvent e) {
x=e.getX(); y=e.getY();
repaint();
}
public void mousePressed(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void paint(Graphics g){
g.drawLine(x0,y0,x,y);
x0=x; y0=y;
}//paint
}//ex

クリックしたマウスの位置まで直線を描く例題
外部からGraphics gにアクセスすることにより,継続した折れ線を描くことができます.

import java.awt.*;
import java.awt.event.*;
public class ex extends java.applet.Applet implements MouseListener {
int x0,y0;
Graphics g;
public void init() {
g=getGraphics();
addMouseListener(this);
}
public void mouseClicked(MouseEvent e) {
int x,y;
x=e.getX(); y=e.getY();
g.drawLine(x0,y0,x,y);
x0=x; y0=y;
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}//ex

アプレットではなくFrameを用いて描画を行う例題
次のソースファイルをex.javaとして保存してください.
ここで2行目,3行目,11行目のクラス名"ex"は統一する必要があります.コマンドプロン
プト上でパスの設定を行った後,javac ex.javaでコンパイルし,java exで実行します.
フレーム上では終了できないので,コマンドプロンプト上でCtrl+Cで終了できます.

import java.awt.*;
public class ex extends Frame{
public ex() {
setSize(400,400);
}
public void paint(Graphics g){
g.drawRect(10,30,130,120);
g.drawString("Hello",20,150);
}
public static void main(String args[]){
new ex().show();
}
}

JavaScript
電卓気分で簡単なプログラムを組んで実行する場合は,JavaScriptが便利です.実行
方法は,メモ帳などのエディタでHTMLファイルを編集し,test.htmlのような形式で保
存し,JavaScript対応のブラウザで開けばよいだけです.
特長:
JDKなどソフトをインストールする必要がない.
JavaScriptでは変数の型は定義する必要がない.
ループ,条件判断,Mathクラスの関数も使える.

例題
<HTML>
<HEAD>
<TITLE>test program of JavaScript</TITLE>
</HEAD>
<PRE>
<SCRIPT LANGAGE="JavaScript">
//<PRE>is necessary to use "\n" or "\t"
for(i=0;i<10;i++)
{
x=Math.sqrt(1.0*i);
document.write(i,"\t",x,"\n");
//document.write("\n");
}
</SCRIPT>
</PRE>
</HTML>

12分の1の円から円周率を求める例題
<HTML>
<HEAD>
<TITLE>
test program of JavaScript
</TITLE>
</HEAD>
<SCRIPT LANGAGE="JavaScript">
n=100;
s=0.0;
for(i=0;i<n;i++){
x1=0.5*i/n;
x3=0.5*(i+1)/n;
x2=0.5*(x1+x3);
y1=Math.sqrt(1.0-x1*x1);
y2=Math.sqrt(1.0-x2*x2);
y3=Math.sqrt(1.0-x3*x3);
s+=(y1/6.0+y2*4.0/6.0+y3/6.0)*0.5/n;
}
pi=12.0*(s-Math.sqrt(3.0)/8.0);
document.write(pi,"\n");
</SCRIPT>
</HTML>

時刻を表示する例題
<HTML>
<HEAD>
<TITLE>test program of JavaScript</TITLE>
</HEAD>
<FORM METHOD="post">
ただいま<INPUT NAME="watch" SIZE="20">です.
</FORM>
<SCRIPT LANGUAGE="JavaScript">
function watch() {
    setTimeout('watch()', 1000); // 1000msec = 1sec
    now = new Date();
    hour = now.getHours();
    min = now.getMinutes();
    sec = now.getSeconds();
    document.forms[0].elements[0].value = hour+":"+min+":"+sec;
}
watch();
</SCRIPT>
</HTML>

Mathematica入門(メモ書き)

Windows版 Mathematicaの使い方
Windowsでは式を入力してShiftキーを押しながらEnterキーを押す.(Shift+Enter)

Mathematicaの基礎知識
式を入力すると入力(In)に対する結果(Out)が表示される.

関数は[]でくくる.関数の最初は大文字である.
よく使う定数
E(自然対数の低),PI(円周率),I(虚数),Infinity(無限大)

たとえば x^3 + y^3(Shift+Enter)で式が記憶される.
この式の因数分解を行いたい場合
Factor[%]
ここで%は直前の式をあらわす
今度は,上の結果を展開したい場合
Expand[%]
でもとに戻る.

方程式の解法
Solve[4x-1==0,x]
Solve[a x^2+b x+c==0,x]
(注)Solve[ax^2+bx+c==0,x] とすると正しい結果が出ない.これはMathematicaでは
axやbxも変数とみなすためである.異なる変数の間にはスペースが必要.スペースの
代わりに*を使っても良い.
Solve[a x^2+b x+c==0,x]
Solve[{x-4y==-2,2x+y==5},{x,y}]
上の問題は逆行列を使った行列演算でも解くことができる.
A={{1,-4},{2,1}}
Y={-2,5}
Inverse[A].Y

関数の極限
Limit[(1+1/x)^x,x->Infinity]
矢印や無限大は,右のリストから選んでもよい

式の微分
x^3-4x^2+Exp[-x^2]+Sin[2x]
D[%, x]

微分方程式
DSolve[{x''[t]+x[t]==0,x[0]==1,x'[0]==0},x[t],t]
DSolve[{x''[t]+x'[t]+x[t]==0,x[0]==1,x'[0]==0},x[t],t]
DSolve[{x''[t]+x'[t]+x[t]==2Cos[t],x[0]==1,x'[0]==0},x[t],t]
Plot[式,{t,a,b}]で結果をグラフ表示することも可能である.a,bは横軸の範囲.

式の積分
1/x-4x^2+Exp[-x]+Sin[2x]
Integrate[%, x]

定積分
Integrate[Exp[-x^2],{x,0,1}]
式の値を数値で与えるには
N[%]
表示桁数を指定することもできる.
N[%,100]
N[]を忘れた場合,とりあえず1.0を式に掛けておいてもよい.
例えばIntegrate[Exp[-x^2],{x,0,1}]*1.0

複素数の絶対値と偏角
z = (1 + I)/Sqrt[2]
Abs[z]
Arg[z]

行列
行列やベクトルの定義
A={{1,-4},{2,1}}
B={{a,b},{c,d}}
C={-2,5}
行列の演算
A.B (内積)
B.B
Cross[A,B] (外積)
A^3
逆行列
Inverse[A]
行列式
Det[A]
行列の固有値と固有ベクトルを求める.
A={{3,-5,-5},{-1,7,5},{1,-9,-7}}
Eigenvalues[A]
Eigenvectors[A]
固有値と固有ベクトルが条件を満たすか確認する
固有値-2に対する固有ベクトルがB = {1, -1, 2}のとき
A.B と -2Bが同じ結果になる
A={{2,0,-1},{0,2,0},{-1,0,2}}

グラフ描画
Plot[Sin[4x] Exp[-x^2],{x,-5,5}]
ParametricPlot[{Sin[5t],Cos[3t]},{t,0,2Pi}]
ParametricPlot3D[{Sin[15t], Cos[15t], t}, {t, 0, 2Pi}, PlotPoints -> 400]
Plot3D[Exp[-(x^2 + y^2)], {x, -5, 5}, {y, -5, 5}]
ContourPlot[Exp[-(x^2 + y^2)], {x, -5, 5}, {y, -5, 5}]
グラフの上下が削られる場合には以下のようにオプションを追加する.
Plot[Sin[10x] Exp[-x^2], {x, -5, 5}, PlotRange -> {-1, 1}]
Plot3D[Exp[-(x^2 + y^2)], {x, -5, 5}, {y, -5, 5}, PlotRange -> All]
Plot3D[Exp[-(x^2 + y^2)], {x, -5, 5}, {y, -5, 5}, PlotRange -> {0,1}]
グラフを細かく(精密に)書きたい場合には,Plotpointsで関数のサンプリング数を変える.
Plot3D[Exp[-(x^2 + y^2)], {x, -5, 5}, {y, -5, 5}, PlotRange -> All,PlotPoints->100]

関数の定義
f[x_]:=x^2 Sin[x]
Plot[f[x],{x,-10,10}]
変数への値の代入
x=10
x^2

最も簡単な形式を返す
FullSimplify[1/(Sqrt[2] - 1)]

値のクリア
Remove["x"]


Maxima 入門(メモ書き)

式を入力すると入力(%i*)に対する結果(%o*)が表示される.

Maximaでは変数への代入に:(コロン)を用いる.
a:2;
sqrt(a);

関数は()でくくる.関数の最初は小文字である.
よく使う定数
%e(自然対数の低),%pi(円周率),%i(虚数),inf(無限大)

たとえば x^3 + y^3;で式が記憶される.
この式の因数分解を行いたい場合
factor(%);
ここで%は直前の式をあらわす
今度は,上の結果を展開したい場合
expand(%);
でもとに戻る
.
式の通分
ratsimp(1/(x+1)+2/(x-1));

方程式の解法
solve(4*x-1=0,x);
solve(a*x^2+b*x+c=0,x);
solve([x-4*y=-2,2*x+y=5],[x,y]);

関数の極限
limit((1+1/x)^x,x,inf);

式の微分
x^3-4*x^2+exp(-x^2)+sin(2*x);
diff(%,x);

微分方程式
atvalue(x(t),t=0,A);初期条件
atvalue(diff(x(t),t),t=0,0);初期条件
desolve(m*diff(x(t),t,2)=-k*x(t),x(t));
Is  k*m  positive, negative, or zero?と聞かれたら
positive;
などと入力する.
plot2d(式,[変数,開始,終了]);で結果をグラフ表示することも可能である.
plot2d(x^2,[x,-2,2]);

式の積分
1/x-4*x^2+exp(-x)+sin(2*x);
integrate(%,x);
定積分
integrate(exp(-x^2),x,0,1);
integrate(4/(1+x^2),x,0,1);

式の値を数値で与えるには
float(a);

桁数を指定する場合
fpprec:n;
bfloat(a);

fpprec:20;
bfloat(%pi);

複素数の絶対値と偏角
z:(1 + %i)/sqrt(2);
cabs(z); (絶対値)
carg(z);偏角 (argument)


行列演算
v1:[1,0,2]; (ベクトルの定義)

A:matrix([1,4],[2,-1]); (行列の定義)
Y:matrix([-2,5]);
invert(A).Y; (逆行列)

行列の演算
A.B (積)
A^3(累乗)
determinant(A);(行列式)


固有値
load(eigen);
eigenvalues(A);

固有ベクトル
load(eigen);
eigenvectors(A);


行列の固有値と固有ベクトルが条件を満たすか確認する.
A:matrix([3,-5,-5],[-1,7,5],[1,-9,-7]);
load(eigen);
eigenvectors(A);
>> [[[-2,2,3],[1,1,1]],[1,-1,2],[0,1,-1],[1,-1,1]]
固有値,重複数,ベクトルの順に表示される

固有値-2に対する固有ベクトルがB:[1, -1, 2];のとき
A.B;と-2*B;が同じ結果になることが確認できる.

グラフ描画
plot2d(sin(4*x),[x,-5,5]);
plot2d([sin(4*x),exp(-x^2)],[x,-2,2],[y,-4,4]);


(媒介変数表示)
plot2d([parametric,cos(t),sin(2*t)],[t,0,2*%pi]);
標準では媒介変数を10の領域に分割していて,[nticks,*]でグラフが荒いので分割数を増やす.
plot2d([parametric,cos(t),sin(2*t)],[t,0,2*%pi],[nticks,100]);
plot3d(exp(-(x-2)^2-y^2)+exp(-(x+2)^2-y^2),[x,-5,5],[y,-5,5]);
plot3d(exp(-(x-2)^2-y^2)+exp(-(x+2)^2-y^2),[x,-5,5],[y,-5,5],[grid,100,100]);
plot3d([cos(x)*cos(y),sin(x)*cos(y),sin(y)],[x,0,2*%pi],[y,-%pi/2,%pi/2]);

関数の定義
f(x):=x^2*sin(x);
plot2d(f(x),[x,-5,5]);

値のクリア
kill(all);

WAVEのフォーマット
音声データWAVEは圧縮されていないのでデータの読み方さえ知っていれば扱いが楽です.
基本的には,ビットマップと同じくデータはバイナリで,先頭にヘッダファイルが存在
しデータの情報が書かれていて,それに続いて音響信号の強度情報が書かれています.

Waveのヘッダーファイルのフォーマット
4バイト 'R' 'I' 'F' 'F'
4バイト これ以下のバイト数 (= ファイルサイズ - 8)
8バイト 'W' 'A' 'V' 'E' 'f' 'm' 't' ' '
4バイト (WAVEfmt欄のバイト数=10 00 00 00)
2バイト データ形式 (PCM: 01 00)
2バイト チャネル数
4バイト サンプリングレート(Hz)
4バイト バイト/秒
2バイト バイト/サンプル×チャネル数
2バイト ビット/サンプル
4バイト 欄の名前
4バイト この欄のバイト数 n
nバイト 欄の内容

(数値はIntel バイトオーダ)
ステレオは 左右の順番
8ビットデータは 0〜255,16ビットデータは -32768〜+32767
ドの音を発生するプログラム
例題は523.25Hz(ド)のサイン波のWAVファイルを作るJAVAのプログラムです.
プログラムは,ファイルアクセスをするため,アプレットではなくアプリケーションに
なっています.
ソースコード

//Make WAV files by JAVA
//Make Sound
//1999-05-21
import java.io.*;

public class ex {
public static void main(String[] args) {

try {
int b,ndat=50000;
FileOutputStream ff = new FileOutputStream("test.wav");
//RIFF
ff.write(0x52); ff.write(0x49); ff.write(0x46); ff.write(0x46); 
//No byte
b=ndat+36;
ff.write(b-(b/256)*256);
b/=256;
ff.write(b-(b/256)*256);
b/=256;
ff.write(b-(b/256)*256);
b/=256;
ff.write(b-(b/256)*256);
//
//WAVEfmt
ff.write(0x57); ff.write(0x41); ff.write(0x56); ff.write(0x45); 
ff.write(0x66); ff.write(0x6D); ff.write(0x74); ff.write(0x20); 
//16
ff.write(0x10); ff.write(0x00); ff.write(0x00); ff.write(0x00);
// PCM
ff.write(0x01); ff.write(0x00); 
//Mono
ff.write(0x01); ff.write(0x00); 
//Sampling rate
ff.write(0x80); ff.write(0x3E); ff.write(0x00); ff.write(0x00);
//byte/sec
ff.write(0x80); ff.write(0x3E); ff.write(0x00); ff.write(0x00);
//byte*CH
ff.write(0x01); ff.write(0x00); 
//bit
ff.write(0x08); ff.write(0x00); 
// name
ff.write(0x64); ff.write(0x61); ff.write(0x74); ff.write(0x61);
// No of Data
b=ndat;
ff.write(b-(b/256)*256);
b/=256;
ff.write(b-(b/256)*256);
b/=256;
ff.write(b-(b/256)*256);
b/=256;
for(int i=0;i < ndat; i++) {
ff.write(b-(b/256)*256);
        double x=1.+0.9*Math.sin(2.0*3.1415926*i/(16000./523.25));
        b=(short)(x*128.);
        ff.write((short)b);     }
ff.close();
} catch(IOException ioe) {ioe.printStackTrace();}
} //main() end
} 

声紋解析のプログラム
例題はWAVEデータ(test.wav:12.8秒以上,8ビット,モノラル,8KHzサンプリング)
を解析して,声紋表示するプログラムです.
ソースコード

//Voiceprint using FFT
// Read 8bit wav file 400*256 data
//  8KHz sampling
import java.awt.*;
import java.io.*;
public class ex extends java.applet.Applet {
public void paint(Graphics g){
double ar[] = new double[1024];
double ai[] = new double[1024];
double wave[] = new double[200000];
double wr,wi,pi=Math.PI,arg,x1,x2,x3,x4,ph;
int a,N=256,j,nn,n,mx,func,j1,j2,k,mx_1;
try {
FileInputStream f = new FileInputStream("test.wav");
for(int i=0;i<44; i++)a=f.read();
for(int i=0;i<400*N; i++)wave[i]=(double)f.read();
} catch(IOException ioe) {ioe.printStackTrace();}
for(int ii=0;ii<400;ii++){
for(int i=0;i<N;i++){
ar[i]=wave[ii*N/2+i]*0.5*(1.-Math.cos(pi*i/(N-1))); //Hanning Window 
ai[i]=0.;
}
nn=8;
n=256; //n=2^nn
mx=n;
func=1;
ph=2.*pi/n;
for(int mainloop=0;mainloop<nn;mainloop++){
mx_1=mx-1;
mx /=2;
arg=0.0;

for(int switchloop=0;switchloop<mx;switchloop++){
wr= Math.cos(func*arg);
wi= Math.sin(func*arg);
arg += ph;

for(int i=mx_1;i<n;i+=(mx_1+1)){
j1=i-mx_1+switchloop;
j2=j1+mx;
x1=ar[j1]+ar[j2]; x2=ai[j1]+ai[j2];
x3=ar[j1]-ar[j2]; x4=ai[j1]-ai[j2];
ar[j1]=x1; ai[j1]=x2;
ar[j2]=x3*wr-x4*wi; ai[j2]=x3*wi+x4*wr;
} //mx_1
} //switchloop
ph*=2.0;
} //mainloop
j=0;
for(int i=0;i<n-1;i++){
if(i<=j){
x1=ar[i]; x2=ai[i];
ar[i]=ar[j]; ai[i]=ai[j];
ar[j]=x1; ai[j]=x2;
}
k=n/2;
while(k<=j){
j-=k; k/=2;
}
j+=k;
}
for(int i=0;i<n/2;i++){
a=(int)((Math.log(ar[i]*ar[i]+ai[i]*ai[i])*5.-30.)*5.);
if(a<0)a=0;
if(a>255)a=255;
Color icolor = new Color(a,a,a);
g.setColor(icolor);
g.fillRect(ii*2,380-i*4,2,4);
} // end for i
g.drawString("Voiceprint by JAVA 1999-11-12 by A.Minato",10,390);
} // end for ii
} // end paint()
} //end applet

BITMAP画像の処理
以下は標準的な24ビットフルカラービットマップ画像のフォーマットです. 最初の
54byteはヘッダファイルで,画像データがどのように収められているかが記述
されています.残りが画像データの本体で,24ビットカラーの場合,
B,G,R,B,G,R.......の順に各ピクセルの0−255の輝度値の情報
が並べられています. 24ビットカラーのヘッダファイルのフォーマットは下記の
とおりです.

2byte: bf type
4byte: bf Size
2byte: bf Reserved 1
2byte: bf Reserved 2
4byte: Head Size
4byte: bi Size
4byte: bi width
4byte: bi height
2byte: bi planes
2byte: bi bit count (24 bit)
4byte: bi Compression (0x00000000)
4byte: bi Size Image
4byte: bi X dpi
4byte: bi Y dpi
4byte: bi Clr Used
4byte: bi Clr Important
DATA B,G,R,B,G,R

以下のプログラムは各ピクセルの輝度値を2倍にして出力するCのプログラムの例です.
#include <stdio.h>

main(){
int i,j,xy,x,y,b,bb,gg,rr;
FILE *fin=fopen("dat.bmp","rb");
FILE *fout=fopen("dat2.bmp","wb");
for(i=0;i<2; i++){ b=fgetc(fin); fputc(b,fout); }
b=fgetc(fin); fputc(b,fout);xy=b; 
b=fgetc(fin); fputc(b,fout);xy+=b*256;
b=fgetc(fin); fputc(b,fout);xy+=b*256*256; 
b=fgetc(fin); fputc(b,fout);xy+=b*256*256*256;
xy=xy-54;
for(i=0;i<12; i++){ b=fgetc(fin); fputc(b,fout); }
b=fgetc(fin); fputc(b,fout);x=b; 
b=fgetc(fin); fputc(b,fout);x+=b*256;
b=fgetc(fin); fputc(b,fout);x+=b*256*256; 
b=fgetc(fin); fputc(b,fout);x+=b*256*256*256;
b=fgetc(fin); fputc(b,fout);y=b; 
b=fgetc(fin); fputc(b,fout);y+=b*256;
b=fgetc(fin); fputc(b,fout);y+=b*256*256; 
b=fgetc(fin); fputc(b,fout);y+=b*256*256*256;
for(i=0;i<28; i++) {b=fgetc(fin); fputc(b,fout); }
for(i=0;i<y; i++){
for(j=0;j<x; j++){
bb=fgetc(fin);bb*=2;if(bb>255)bb=255;fputc(bb,fout); 
gg=fgetc(fin);gg*=2;if(gg>255)gg=255;fputc(gg,fout);
rr=fgetc(fin);rr*=2;if(rr>255)rr=255;fputc(rr,fout); 
}/* for j*/
for(j=0;j<xy/y-3*x; j++){b=fgetc(fin); fputc(b,fout); }
}/* for i*/
while((b=fgetc(fin)) != EOF)fputc(b,fout);
fclose(fin);
fclose(fout);
}

JAVAでビットマップを表示するプログラム
例題は24ビットカラービットマップを開いて表示するプログラムです.クリックした位置
の座標も表示します.

//Display BitMapfile on Java
// 1999 01 06 by A.Minato
import java.awt.*;
import java.applet.*;
import java.io.*;
public class ex extends Applet {
protected int x1,y1;
public void paint(Graphics g){
int a,b,size,w,h;
try {
FileInputStream f = new FileInputStream("dat.bmp");
for(int i=0;i<2; i++)a=f.read();
size=f.read(); size+=f.read()*256;
size+=f.read()*256*256; size+=f.read()*256*256*256;
for(int i=0;i<12; i++)a=f.read();
w=f.read(); w+=f.read()*256;
w+=f.read()*256*256; w+=f.read()*256*256*256;
h=f.read(); h+=f.read()*256;
h+=f.read()*256*256; h+=f.read()*256*256*256;
for(int i=0;i<28; i++)a=f.read();
w=(size-54)/h/3;
b=(size-54)/h-w*3;
//h-=200;
for(int i=0;i<h; i++)
{
for(int j=0;j<w; j++)
{
int b1=f.read();
int g1=f.read();
int r1=f.read();
Color icolor = new Color(r1,g1,b1);
g.setColor(icolor);
g.drawRect(j,h-i,1,1);
}// end for j
for(int k=0;k<b; k++)a=f.read();
}// end for i
} catch(IOException ioe) {ioe.printStackTrace();}
}// end paint
public void update(Graphics g){
Color icolor = new Color(255,255,255);
g.setColor(icolor);
g.drawLine(x1-10,y1+10,x1+10,y1-10);
g.drawLine(x1-10,y1-10,x1+10,y1+10);
g.fillRect(0,0,50,15);
icolor = new Color(0,0,0);
g.setColor(icolor);
g.drawLine(x1-10,y1,x1+10,y1);
g.drawLine(x1,y1-10,x1,y1+10);
g.drawString(String.valueOf(x1),0,10);
g.drawString(String.valueOf(y1),30,10);
}
public boolean mouseDown(Event evt,int x,int y) {
x1=x; y1=y;
repaint();
return true;
}
}// end applet