Perl から Lua : 関数Fitting ( By gnuplot )

2017-01-06 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-01-04)の記事「Perl から Lua : TIFF画像ファイルの入出力
に続いて、・・・・・

かれこれ3年ほど前に “Perl”で書いていたものを、
Lua”と云っても “GSL Shell”に移植するための準備その2。

関数フィッティング処理があった。
当時は、Perl だけではムリだと思い、R 言語の力を借りた。

当時の Perl では、以下の様なコード:
# ・・・・・
# ・・・・・
$yfx = 'nls( y ~ exp( -x / a ), start = c( a=1 ), algorithm = "port" )';
@coef = &FittingByR( $yfx, \@x, \@y ); # 関数形、X値、Y値 を入力、係数:a を返す
$a=$coef[1]; # 求めたいもの。
#
# ======================================================================
sub FittingByR{ # 関数形、 X値、 Y値、 要素数
$YFX=$_[0]; $X=$_[1]; $Y=$_[2]; $nn=$#{$X};
open ( OT , ">tmp.R" );
print OT "x <- c(\n";
for( $n=0; $n<$nn; $n++ ){ print OT $$X[$n], ",\n"; }
print OT $$X[$nn], "\n";
print OT ")\n";
print OT "y <- c(\n";
for( $n=0; $n<$nn; $n++ ){ print OT $$Y[$n], ",\n"; }
print OT $$Y[$nn], "\n";
print OT ")\n";
print OT "fx <- ", $YFX, "\n"; # Fitting Function
print OT 'writeLines( paste(coef(fx),collapse=" ") )', "\n"; # to STDOUT
close( OT );

my $ppp = "Rscript tmp.R |"; # Fitting By 'R'
open( IN , $ppp ); my $w=; close( IN );
unlink( "tmp.R" );
return split(/\s+/ , " ".$w); # a, ... を返す
}
# ・・・・・
# ・・・・・
の様にコーディングしていた。
ここで、@x、@y は、事前に定義済。

つまり、R言語で云えば、
x <- c( ・・・ )   # 元の @x
y <- c( ・・・ ) # 元の @y
fx <- nls( y ~ exp( -x / a ), start = c( a=1 ), algorithm = "port" )
writeLines( paste(coef(fx),collapse=" ") )
の様なソースを実行する
ことになる。


この部分を、Lua では、どの様に書く???

関数フィッティングについては、

昨年11月(2016-11-30)の記事「gnuplot で Fitting
において、
  ・・・・・
  ・・・・・
  Luaからgnuplotを呼び出して、
  fitの実行結果から係数を受け取る。
  ・・・・・
  ・・・・・
  Luaからの利用では、
  「fit.log」を読み込んで、
  求まった係数の部分を、先頭30文字分ほど抜き出し、
  1月の記事「Lua 学習:eval 関数」で書いた
assert( load( <文字列> ) )()
を使えば取り込めますネ。
  ・・・・・
  ・・・・・

そこで、
昨年12月(2016-12-12)の記事「Lua & gnuplot : gnuplot モジュール初版
で書いた、自作モジュールを使ってみた。

gp = require'gnuplot'

gp.Open()
gp.Set( 'fit quiet' )

-- x = matrix.vec{ ・・・ }
-- y = matrix.vec{ ・・・ }

gp.DataBlk( '$D', 1, #x, x, y )

gp.Com( 'f(x)=exp(-x/a)' ) -- Fitting 関数

gp.Com( 'fit f(x) $D via a' ) -- フィッティング実行
gp.Close()

IN=io.open('fit.log')
for w in IN:lines() do if string.sub(w,1,1) == '=' then break end end
w = IN:read('*l'); assert(load(string.sub(w,1,30)))(); print( 'a='..a )
IN:close()
os.remove( 'fit.log' )
で、行ける?

OKそう


だが、別のプログラムで
もう一つ Fitting 関数があった。

f(x)=exp(-b*log(x)+c)

gnuplot では、この様な関数に対しては手が出ない???
エラーで停止!


はやり、gnuplot での 関数フィッティングには、限界がある?

出直して来ます。


本日はここまで。


“Perl から Lua ( GSL Shell ) への移植”準備その2は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


161204
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
10 | 2017/11 | 12
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク