Bus errorとSegmentation faultに困ったら見るブログ

物理の研究者による日々の研究生活のメモ書きです ( python/emacs/html/Japascript/シェルスクリプト/TeX/Mac/C言語/Linux/git/tmux/R/ポケモンGO)

【awk】極大極小、最大値、最小値を求める

まずはデータ生成
これもawkでやってしまおう

awk 'BEGIN{fs=10.0;for (i = 0; i < 10000; i++){t=i/fs; print t, sin(2*3.14*t*10)}}' > hoge.txt

# もっと桁数が欲しい場合は
# ちなみに後述のawkコマンドを走らせてきちんと結果を得るためには桁数が必要なので、こっちで
awk 'BEGIN{fs=10.0;for (i = 0; i < 10000; i++){t=i/fs; printf "%.10e %.10e\n", t, sin(2*3.14*t*10)}}' > hoge.txt

データ



このデータの最大値を求めるには
awk 'NR==1 {max=$1} {if($1 > max) max = $1} END {print max}' hoge.txt
最小値は、
awk 'NR==1 {min=$1} {if($1 < min) min = $1} END {print min}' hoge.txt
極大値、極小値を求めるには
awk 'NR==1{x=0} NR>1 {diff1=diff2; diff2=$2-x; x=$2} {if(diff1*diff2<0)print $1}' hoge.txt > foo.txt
これらを重ねてプロットしてみる
plot "hoge.txt" w l lw 2 lc 6, "foo.txt" w p pt 5 ps 2 lc 7
sin
赤い時刻が極大値または極小値
もしそれらをバラバラに知りたかったら

awk 'NR==1{x=0} NR>1 {diff1=diff2; diff2=$2-x; x=$2} {if(diff1*diff2<0 && diff1>0)print $1, 1}' hoge.txt > maximum.txt
awk 'NR==1{x=0} NR>1 {diff1=diff2; diff2=$2-x; x=$2} {if(diff1*diff2<0 && diff1 <0) print $1,-1 }' hoge.txt > minimum.txt
でおk

プロットは

plot "hoge.txt" w l lw 2 lc 6, "maximum.txt" w p pt 5 ps 2 lc 7, "minimum.txt" w p pt 5 ps 2 lc 4

sin

(本当はNR==1のときにdiff2=0ってした方がいい気がするけどまぁいいや・・・)



ランキング参加中です

↓クリックしていただけると嬉しいです〜