hirax.net::Keywords::「スプレッドシート」のブログ



2004-12-16[n年前へ]

JavaScriptで動くスプレッドシート 

 JavaScriptで動くスプレッドシート。計算まではしなくても、これは確かに面白い。 from TokuLog! -Shibuya.pm で僕と握手-

2008-08-06[n年前へ]

エクセルでシミュレーション Vol.7 「吉野家の法則 編」 

 「安い」「早い」「旨い」を兼ね備えたものは売れる、というのが「吉野家の法則」の第1法則である。けれど、それら3つのことは相反することが多いために(「吉野家のジレンマ」)、それら3つのうち最低2つのものがあれば売れることが多い、というのが「吉野家の法則」の第2法則だ。

 「表計算でシミュレーション」というお題で、この吉野家の法則の「安い」「早い」「旨い」を考えてみよう。

 まずは「安い」である。それを言いかえれば、「簡単に手に入れることができる」ということだ。まず、「表計算でシミュレーション」はこの「安い」という条件を非常に上手く満たしている。

  • 表計算ソフトウェア・エクセルを持っている人は多いから、必要な道具を手に入れることが簡単である。
 また、必要なものは決して道具だけでなく、その作業をするための理解力なども必要とされる。その理解に払うための労力・コストも、「表計算でシミュレーション」では安い。なぜなら、離散化された空間が表計算ソフト上のセルとして実感・体感できるからだ。これは非常に納得しやすい。だから、「表計算でシミュレーション」というお題では、「必要な道具をお金を出して手に入れる必要がない」「理解に必要な労力がさほど大きくない」という意味で、非常に「安い」。

 そして、次の「早い」である。これを言い換えてみると、「すぐにできる」ということだ。「表計算でシミュレーション」をする場合には、たとえば、時間的に変わらない(定常な)問題であれば、比較的簡単に計算シートを作ることができる。だから、すぐにできるようなシートを作ることができる範囲内では、「表計算でシミュレーション」というものはとても「早い」のである。ただ、あくまで「比較的簡単に計算シートを作ることができる範囲内では」ということが少し尾を引くのである。

 問題は、最後の「旨い」である。これは、多分、2つの意味がある。ひとつは単純に「実利的なメリット」だ。つまり、たとえば「すぐに仕事に使える」というようなことになる。そして、もう一つは「心としてのメリット」である。それは、たとえば「面白い」「意外だ」「へぇ~」といったような感覚を得ることだと思う。

 先の「比較的簡単に計算シートを作ることができる範囲内では」という先の制限は、これらふた種類の「旨い」と相反することが多い。それが、「表計算でシミュレーション」における吉野家のジレンマなのである。すぐに仕事で使うためには、「定量的に計算結果が正確である」ようなことが要求される。しかし、そうしようとすると、シートを作るのが面倒だったりして、「早い=すぐにできる」ではなくなりがちになってしまう。
 また、「早い=すぐにできる」ようなものは、比較的「当たり前」の計算結果が出てくる。たとえば、等方・等質的な空間でラプラス方程式で解いた静電界計算結果などは、「見た目にいかにも”自然”なもの」になる。それが”自然”なのだから、それでいいではないか、とも思う。しかし、その一方で、それでは意外性も何もなく、「へぇ~」「面白い」という感じを受けないのである。

 このように、「安い」「早い」「旨い」という吉野家提供の三つの評価軸から、「表計算でシミュレーション」を眺めてみると、「表計算でシミュレーションをする講習」が持ちがちな悩みが見えてくる。「早い」と「旨い」の兼ね合いの難しさが見えてくる。

 昨日の『エクセルでシミュレーション Vol.6 「夏にフライパンで卵焼き 編」』の場合は、腕が良いシェフ(I講師)吉野家の法則の3評価項目を見事に上手く兼ね備えているのである。

安い・旨い・早い






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スクリプトに自動で変換するプログラム」なんていうものを、(何だか馬鹿馬鹿しいけれど)意外に少し面白い笑える、そう思える人が一人でもいたら、幸いに思います。

2009-12-08[n年前へ]

Excel 2007で科学技術計算風の等高線グラフを作る 

 表計算ソフト(スプレッドシート)でシミュレーション計算をした後には、必ず計算結果を図示したくなります。「離散化された空間がセルで分割された表に似ていること」そして、表上で計算された結果をグラフ化することが簡単なこと、がMicrosoft Excelのような表計算ソフト(スプレッドシート)の好ましい点なわけですから、必ずと言って良いくらい「表計算ソフト(スプレッドシート)でシミュレーション計算」をした後には、グラフ作成の作業がグリコのオマケのように、必ずと言って良いほど、ついてきます。

 しかし、残念なことに、Excel 2003以前でも、自分でグラフをカスタマイズしなければ、(たとえば)Excel2007で科学技術計算風の等高線グラフを作ることはできません。Excel 2007になっても、実に残念なことに、いまだに同じなのです。一見陰影がついた綺麗なグラフに見えたとしても、それはまるで、何だか昔ながらのエクセルのグラフをただシュールにリアルな筆致で描いたかのようなグラフになってしまいます。

 そこで、今回はExcel 2007用の科学技術計算風の等高線グラフ・テンプレート(右上のチャートがその例になります)を作ってみることにしました。…といっても、私が行ったのは(人から頂いた)カスタマイズされた綺麗なグラフが張り付けられているたExcel 2000形式の.xlsファイルをExcel 2007で開き、その後、新しいエクセルブックを作成した後にグラフも含め全コピーし、グラフをさらに適当にカスタマイズした上で、デザイン-テンプレートとして保存するということだけです。つまりは、ただフォーマット変換作業と、手順解説記述、ということになります。

 まずはこのファイル(rainbow3DContor.crtx)を、C:\Users\Administrator\AppData\Roaming\Microsoft\Templates\Charts といった自分の(ユーザの)Excel用チャートテンプレートを保持するディレクトリに置きます。すると、
挿入-その他のグラフ-すべての種類のグラフ-テンプレート-作ったテンプレート
という手順で、そのカスタマイズされたグラフを一瞬で作ることができるようになります。

 もちろん、一回グラフにした後に、
デザイン-グラフの種類変更-テンプレート-作ったテンプレート
で変更する、という手順でも構いません。どちらの手順でも構いませんが、これで自然な虹色の縦軸(値軸)が0~100の等高線鳥瞰図を作ることができるようになります。

 私自身はExcelは、今でも「時間泥棒」だと思っています。一見、地道に作業を続けているように見えても、それは単に時間を非効率的に売っている作業をしているように思えてしまいます。だから、あまり、Excelが好きというわけではありません。

 とはいえ、エクセルを使わざるを得ない状況というものもやはりあるわけで、そんな場合のために、今日はExcel 2007で科学技術計算風の等高線グラフを作るためのテンプレートファイルを作ってみました。

Excel 2007で科学技術計算風の等高線グラフを作るExcel 2007で科学技術計算風の等高線グラフを作る








■Powered by yagm.net