hirax.net::Keywords::「表計算」のブログ



2009-10-17[n年前へ]

エクセルからMathematica(無料Player)の計算機能を使う 

 今日は、「Microsoft ExcelからMathematicaの計算機能を使う」ということをしてみたいと思います。エクセル(Excel)のシートにMathematicaのコマンドを入力して、その評価を(無料で使うことができるMathematica Playerに付属する)MathematicaKernel.exeに評価させよう、というわけです。もちろん、その評価された結果をさらに通常のエクセルの機能を使って操ってやろう、ということになります。

 ExcelからMathematicaの機能を使うには、色々な実現方法がありますが、今回は「無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる」で作った、「URIを介して渡されたコマンドを実行した結果を返すWEBサーバ・アプリケーション」とエクセル(Excel)の「WEBクエリ機能」(「Excel VBA WEB連携術―2007/2003対応 」参照)を使って実現してみることにします。

 まずは、「無料配布MathematicaカーネルとNET Framework実装IronRubyでグリッド・Matheatica計算環境は5分で作れる」で作ったサーバを立ちあげましょう。たとえば、

ir.exe mathematicaServer.rb 80
という具合にして、適当なポート(この例であればhttpの標準ポートである80番)でコマンドを待ち受けるWEBサーバが起動します。

 次に、エクセルのセルを選択し、(エクセル2003くらいのバージョン以降に備わっている機能である)「WEBクエリ」をします。エクセル2007であれば、「データ」-「WEBクエリ」で、URLを入力してやるのです。つまり、今回の例であれば、"http://localhost/evaluate/2+2"といった風に入力をしてやれば良いわけです。すると、小さなブラウザ風の画面が表示され、そこに"2+2"の計算結果が表示されます。後は、下のブラウザ風画面の下にある「取り込み」ボタンを押すと、「開いています ダイアログ」が表示された後に、「データを返す先のセル選択ダイアログ」が表示され、セル中にMathematicaカーネルによる評価結果が入力されるのです。エクセルとマセマティカ・カーネルとの間で、httpを介してデータがやりとりされる、というわけです。

 その実行過程を、もしも、エクセル側のVBAマクロを使って行うと、こんな具合になります。

Sub httpGet()
 Range("E3").Select
 With Selection.QueryTable
  .Connection = "URL;http://localhost/evaluate/2+2"
   .WebSelectionType = xlEntirePage
   .WebFormatting = xlWebFormattingNone
   .WebPreFormattedTextToColumns = True
   .WebConsecutiveDelimitersAsOne = True
   .WebSingleBlockTextImport = False
   .WebDisableDateRecognition = False
   .WebDisableRedirections = False
   .Refresh BackgroundQuery:=False
 End With
End Sub

 つまり、エクセルを使っているように見えて、そのエクセルは実は単なるMathematicaカーネルのフロントエンドとして使われている、というようなワザも行うことができるわけです。しかも、そのMathematicaカーネルは、(無料で使うことができるMathematica Playerに付属する)MathematicaKernel.exeだったりするわけで、「安い・うまい・早い」の三拍子が揃った、超お手軽便利ツールになる可能性があります。そう考えると、プロトタイピングお手軽版ではなく、真面目にMathematicaカーネルを操作するWEBアプリを書いてみようか…という気になってきます。

2009-10-20[n年前へ]

「美的曲線」を基準に「理想のバスト形状」を作り出すエクセル・シートを作る 

