綾小路龍之介の素人思考

[数値計算] 任意の関数f(x)の表現

C:\>perl -e "$x=4; $a=1; $f[$x]=exp(-$a*$x**2); print $f[$x]"
1.12535174719259e-007
C:\>
C:\>perl -le "$a=1; for(1..10){ $x=$_; $f[$x]=exp(-$a*$x**2); print $f[$x]}"
0.367879441171442
0.0183156388887342
0.00012340980408668
1.12535174719259e-007
1.3887943864964e-011
2.31952283024357e-016
5.24288566336346e-022
1.60381089054864e-028
6.63967719958073e-036
3.72007597602084e-044
C:\>
C:\>perl -le "$a=1; $f[$x]=$x**2; for(1..10){ $x=$_; $g[$x]=exp(-$a*$x**2); print \"$x\t$f[$x]\t$g[$x]\";}"
1               0.367879441171442
2               0.0183156388887342
3               0.00012340980408668
4               1.12535174719259e-007
5               1.3887943864964e-011
6               2.31952283024357e-016
7               5.24288566336346e-022
8               1.60381089054864e-028
9               6.63967719958073e-036
10              3.72007597602084e-044
C:\>

うまくできたと思ったけど、こうするとだめなんだな。つまり上の場合、$f[$x]には何も含まれてはいないから表示もされないわけなんだな。これは$f[$x]を定義した式の右辺に$xが含まれていて、$xがこの時点で定義されていないためなんだな。そこで下のようにしてみるんだな。

C:\>perl -le "$a=1; sub f(){return exp(-$a*$_**2);} for(1..10){ print &f($x)}"
0.367879441171442
0.0183156388887342
0.00012340980408668
1.12535174719259e-007
1.3887943864964e-011
2.31952283024357e-016
5.24288566336346e-022
1.60381089054864e-028
6.63967719958073e-036
3.72007597602084e-044
C:\>

こうするとprint文が実行されたときにサブルーチン&fが引数$x付きで呼ばれて、目的の関数を毎回定義しなくてもよくなるんだな。また、こうすることで余分なメモリを使わなくてすむこともあるんだな。つまり、どうせ1回表示するだけならサブルーチンとして定義しておいたほうがいいということ。

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2007-11-24T02:47:45+09:00
  2. Modified: 2007-11-24T04:46:41+09:00
  3. Generated: 2017-08-24T23:09:21+09:00