2012-04-08[n年前へ]
■エクセルで解く「あみだくじ方程式」と「1次元拡散方程式」
「あみだくじ方程式を1次元拡散方程式を使ってエクセルで解いてみる」 from 「n年前へ」
手抜きあみだくじをするときは、アタリの真上近くを選び、そうでない場合にはアタリに近い端っこを選ぶ、というのが、あみだくじ方程式から導き出されるおトク知識と言えるのかもしれません。
2012-04-13[n年前へ]
■エクセル(表計算ソフト)の「表空間と値の拡張」を考える!?
エクセル(Microsoft Excel)に「型」を追加する機能が欲しいと思うことがあります。たとえば、複素数やベクトルをひとつのセルで扱ったり、さらにはもっと複雑な属性を持つ「値」を扱いたい、と思うことがあります。
そうした「(独自の)型」に対して、演算子を自由に定義できたり、セル内での表示方法を自由に定義できたり(「条件付き書式」の自由度が高ければ、独自型の表示スタイルをカスタマイズすることもできるのでしょうか)したい、と思うことがあります。
…とそんなことを書いたら、ささっと @IchiroMori さんがシート(コード)を書いて・送ってくれました。「セルに入っている文字列を"imreal"と"imaginary"関数で処理し、独自定義の複素数クラスで処理した上で、"Complex"関数で文字列に戻すというコードです。
表計算ソフトというものを考えたとき(エクセルは表計算ソフトという範疇にとどまらないものだと思いますが)、表計算ソフトの基本機能は『「表」上で「値」が簡単に計算できる』ということになります。
そして、そんな表計算ソフトに対して、次の2つの点の拡張をしてみたいと感じることがあります。
1.「表」という部分
格子状の座標だけでなく、任意の「位置関係」「座標系」「空間」…を使いたい
2.「値」という部分
任意の属性・特性を持つ「存在(クラス・インスタンスというか)」を扱いたい(属性・値の演算方法やセル・グラフ上での表示方法も含む)
表計算ソフト(エクセル)の性質『「表」上で「値」が簡単に計算できる』というものを、『空間が各領域で値(属性)を持ち、それらが空間上で作用し合う・作用させ合うことができる』と捉えるならば、その「表」と「値」の拡張ができたなら、一体どんなことができるようになるだろう?と考えたくなります。…空間が各領域で値(属性)を持ち、それらが空間上で作用し合うというのは「世界」持つ基本的な性質ですから、つまりそれは、表計算ソフトが簡単に世界を表現しうるということになります。
「値」の拡張という部分に関しては、独自クラスを定義した上で文字列にシリアライズ・文字列からデシリアライズすれば可能だろうとは思うのですが、演算子や関数をオーバーロードできないと、既存関数の再利用ができなくなったり、何より「使い勝手」が悪くなるように思います(たとえば、ある属性に対して+=PLUSを定義したとき、その定義がSUM 関数やAVERAGE関数に反映されないと不便ですよね?)。
…というわけで、表計算ソフトの「表」と「値」の機能拡張ができたなら?と考えるのです。そうすれば、表計算ソフトは、(ある範囲の)世界を表現するのではないかと考えたりするのです。
2012-04-15[n年前へ]
■例外補足で演算子をオーバーロードするエクセルHack!
エクセル(表計算ソフト)の「表空間と値の拡張」を考える!?の続き、エクセルで「複素数」をセルに入力し、"=A+B"といった”普通の記述の”入力で複素数演算を実現させる、という「Excelの独自型」…まず、その実装方法が面白いです。
①複素数セルA1、A2に対し、=A1+A2のように入力
②#VALUE!エラーが出るので、それを検出(Workbook_Changeを利用)
③検出したセルに対し、入力数式を複素数演算用関数を用いた数式に変換(ここは、数式を解析して汎用に変換する機能が必要ですが、これはたぶんできる)
④変換後の専用関数による数式で計算し、そのまま値を返す
この方針を眺めると、 ”エラーを検出し、エラーの元になった文字列をもとに、拡張処理を実行させる”という実装方法が、"No method"例外を補足し、”見つからない”関数名を元にSQLパターン等を生成し、その関数名で「したいこと」を実現するというRuby on Rails のコードを連想します。
例外補足で演算子をオーバーロードする、という面白く・楽しいエクセル Hackです。
2012-04-16[n年前へ]
■エクセルで2次方程式の「解の配置」を図示してみる!?
(たとえば)2次方程式、つまりx^2+bx+c==0という方程式の実数解を、中学生か高校生の頃、グラフにしてよく眺めたような気がします。しかし、それらの方程式がいつも1個か2個の解を持つにも関わらず、グラフにして眺めるのは「(時にはゼロ個の)実数解」だったような気がします。
そこで、今日は「複素数係数を持つ2次方程式の(複素数)解を”可視化する”エクセルシートを作ってみました(ダウンロード先)。"b"と"c"という2つの複素数を入力すると、(ある程度の範囲の)任意の複素数を"x"とした上で"x^2+bx+c"を計算し、その計算結果がゼロ近くになる部分(どんな複素数値を”x”に代入すれば"x^2+bx+c"という式がゼロになるか)を複素平面上で”可視化”する、というエクセルシートです。
実数(あるいは時に複素数の)係数b,cを持つ2次方程式の、それら係数b,cを自由自在に動かしてみた時の2次方程式の2つの解(の配置や動き方)を眺めてみると、何だかとても面白いものです。たとえば、実数係数の2次方程式を作った時には、実数軸に線対称な2つの共役数が解になったり、複素数係数を入れてみると…何だか綺麗な対応が見えてきたり…と不思議に魅力的な世界が見えてくるのです。
明日は、「係数」をドラッグ&ドロップで動かすと、「解」がどんな風に・どんな配置で動き回るかでも眺めてみよう(眺められるソフトでも作ってみよう)と思います。
2012-06-22[n年前へ]
■続々々 エクセルのワークシートをC++言語プログラムに変換してみよう!
エクセルで(反復計算を用いた)循環参照が行われている計算シートと同じ計算を、C++言語で行うためのC++ソースコードを自動生成するRubyスクリプトを少しだけ更新してみました(github)。
追加したのは、計算した結果を表示する機能と、無駄な数値代入計算をさせないようにしたという部分です。
使い方は、とっても簡単。たとえば、
ruby xls2cpp.rb sample.xls > sample.cppという風にしてXLSファイルからC++ソースコードを生成し(参考:githubのsample.cppなど)、後は、
cl /EHsc /Ox sample.cppとでもし…つまり最適化をバッチリかけてやったならば、計算がバッチリ速くなるかも!?しれません。(エクセルの方が最適化されていて速かったり…とかいうこともありそうですが)
というわけで、エクセルで(たとえば偏微分方程式を離散化して解く)コードをチョチョイと感覚的にプロトタイピングした上で、後はC++コードに変換し・最適化をかけまくる…という、「エクセルプロトタイピング+最適化C++コード自動生成」シミュレーションをしてみるのはいかがでしょう?