究極の美的バスト形状作成コンテスト!?

 「理想のバスト形状とはどういうものですか?」と聞かれたことがあります。色々な答えがあると思うのですが、その時、ふとこんなことを思いつきました。思いついたのは、適当なバスト形状を作成し、その形状がどれだけ「理想」に近いかの評価関数として「美的曲線」というものを使うことができるのではないか、「美的曲線」からのズレを「理想からのズレ」と評価し・参考にすることで、美的に最適化された理想のバスト形状を作ることが簡単になるのではないか、というアイデアです。ちなみに、美的曲線とはこのようなものです。

 美的曲線に関して,和歌山大学の原田利宣先生が,「自然界や人工物におけるさまざまな美的曲線の多くは,曲率対数分布図が直線で近似できるということ」を指摘されました.原田先生が調べた美的曲線には,蝶の羽や自動車のボディのキーラインなどが含まれています.美的曲線の特別な場合として,曲率対数分布図における直線の傾きα=-1の場合にはクロソイド曲線,α=1の場合には対数螺旋となることが指摘されています.本研究では,曲率対数分布図が直線で表される曲率変化の単調な平面曲線を美的曲線と呼びます.

 アイデアを思いついたら、まずはプロトタイピング(アイデアを簡単に形にした試作物)を作ってみるのが、アイデアが正しそうかを見極める常道です。・・・というわけで、「美的曲線」を基準に「理想のバスト形状」を作り出すエクセル・シート」を作ってみました。それが、simulation.xls 48kB になります。エクセル・シートは大体下図のような具合です。

 中身はどうなっているかは、一見しただけではわかりにくいかもしれません。それがExcelを使った作業効率が長期的に見ればとても低い大きな問題点のひとつだと思います。けれど、よくありがちな言い訳説明ですが、「エクセルシートをとりあえず適当に眺めてみれば、わかるだろう」と思います・・・。

 このシートは、まず最初に円形(三次元的には球形の)バストがあります。それが(右側のグラフで言うと)紺色のグラフです。ちなみに、このグラフに示されたバスト形状は90度右に回転して、右向きになっていると思って眺めてみて下さい。また、このバスト形状グラフの単位は、すべてミリメートルになっています。

 さて、これだけではつまりません。次は、一番左側の列に適当な数値を入れると、そのバストの形状が変化します。つまり、あなたが「任意のバスト形状」を作り出すことができるのです。ちなみに、この計算では補正形状を作成する際に、「”繰り返し”計算をさせる(収束するまで)ことで滑らかさを表現している」言い換えると、ラプラス方程式を満たすように(実際には、あなたが入力した補正パラメータが入っているので、むしろポワソン方程式というべきかもしれません)作成されるので、エクセルのオプションで「反復計算」を行うように設定しておきましょう(これはエクセルで離散化された方程式を解く際に用いる常套手段です)。

 そして、その際の「美的度」を示すグラフが右図です。これは、作成したバスト形状を「曲率対数分布図」で表したものです。一番最初のデフォルト形状バスト=半円(半球)バストでは、何だか複雑な曲線のようで「(直線形状を示す)美的曲線」にはなっていません。しかし、適当な補正係数を入れて、バスト形状を変化させてやると、次第に「曲率対数分布図が直線を示す」ようになってきます。つまり、美的な「バスト形状」ができあがってくるのです。それが、たとえば右上にある紫の線で示したバスト形状です。この形状の時の曲率対数分布図は、比較的直線状に分布していることがわかります。

 さて、エクセルを使う作業というのは実に単調で、実務的で、ワクワク感がありません。しかし、今回のようにエクセルを使い、「美的曲線」を基準に「理想のバスト形状」を作り出すエクセル・シートがあったりしたら、どうでしょうか?エクセルを使う作業が、少しは楽しく感じられたりはしないでしょうか?

 さて、もし最高に「美的なバスト形状」を作られたりしたならば、ぜひとも私宛に送って頂ければ幸いです。「これはすごい」という感動的に美的なバスト形状=実に見事に曲率対数分布図上で直線を示すバスト形状を作られた方には、「科学実験詰め合わせセット」をプレゼントさせて頂こうと思います。ミニ顕微鏡やら、警察鑑定セットやら・・・色々ありますので、とりあえず「これぞ再考というバスト形状」をお待ちしております。"Beautiful Bust Curve Award"開催です。

「美的曲線」を基準に「理想のバスト形状」を作り出すエクセル・シートを作る「美的曲線」を基準に「理想のバスト形状」を作り出すエクセル・シートを作る「美的曲線」を基準に「理想のバスト形状」を作り出すエクセル・シートを作る






2009-10-25[n年前へ]

「美的曲線」基準の「理想バスト形状」作成エクセル・シートを手直しする 

