ウォーリーをさがすとはどういうことか


ウォーリーを(アルゴリズム組んでプログラムの力で)探せ!

という祭りがあったそうです。

Mathematicaの強さを見せつけるものになった優勝作品を試してみました。UMMでも動きます。

waldo = Import["http://shopping.c.yimg.jp/lib/cast-shop/wally3.gif"];
red = Fold[ImageSubtract, #[[1]], Rest[#]] &@ColorSeparate[waldo];
corr = ImageCorrelate[red, 
   Image@Join[ConstantArray[1, {2, 4}], ConstantArray[0, {2, 4}]], 
   NormalizedSquaredEuclideanDistance];
pos = Dilation[ColorNegate[Binarize[corr, .12]], DiskMatrix[30]];
found = ImageMultiply[waldo, 
  ImageAdd[ColorConvert[pos, "GrayLevel"], .5]]

結果

確かにさがせてはいるようですが(すごい!)、ウォーリーをさがすというのがどういうことなのかはさがせていないみたいです。

関数の値の補間方法


学生向け

「関数の値を補間するプログラムで遊ばせたら、補間のアルゴリズムが複雑だったせいか、伝えたかったことがまったく伝わらなかった」という話を聞いたので、ちょっとやってみました。

Manipulate[
 f = Function[{x}, 1 + Sin[a x]];
 start = -Pi;
 end = Pi;
 
 (*サンプリング*)
 samples = Table[{x, f[x]}, {x, start, end, 2 (end - start)/n}];
 
 (*補間*)
 g = Interpolation@samples;
 
 (*描画*)
 plot1 = Plot[f[ x], {x, start, end}, PlotLabel -> "Original"];
 plot2 = ListPlot[samples, PlotLabel -> "Samples"];
 plot3 = Plot[g[x], {x, start, end}, PlotLabel -> "Interpolating Function"];
 GraphicsGrid[{{plot1}, {plot2}, {plot3}}],
 {a, 1, 32, 1},
 {{n, 32}, 1, 64, 1}]

CDF Playerがインストールされていれば実際に動かして試せます。UMMでも動きます。


上から、オリジナルの関数・サンプリングデータ・補間結果です。

要は「サンプルをたくさん取ればいいってもんじゃないよ」という話で、標本化定理とかにつなげたかったのでしょう。そういう場合はMathematicaでやるのが簡単です。「補間」自体について学ばせたいときは、Javaのような低レベルな言語を使ってもいいでしょう。

Wolfram CDF PlayerをMathematicaとして使う方法


2016.1.27 Edgeでは動きません。

2015.3.14 Chromeでは動きません。

http://www.unfindable.net/umm3/

計算可能ドキュメント形式(Computable Document Format, CDF)を閲覧するためのソフトウェアWolfram CDF PlayerとMathematicaの関係は、Portable Document Format (PDF)を閲覧するためのソフトウェアAdobe ReaderとAcrobatの関係に似ています。Wolfram CDF Playerで閲覧可能なCDF文書を作るにはMathematicaが、Adobe Readerで閲覧可能なPDF文書を作るにはAcrobatが必要です。

しかし、CDFとPDFには大きな違いがあります。PDF文書は内容が固定された静的な文書であるのに対して、CDF文書は内容を変化させられる動的な文書です。下はCDF文書の簡単な例です。Wolfram CDF Playerがインストールされている環境なら、aの値を変えながらSin[a x]をプロットしてみることができます。CDF文書の内容は計算によって変化するのです。


Sin[a x]のaの値を変えられるなら、もっと大胆に「Sin[a x]」という式全体を変えられるのではないかと考えるのは自然でしょう。Mathematicaの式を処理できるCDF文書、それはMathematicaとして使えるCDF文書です。使い勝手は多少悪くても、「Mathematicaを使いたいけれど高すぎて買えない」という人にとっては有用でしょう。みんな大好きWolframAlphaも、Mathematicaのすべての機能を使えるわけではありませんし。

残念ながら、直接的な方法はうまくいきません。CDF文書に入力できるのは数値だけであり、「Sin[a x]」のような文字列は入力できないからです。しかし、コンピュータ上で表現されるすべてのものは、メモリ上では数で表現されています。「Sin[a x]」のような式ももちろん数で表現されています(メモリのことがよくわからない人は、ゲーデル数を思い出してもいいでしょう)。ですから、Mathematicaの式を一度数値に変換してからCDF文書に入力し、CDF文書内でそれを元に戻すというような工夫をすれば、CDF文書で式を扱えます。このアイディアを実現したのが、以前紹介したUniversal Mathematica Manipulator (UMM)です。

UMMには、Mathematicaの式を変換してできる数値が長大なため入力に手間がかかるという問題がありました。Wolfram CDF Playerには、文書上でクリップボードからの貼り付けができないという制約があるため、長大になる数値をCDF文書上で入力するための面倒な仕掛け(VBScriptやAppleScript)が必要でした。(Mathematicaに付属するCDF Playerなら貼り付けられます。このように仕様がばらばらなことが後で混乱を生まないことを祈ります。)

ここでは別の方法を紹介します。

まず、Wolfram CDF Playerをインストールします。これがなくては始まりません。

次に、PHPを使えるウェブサーバをlocalhostに用意します。WindowsならXAMPPを導入するのが簡単でしょう。

下のような内容のexpression.phpをhttp://localhost/umm3/expression.phpというURLで呼び出せるようにしておきます。ディレクトリumm3は、ウェブサーバから書き込めるようにしてください。

<?php

$file = 'expression.txt';

if (isset($_GET['body'])) {
  file_put_contents($file, $_GET['body']);
  echo $_GET['callback'].'()';
} else {
  if (is_file($file)) echo file_get_contents($file);
  echo '(* OK *)';
}

PHPのmagic_quotes_gpcがOffであることを確認します。XAMPPの場合はデフォルトでOffになっています。Macの場合はphp.iniを編集してApacheを再起動する必要があるかもしれません。

http://www.unfindable.net/umm3/にアクセスします。

お約束ですが、上の手順がよくわからない人は、拙著『Webアプリケーション構築入門』などを参照してください。

以上の準備ができたらhttp://www.unfindable.net/umm3/にアクセスします。ピタゴラス3体問題のような比較的大きなプログラムも実行できることを、Wolfram CDF Player 8.0.4(Win, Mac)で確認しています。

円周率の近似値を手元に置くこと


B00264YQ80

円周率の近似値が印刷されたマグカップを手元に置くのが一つの手です。

487310002X

円周率の近似値が印刷された書籍、牧野貴樹『円周率1000000桁表』を手元に置くのも一つの手です。

必要な時にすぐ計算できるように、スーパーπをダウンロードしておくのも一つの手です。スーパーπはかなり前からある有名なプログラムで、ベンチマークなどでもよく使われています。本稿執筆時点で、419万桁の計算時間を集めたサイトスーパーπランキングのトップは、Intel i7 2600K@5.454GHz (Sandy Bridge)の35秒とのこと。私のマシン(Core i7 930)では121秒でした。

Mathematicaを使うのも一つの手です。Mathematicaが手元にない人は、UMMで代用してもいいでしょう。スーパーπのベンチマークと同じだけ計算したい場合は、「pi = ToString@N[Pi, 4194307];」とします。有効な結果はStringDrop[pi, -2]です(最後の2桁を捨てる)。私のマシン(Core i7 930)では16秒と、スーパーπよりかなり速く計算できました(もちろん計算結果は同じです)。

結果をそのままファイルに書き出しても4MB程度なので、「記録しておくより、必要な時に計算したほういい」という状況ではありませんが。

Audio Function Generator



4873114837Wolfram CDF Playerがインストールされていれば動きます(UMMでも動きます)。RSS Readerでは何も見えないかもしれません。

With[{functions = {Sin,
    TriangleWave[#/2/Pi] & -> "Triangle",
    SawtoothWave[#/2/Pi] & -> "Sawtooth",
    SquareWave[#/2/Pi] & -> "Square"}},
 Manipulate[Play[
   volume1 function1[2. Pi frequency1 t] +
    volume2 function2[2. Pi frequency2 t] +
    volume3 function3[2. Pi frequency3 t],
   {t, 0, 3}, SampleRate -> sampleRate],
  {function1, functions},
  {function2, functions},
  {function3, functions},
  {{frequency1, 440}, 20, 8000},
  {{frequency2, 550}, 20, 8000},
  {{frequency3, 660}, 20, 8000},
  {{volume1, 0.5}, 0, 1},
  {{volume2, 0}, 0, 1},
  {{volume3, 0}, 0, 1},
  {{sampleRate, 8000}, 1000, 44100}, ContinuousAction -> False]]

ボリュームは相対評価です。