2008-08-05[n年前へ]
■エクセルでシミュレーション Vol.6 「夏にフライパンで卵焼き 編」
「表計算ソフトウェアでシミュレーションをする」という講習を見続け、何よりも面白かったのが「非定常の3次元熱計算を簡単に、それでいて、できる限りきちんと計算をやってみよう」という(I氏が講師の)シリーズです。
一次元非定常の熱拡散問題を陰的解法で解く「熱伝導方程式を表計算ソフトで解くサンプル」は多いように思いますが、「非定常の3次元熱計算を表計算ソフトウェアで解く簡単にやるテクニック・サンプル」は、(私は)他では見たことがありません。しかも、このシリーズは本当に簡単で、なおかつ、できる限り精度を保証して解く、というとても稀有な例です。「難しい問題」を「簡単に」「きちんと」「精度を保証して」解く…といったようなものたちは相反することが多いわけですから、そういったものを兼ね備えているというのは、とても珍しいと思うわけです。
下の例は、そのテキストを利用して、陽的解法で安定性条件が成り立つようにして、「夏の朝に、角型フライパンをコンロで加熱した際のフライパン温度分布」を計算した例になります。ある厚みを持ったフライパンが、コンロのガスの炎が当たっている部分が「100度」に(熱)されているような条件の時、フライパンの温度分布が時々刻々と変わっていくようすを計算した結果です。こんな計算をエクセルで数回しておけば、「美味しい卵焼きを作るための最適条件・最適なやり方」を導き出すことだってできるかも、と思わされるのです。エクセル上で、フライパンの厚みや熱伝導度を変え、コンロの炎分布を色々変えてみたりしたならば、究極・至高の卵焼きを作るための最適・必須条件が見つかるかもしれない、と楽しく思えてきたりします。
ところで、この「非定常3次元熱計算」のエクセルシートは、本当に簡単に作ることができるのですが、その一方で、このシートは(簡単なのに)実に巧みに作られています。だからこそ、「難しい問題」を「簡単に」「きちんと」「精度を保証して」解くことができるわけです。
その「巧みさ」を紐解いてみると、これが実に綺麗なパズルのようで、とても面白いのです。・・・というわけで、その「巧みさ」「面白さ」についての感想文は、また後ほど書いてみようと思います。
2008-08-06[n年前へ]
■エクセルでシミュレーション Vol.7 「吉野家の法則 編」
「安い」「早い」「旨い」を兼ね備えたものは売れる、というのが「吉野家の法則」の第1法則である。けれど、それら3つのことは相反することが多いために(「吉野家のジレンマ」)、それら3つのうち最低2つのものがあれば売れることが多い、というのが「吉野家の法則」の第2法則だ。
「表計算でシミュレーション」というお題で、この吉野家の法則の「安い」「早い」「旨い」を考えてみよう。
まずは「安い」である。それを言いかえれば、「簡単に手に入れることができる」ということだ。まず、「表計算でシミュレーション」はこの「安い」という条件を非常に上手く満たしている。
- 表計算ソフトウェア・エクセルを持っている人は多いから、必要な道具を手に入れることが簡単である。
そして、次の「早い」である。これを言い換えてみると、「すぐにできる」ということだ。「表計算でシミュレーション」をする場合には、たとえば、時間的に変わらない(定常な)問題であれば、比較的簡単に計算シートを作ることができる。だから、すぐにできるようなシートを作ることができる範囲内では、「表計算でシミュレーション」というものはとても「早い」のである。ただ、あくまで「比較的簡単に計算シートを作ることができる範囲内では」ということが少し尾を引くのである。
問題は、最後の「旨い」である。これは、多分、2つの意味がある。ひとつは単純に「実利的なメリット」だ。つまり、たとえば「すぐに仕事に使える」というようなことになる。そして、もう一つは「心としてのメリット」である。それは、たとえば「面白い」「意外だ」「へぇ~」といったような感覚を得ることだと思う。
先の「比較的簡単に計算シートを作ることができる範囲内では」という先の制限は、これらふた種類の「旨い」と相反することが多い。それが、「表計算でシミュレーション」における吉野家のジレンマなのである。すぐに仕事で使うためには、「定量的に計算結果が正確である」ようなことが要求される。しかし、そうしようとすると、シートを作るのが面倒だったりして、「早い=すぐにできる」ではなくなりがちになってしまう。
また、「早い=すぐにできる」ようなものは、比較的「当たり前」の計算結果が出てくる。たとえば、等方・等質的な空間でラプラス方程式で解いた静電界計算結果などは、「見た目にいかにも”自然”なもの」になる。それが”自然”なのだから、それでいいではないか、とも思う。しかし、その一方で、それでは意外性も何もなく、「へぇ~」「面白い」という感じを受けないのである。
このように、「安い」「早い」「旨い」という吉野家提供の三つの評価軸から、「表計算でシミュレーション」を眺めてみると、「表計算でシミュレーションをする講習」が持ちがちな悩みが見えてくる。「早い」と「旨い」の兼ね合いの難しさが見えてくる。
昨日の『エクセルでシミュレーション Vol.6 「夏にフライパンで卵焼き 編」』の場合は、腕が良いシェフ(I講師)吉野家の法則の3評価項目を見事に上手く兼ね備えているのである。
2009-03-25[n年前へ]
■エクセルのワークシート・サイズを広げて欲しい!?
表計算ソフトであるMicrosoft Office Excel を使わざるをえない状況になった時、ワークシートのサイズ上限が小さくて困ることがある。あるいは、めんどくささを感じることがある。次に示すように、最近のバージョンでは、サイズ上限が広げられてはいるものの、それでも少ないと感じてしまう。
- バージョン2007: 65536行(縦)×16384列(横)
- バージョン97,2000,2002,2003: 65536行(縦)×256列(横)
では、バージョン2007以降、つまり、1048576(修正前:65536)行(縦)×16384列(横)であれば良いか、というと時系列データを扱うには、データ数が1048576(修正前:65536)行個では全然足りないということが多いと思う。たとえば、1nsごとにデータを取得したデータがあったとしたならば、1048576(修正前:65536)行個のデータはたった1.048576秒(修正前:0.065秒)に過ぎないのである。
データ解析をするときには、「数は力」である。「力」というと誤解を生むかもしれないが、データは多くの量を扱えば扱うほど、とても素直な性質を見せてくるのは、事実である。
エクセルをメインで使う人が(まだまだ)とても多いこの世の中、エクセルのワークシート・サイズをもっともっと広げて欲しい、と思う。
(Ver.2007 行数の修正を行いました)
2009-05-31[n年前へ]
■続 エクセル2007のマルチスレッド機能
エクセル2007のマルチスレッド機能について調べていると、こんな記事がありました。この記事に書かれている結果からは、マルチスレッド機能の効果は大きいように見えます。少なくとも、マルチスレッドか、シングルスレッドであるかの違いは大きいように思えます。
Time to recalculate MBRM UNIVOPT benchmark speed test spreadsheet
Test 1: Single core machine
Using Excel 2003 69.5sec.
Using Excel 2007 69.5sec.
Test 2: Dual-core machine
Using Excel 2003 88.97sec
Using Excel 2007 with 1 calculation thread 88.8sec.
Using Excel 2007 with 2 calculation thread 45.74sec.
Using Excel 2007 with 3 calculation thread 45.03sec.
それでは試しに、というわけで「ベンチマーク for Excel 2000」で、マルチスレッド機能(CPU数=1 or 2)の違いを見てみました。その結果が下の2つのグラフ(の赤表示部分)です。上がマルチスレッド有効にした場合で、下がシングルスレッドの場合になります。スレッド数での違いは、やはりほとんど見られません。
とはいえ、ファイル保存形式を変えてみても、エクセルのメニューバーには「互換モード」と表示されているのが気にかかるところです。もしかしたら、今回試してみた方法では、Excel 2007特有の機能は使われていないのかもしれません。
・・・というわけで、やはり、エクセルに深入りすると、必ず恐怖の時間底無し泥沼が待っているような気持がしてきました。
2009-07-14[n年前へ]
■「エクセルで電界シミュレーション」と「ウィンドウ半透明化マクロ」
「各種方程式を差分化する方法を学び、実際に表計算ソフトで電界シミュレーションと伝熱シミュレーションをできるようになろう」という講習会を手伝う準備をした。準備のひとつに、受講者の実習作業を前もってやってみる、というのがある。すると、どの部分がわかりにくいとか・難しいとかいったことがわかる。
表計算ソフトで電界シミュレーションをする時に、「わかりにくい」と感じる部分のひとつが、複合誘電体の電界計算だ。差分化の仕方と、その差分化されたものを表計算ソフトへどのように実装するかにもよるが、今行っている実習では複合誘電体の電界計算部分に、わかりにくい部分がある。
その実習では、ポワソン方程式を解くために、エクセルの3つのワークシートを使う。電位を計算するシート・空間の各領域における誘電率分布を入力するシート・空間の各領域における電荷分布を入力シート、という具合である。そして、わかりにくいのが、「電位分布シート」と、「誘電率分布シート」「電荷分布シート」、のセルの空間的な意味が少し異なる、ということだ。「電位分布シート」の各セルが空間上に一定長刻みで作られた各格子「点」を意味するなら、「誘電率分布シート」「電荷分布シート」では、各セルは格子で囲われた各領域を示すのである。各セルの意味合いが異なる結果、空間的な位置は、「電位分布シート」に対して「誘電率分布シート」「電荷分布シート」のセルは「半セル分」ずれることになる。そのズレが一番最初はわかりづらいのである。
そこで、「Excel Hacks 第2版― プロが教える究極のテクニック140選」に載っていた「エクセルのVBAマクロからWindows APIを使い、エクセルのウィンドウを半透明化するテクニック」を使い、「電位分布シート」を開いたエクセルウィンドウを半透明化し、「誘電率分布シート」などと重ねて眺めてみることができるようにしてみた。それが、右上の画像と下の動画である。ひとつのファイルをふたつのエクセル(アプリケーション)から開いた状態で、「電位分布シート」を開いているエクセルでマクロを実行すると、「電位分布シート」の下に「誘電率分布シート」が透けて見える。そして、シート間の位置関係を正しく示すようにウィンドウを並べてやれば、各セルが示す「」場所のズレを体感できるだろう、というわけである。
下の動画の場合は、「誘電率分布シート」には赤罫線がひいてあり、「電位分布シート」には青罫線をひいてある。そして、それらが半セルずれていることが体感できるようにしてみた。
ちなみに、エクセルの半透明化マクロは、Windows API上の関数を定義した後に、
mywnd=FindWindow("XLMAIN", Application.Caption) oStyle=GetWindowLong(mywnd,GWL_EXSTYLE) SetWindowLong mywnd,GWL_EXSTYLE, oStyle Or WS_EX_LAYERED SetLayeredWindowAttributes mywnd,0, (255*60)/100,LWA_ALPHAという風にしてやることで、エクセルのアプリケーション・ウィンドウを半透明化させている。もしも、半透明化を戻したければ、
mywnd=FindWindow("XLMAIN", Application.Caption) SetWindowLong mywnd,GWL_EXSTYLE,oStyleというコードを実行すれば良い。それほど使う状況があるとは思いづらい"Excel Hack"だが、VBAマクロからWindows APIを叩けば、Excelからでも「どんなことでもできる」と思わせるサンプルとして、結構面白い。