続 「美的曲線」を評価関数に「理想バスト形状」を考えよう

 「美的曲線」を基準に「理想のバスト形状」を作り出すエクセル・シートを作るで、「美的曲線」を基準に「理想のバスト形状」を作り出すエクセル・シート」を作ってみました。

 思いついたことは、適当なバスト形状を作成し、その形状がどれだけ「理想」に近いかの評価関数として「美的曲線」というものを使うことができるのではないか、「美的曲線」からのズレを「理想からのズレ」と評価し・参考にすることで、美的に最適化された理想のバスト形状を作ることが簡単になるのではないか、というアイデアです。
 今日は、そのシートを少し眺めやすいように替えてみました。具体的には、前回のグラフでは縦横配置が分かりにくかったので、バスト形状を示すグラフの縦横軸を交換してあります。また、Excel 2007を使ったので、見た目が前回に比べると少し綺麗なものになっている、という具合です。…もちろん、ただいじるだけでは面白くないので、「理想のバスト形状」に少しでも近づこうと”少し”、「手作業チューニング」をして遊んでしまいました。

 作成したエクセルシート(Excel 2003以前版と2007版は、日をおかずサーバからダウンロードできるようにしようと思います。とりあえず、今回のエクセル・シートで作成したグラフが下の図になります。左のグラフが「半球形状バスト(赤線)」と「作成形状バス(青線)ト」で、右のグラフがどれだけ「美的曲線」に近いかを示す曲率対数分布図です。

 さて、果たして「美的」と感じられるでしょうか?人それぞれ色々な感覚・感性があるでしょうから、一概に「美的だ」と言い切ることはできないと思いますが、少なくとも半球形状バストよりは「美的」なのではないでしょうか?

 時間ができた折には、C++か何かで自動最適化形状作成処理も含めた、GUIソフトでも作ってみようと思います。…というわけで、最近とんと更新していなかった「できるかな?」を2週連続で更新してみました。

「美的曲線」基準の「理想バスト形状」作成エクセル・シートを手直しする  






2009-11-15[n年前へ]

クラスタで計算可能なスーパーコンピュータ向け「Excel」を開発中 

 「MS、スーパーコンピュータ向け「Excel」を開発中--クラスタで計算可能に

 Microsoftは米国時間11月16日、スーパーコンピューティング分野の主要なカンファレンスにおいて、強力なクラスタサーバ向けに再設計された「Excel」スプレッドシートのテスト版を発表した。

 クラスタ上でのExcelのパフォーマンス改良を進めることで、通常ならば計算に数週間を要していたようなスプレッドシートでも、わずか数時間で稼動するようになると、Microsoftは説明している。

2009-12-07[n年前へ]

エクセルの計算ワークシートをRuby計算スクリプトに変換してみよう 

 下記で使ったエクセルファイルは、自己参照部分がなく、つまり反復計算が必要ないものを使ってしまいました。反復収束計算が必要なエクセルファイルを「続 エクセルの計算ワークシートをRubyでC言語に変換してみよう」 でサーバ内に置きましたので、下記記事を読んだ後には、上記記事(さらにその後に続く記事など)を引き続きご覧ください。


 目的に対して達成方法があまりに過剰、あるいは、あまりに的外れで荒唐無稽なものというのは、それはそれで何だか面白いような気がします。

 今日は、そんなものを、ふと、けれど無性に作ってみたくなりました。

 先日、Microsoft Excelのような「表計算ソフト」スプレッドシートを使った「静電界計算や非定常熱伝導シミュレーション計算」をみっちりしてきました。離散化された物理式を表計算ソフトウェアを用いて計算を行うというのは、「セル」というメッシュと空間が感覚的に近く感じられることから、とても自然にシミュレーション計算を行う空間分割と計算領域との対応を感じることができるのが、とても便利で良いと思っています。

 もちろん、セル間の計算を「反復計算」を行うことで、複雑なことを気にせず、計算が自然に終わってしまう、というのも実に「自然」で「お手軽」で良い、と思っています。

 とはいえ、私はエクセルは苦手です。毎年何回か、エクセルでのシミュレーション計算を(悩んでいる)人に教えるという作業をするのですが、それでもエクセルを使うのは苦手です。そこで、エクセルで作った離散化シミュレーション用.xlsシートをRuby Script(プログラム)に自動的に変換する、Rubyスクリプトを作ってみることにしました。そう、「エクセルで物理シミュレーションを学んだ人が、そのエクセルシートをそのまま多言語に移植することができる」スクリプトを作ってみよう、と考えてみたのです。

 作ったコードxls2rb.rbは次のようになります(近日中にサーバに置いて置きます)。これは、「反復計算を使った」エクセルファイルを読み込み、それをRubyスクリプトに変換するスクリプトです。「表計算ソフト」スプレッドシートを使いった「静電界計算や非定常熱伝導シミュレーション計算」は、四則演算と周囲の空間が持つ値の計算だけで行うことができます。だから、そういう「条件」下では、そんなスクリプトを作るのも比較的簡単です。初期化や反復計算をそれぞれ「関数」化しているとはいえ、変数はすべてグローバル変数ですし、そこら辺の「エクセル感」も再現してみたスクリプトです。

require 'win32ole'

def getAbsolutePath(filename)
  fso=WIN32OLE.new('Scripting.FileSystemObject')
  fso.GetAbsolutePathName(filename)
end

def getAlphabet(n)
  val=n.to_f/25.0 
  mod=n%25
  result=''
  result+=('a'..'z').to_a[(n-val)/25] if val>1
  result+=('a'..'z').to_a[mod]
end

def defFunc(state,book)
  src=''
  book.Worksheets.each do |sheet|
    y=1
    sheet.UsedRange.Rows.each do |row|
      x=0
      record=[]
      row.Columns.each do |cell|
        if state==:init &&cell.Value!=''
          record<<'  '+'$'+getAlphabet(x)+y.to_s+
            '='+cell.Value.to_s if cell.Value.to_s!=''
        end
        if state==:calc &&cell.Formula!=''
          t=cell.Formula.sub(/[=$]/,'')
          t=t.downcase.gsub(/([a-zA-Z]+\d+)/,'$\1')
          record<<'  '+'$'+getAlphabet(x)+y.to_s+'='+t
        end
        x+=1
      end
      src+=record.join("\n")+"\n" if record.join('').gsub("\n",'')!=''
      y+=1
    end
  end
  return src
end

filename=getAbsolutePath(ARGV[0])
excel=WIN32OLE.new('Excel.Application')
book=excel.Workbooks.Open(filename)
initsrc=defFunc(:init,book)
calcsrc=defFunc(:calc,book)
book.close
excel.quit
GC.start

puts <<INIT
# autocreated ruby script from excel file
# jun hirabayashi jun@irax.net http://www.hirax.net

def init
#{initsrc}end

def calc
#{calcsrc}end

10.times do
  calc
end
INIT

 ちなみに、このスクリプトを

ruby xls2rb.rb ex.xls
という具合にして(引数は変換したいXLSファイルです)、実行すると、次のようなスクリプトができあがります。ちなみに、ここで使ったex.xlsファイルは、ラプラス方程式を3X3のセルに離散化し解く、実に単純なエクセルシートです。(この辺りのファイル一式を週末にでもサーバ上に置いておきます)
# autocreated ruby script from excel file
# jun hirabayashi jun@irax.net http://www.hirax.net

def init
  $a1=1.0
  $b1=2.0
  $c1=3.0
  $a2=1.0
  $b2=2.0
  $c2=5.0
  $a3=1.0
  $b3=2.0
  $c3=3.0
end

def calc
  $a1=1
  $b1=2
  $c1=3
  $a2=1
  $b2=2
  $c2=$b2+$c1
  $a3=1
  $b3=2
  $c3=3
end

10.times do
  calc
end
 つまり、今日私が作ったスクリプトの動作は、エクセルが最初に行う初期化ルーチンを"init"関数として定義(作成)し、次に行う反復計算を"calc"関数として定義(作成)し、それを(適当に決めた)10回繰り返すスクリプトを作り出す、という具合です。ポイントは初期化時には、cell.Valueを用いることで初期数値を設定し、逐次計算時にはcell.Formulaを使うことで数式を使う、という「使い分け」になります。反復計算自体は、ガウスザイデル法によって行われます。

 あとは適当に、知りたい値を出力する(たとえば、"puts $c2"といった)出力処理文でも書き足せば、はい、シミュレーション・rubyプログラムのできあがり、というわけです。

離散化された物理計算をするために作成したエクセル・シートを、Rubyスクリプトに自動で変換し、好きに加工できるプログラム…って便利なような、そもそもそんな用途ってある訳ないような…というのが正直で的確な感想だと思います。つまり、それはかなり無意味なツールです。

 他の言語に置き換えて、高速化指向の変換プログラムを書いてみるのも(一回くらいはやってみようと思いますが、今ひとつ「魅力」に欠けるように思います。

 今日作った、「離散化された物理現象を計算するために作成したエクセル・シートを、Rubyスクリプトに自動で変換するプログラム」なんていうものを、(何だか馬鹿馬鹿しいけれど)意外に少し面白い笑える、そう思える人が一人でもいたら、幸いに思います。



■Powered by yagm.net