Wednesday, August 17, 2016

Эрдмийн ажлын зураг, графикийг Нюфлотоор дүрсжүүлэх /Scientific visualization and graphics with Gnuplot/

Эрдмийн ажлын зураг, графикийг Нюфлотоор дүрсжүүлэх, зурах
Хоёрдугаар хэсэг

Нэгдүгээр хэсгийг эндээс уншаарай.
Сэтгүүл болгон л өөрийн тодорхой шаардлагуудыг хэвлэгдэхээр илгээгдэн ирж байгаа өгүүллүүдэд тавьдаг. Хамгийн гол нь тэдгээр шаардлагыг сайн биелүүлэхийн тулд ямар ч асуудлыг шийдвэрлэх гарцтай байх хэрэгтэй. Бид графикийг ихэвчлэн Эксэл дээр бужигнуулдаг. Энэ ч амархан. Харин хэд хэдэн графикийг хооронд нь тэнхлэгээр нь нийлүүлэх гэх мэт ахисан түвшний ажлууд гараад ирвэл суугай майзаг болоод эхлэнэ. Нэг ашиглаад суричхвал Нюфлот арвин чадвартай. Энэ хэсгээр зарим нэг чухал үйлдлүүдийг хийж сурсанаар та бүгдтэй хуваалцая.

Муруйд тохирсон регрессийн тэгшитгэл зохиож зурах
Тоон өгөгдөлд тохирох шугаман болон өндөр эрэмбийн регрессийн тэгшитгэлийг эксэл дээр ч хийгээд коэффициентуудыг нь олж болно. Гэхдээ Нюфлот нь өөр дээрээ итераци хийж хамааралтай бүх хэмжигдэхүүнүүдийг тодорхойлдог. 
Энэ жишээнд postscript терминалыг ашигласан болно. Өндөр чанартай вектор зураглалуудыг ихэвчлэн postscript хийж болдог. 

 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
31
32
33
34
35
# this script for compare remaining ice area
 reset
 set term postscript landscape enhanced font "Times-New-Roman, 30"  #size 700,500 #500,400  
 set output 'Compare.esp'

#
 set xlabel "{/=30 {/Times-Italic Time } (min)}"
 set ylabel "{/=30 {/Times-Italic Remaining ice area} (percent)}"
 set xrange [0:72]
 set yrange [0.5:1.01]
 set key top right 
 f(x) = a*x + b # fit line 1
 fit f(x) 'ice_example.dat' u 1:2 via a, b
 title_f(a,b) = sprintf('f(x) = %.2fx + %.2f', a, b)
 
 #f(x) = a*x **2 + b *x + e # fit line 1
 #fit f(x) 'ice_example.dat' u 1:2 via a, b, e
 #title_f(a,b,e) = sprintf('f(x) = %.2fx **2 + %.2fx + %.2f', a, b, e)
 g(x) = c*x + d # fit line 2
 fit g(x) 'ice_mass.dat' u 1:2 via c, d
 title_g(c,d) = sprintf('g(x) = %.2gx + %.2g', c, d)
 
 #f1(x) = E*exp(I*x**2) # fit line 3
 #fit f1(x) 'ice_mass.dat' u 1:2 via E, I
 #title_f1(E,I) = sprintf('f1(x) = %.2f1*exp(%.2f1x**2)', E, I)
 
 plot 'ice_example.dat' u 1:2 w lp pt 8 pi -40 lc rgb 'red' lw 7 title 'Free surface LBM' ,\
   'ice_mass.dat' u 1:2 w p pt 5 lc rgb 'black' lw 9 title 'Experiment',\
    f(x) w l ls 10 lw 4 title 'Trend line for LBM',\
    g(x) w l ls 9 lw 4 title 'and for experiment' 
#    f1(x) t title_f1(e,i), title_f(a,b),title_g(c,d)
   
 unset multiplot
 set term win
 unset output 
Терминалаа сонгохдоо set term postscript гэж дуудан цаасны болон фондын тохиргоог landscape enhanced font "Times-New-Roman, 30" гэж хийнэ. Энд хэвтээ цаасан дээр Таймс романы 30 цэгийн өндөртэй текст агуулсан зураг үйлдэх нь байна. Постскриптийн өргөтгөл нь .esp учир хэвлэгдэж гарах файл нь үүгээр өргөтгөгдсөн байх ёстой. График дотроо ижил хэмжээтэй текст агуулах албагүй бөгөөд үсгийн өндөр бичих текстийн төрлөөс хамаарч янз бүрийн фонт ашиглаж болно. Үүний жишээ болгож х ба у тэнхлэгийн тэмдэглэгээг Таймасын Хэвтээ 30 өндөртэй байхаар 7 ба 8-р мөрөнп оруулж өгсөн байна. Энд / зураас нь коммандыг илтгэх ба буржгар хаалт болон зартигтай үед хүчинтэй. Ингээд 12-р мөрнөөс эхлэн регрессийн тэгшитгэлийг олох ажил эхэлж байна. Функцынхаа ерөнхий томъёоллыг f(x) = a*x +гэх маягаар өгнө. Энд Функц нь а ба b гэсэн коэффициенттэй шугаман байх нь. 16-р мөрөнд коммент хэлбэрээр квадрат хэлбэрийн регрессийн тэгшитгэлийг томъёоллыг оруулсан байгааг хараарай. Томъёоллоо оруулсаны дараа өгөгдөлд тохирох функцыг итераци хийж олуулах fit f(x) 'ice_example.dat' u 1:2 via a,гэсэн коммандын мөр харагдаж байна. fit f(x) нь функыг олох ба 'ice_example.dat' гэсэн мэдээний u 1:мөрүүдийг ашиглан a, b-г олно гэсэн үг. Олсоны дараа дараах маягийн тооцоолол терминал дээр гарч ирнэ.
gnuplot> load 'Comp.p'  


 Iteration 0
 WSSR        : 1.10215e+006      delta(WSSR)/WSSR   : 0
 delta(WSSR) : 0                 limit for stopping : 1e-005
 lambda   : 29.429

initial set of free parameter values

a               = 1
b               = 1
/

 Iteration 1
 WSSR        : 0.806322          delta(WSSR)/WSSR   : -1.36689e+006
 delta(WSSR) : -1.10215e+006     limit for stopping : 1e-005
 lambda   : 2.9429

resultant parameter values

a               = -0.0055647
b               = 0.975481
/

 Iteration 2
 WSSR        : 0.0469108         delta(WSSR)/WSSR   : -16.1884
 delta(WSSR) : -0.759411         limit for stopping : 1e-005
 lambda   : 0.29429

resultant parameter values

a               = -0.00597559
b               = 0.956714
/

 Iteration 3
 WSSR        : 0.0467439         delta(WSSR)/WSSR   : -0.00357196
 delta(WSSR) : -0.000166967      limit for stopping : 1e-005
 lambda   : 0.029429

resultant parameter values

a               = -0.00595424
b               = 0.955687
/

 Iteration 4
 WSSR        : 0.0467439         delta(WSSR)/WSSR   : -1.07202e-009
 delta(WSSR) : -5.01104e-011     limit for stopping : 1e-005
 lambda   : 0.0029429

resultant parameter values

a               = -0.00595423
b               = 0.955686

After 4 iterations the fit converged.
final sum of squares of residuals : 0.0467439
rel. change during last iteration : -1.07202e-009

degrees of freedom    (FIT_NDF)                        : 626
rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 0.00864122
variance of residuals (reduced chisquare) = WSSR/ndf   : 7.46707e-005

Final set of parameters            Asymptotic Standard Error
=======================            ==========================

a               = -0.00595423      +/- 1.652e-005   (0.2774%)
b               = 0.955686         +/- 0.0006873    (0.07192%)


correlation matrix of the fit parameters:

               a      b      
a               1.000 
b              -0.865  1.000 

Хоёр коэффициентэд тохирох утгуудыг 4-н итерацийн дараа олсон ба утгуудыг тодруулсан байгаа. 
14 дахь мөр бол зүгээр график зурахад регрессийн муруйг тэмдэглэх зорилгоор бичигдсэн юм. Өөрөөр хэлбэл муруйн тэмдэглэгээнд sprintf('f(x) = %.2fx + %.2f', a, b) гэсэн кодоор тэгшитгэл бичигдэнэ гэсэн үг юм. 
Хэд хэдэн регрессийг олж зурж болох ба жишээ болгон өөр нэг мэдээнд өөр регрессийг олохыг 19-р мөрнөөс эхлэн харуулж байна. Ингэхдээ эхний бичсэн функын коммандад орсон үсэг энэ тэрийг ашиглаж болохгүй. Давхардсан тэмдэглэгээ, коэф ашиглавал код алдаа заах болно. Ингээд 27-р мөрнөөс график зурагдаж эхэлж байна. Хоёр регрессийг 29 ба 30-р мөрөнд бичсэнийг харж байгаа байх. Харин 31-р мөрөнд комманд байдлаар муруйг хэрхэн тэгшитгэлээр тэмдэглэхийг харуулж байна.  
Үйлдэгдсэн ажил энэ байна. Файл бол кодын дагуу *.esp гэсэн өргөтгөлтэй гарч ирэх ба шидэтзураг (imagemagick) -ийн тусламжтайгаар ердийн зургийн форматруу хөрвүүлнэ. Ингэхдээ зурагт тавигдах шаардлага, нягтшил энэ тэрийг нь хангана. Тухайлбал
/: convert -units PixelsPerInch -density 400 хөрвүүлэх файл.esp хөрвөсөн файл.jpg
Дээрхэд зургийн pdi 400 байхаар тохируулсан байна. 
Зурагт регрессүүд нь тасархай болон тасралтгүй шулуун шугамуудаар дүрслэгджээ. 

График дээр сум зурах, тайлбар бичих
График дээр янз бүрийн тайлбар бичих шаардлага гардаг. Шугам муруйн тэмдэглэгээг бол график зурах коммандын араас title 'Trend line for LBM' гээд өгчихөж болдог. Гэтэл дурын газар үг бичих шаардлага бишгүй л тулгардаг. Дараах кодыг авч үзье. 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# this script for compare remaining ice area
 reset
 set term postscript landscape enhanced font "Times-New-Roman, 30"  #size 700,500 #500,400  
 set output 'Compare.esp'

#
 set xlabel "{/=30 {/Times-Italic Time } (min)}"
 set ylabel "{/=30 {/Times-Italic Remaining ice area} (percent)}"
 set xrange [0:2.8]
 set yrange [0.0:1.01]
 set key top right 

 set label 1 'Ice is split into 2 parts' at 0.2, 0.15
 set arrow 1 from 1.3, 0.2 to 1.6, 0.3
 
 set label 2 'One part lasted' at 1.7, 0.48
 set arrow 2 from 2.2, 0.42 to 2.0, 0.1
 
 plot '60cover.txt' u 1:2 w lp pt 12 pi -20 lc rgb 'red' lw 5 title '{/Symbol w} = 1.90, h = 60 grid' ,\
   '80cover.txt' u 1:2 w lp pt 10 pi -40 lc rgb 'black' lw 5 title '{/Symbol w} = 1.87, h = 80 grid'
   
 unset multiplot
 set term win
 unset output 
Дээрх код өмнөх кодтой ижилэвтэр боловч гол ялгаа нь 13-17 - р мөрөнд оршиж байгаа юм. Энд бид 2 удаа өгүүлбэр, 2 удаа сум зурж үзүүлсэн байна. Ингэхдээ тоогоор тэмдэглэгээ болон сум /бусад геометр обьект/ энэ тэрээ set label гэх маягаар тэмдэглэнэ. Гол анхаарах зүйл нь эдгээрийн байрлал бөгөөд байрлалыг тэнхлэгийн тоолол дээр суурилж өгөх хэрэгтэй. Жишээ нь 14-р мөрний set arrow 1 from 1.3, 0.2 to 1.6, 0.3 гэдэг нь сумны сүүл х тэнхлэгийн 1.3 у тэнхлэгийн 0.2 -оос эхэлж сумны үзүүр нь х тэнхлэгийн 1.6 болон у тэнхлэгийн 0.3 дээр дуусах нь байна. График ажлыг харвал:
Кодыг зурагтай сайхан харьцуулж харвал их зүйлийг ойлгох болно. 
Өөр нэг том жишээ авч үзье. Хоср талдаа өөр хувиартай тэнхлэгтэй бол тэмдэглэгээний байрлалыг яаж тодорхойлох вэ гэсэн асуудал эндээс гарч магадгүй. 


 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
# this script for drawing depth profile
 reset
 set term postscript landscape enhanced size 11,5 font "Times-New-Roman, 16"  # #500,400  
 set output 'depth.esp'

# set label 'A point' at 50, 0 font ',20'
 set title '{Ice depth and Nu_L measurement}' #{/Arial Nu_L}
 set ytics nomirror
 set y2tics
 set xlabel '{/Times-Italic Time} (min)'
 set ylabel '{/Times-Italic Ice depth} (m)'
 set y2label 'Nusselt number Nu_L'
 set xrange [0:3]
# set y2range [-0.01:0.5]
# set yrange [-0.005:0.06]
 set key at 2.65, 0.058
 set label "Ice melted" at 2.35, 0.012
 set arrow 1 from 2.4, 0.01 to 2.4, 0.002
 set arrow 2 from 2.6, 0.01 to 2.8, 0.002
 plot 'depN200.dat' u 1:2 w lp lt 5 pi -10 lc rgb 'red' lw 4 title 'Ice depth at 0.70 m' axes x1y1,\
      'depN400.dat' u 1:2 w lp lt 6 pi -10 lc rgb 'black' lw 4 title 'Ice depth at 1.00 m' axes x1y1,\
   'depN200.dat' u 1:3 w lp lt 1 pt 7 pi -5  lc rgb 'red' lw 4 title 'Nusselt number at 0.70 m' axes x1y2,\
   'depN400.dat' u 1:3 w lp lt 1 pt 8 pi -10 lc rgb 'black' lw 4 title 'Nusselt number at 1.00 m' axes x1y2
#      'xAn.dat' u 1:2 w lp lt 7 pi -10 lc rgb 'blue' lw 2 title 'Усгүй, А' ,\
#      'xCn.dat' u 1:2 w lp lt 6 lc rgb 'orange' lw 2 title 'Усгүй, С' ,\
#   'xBn.dat' u 1:2 w lp lt 5 pi -10 lc rgb 'red' lw 2 title 'Усгүй, В',\
   
 unset multiplot
 set term win
 unset output 
Эндээс гарсан зураг нь:
Ажиглавал сум болон тэмдэглэгээний байрлал нь зөвхөн х1 болон у1 - ийн координатаар зохицуулагддаг байна. 
Постскрипт терминал нь бусад терминалаас зураас, цэг гэх мэтийн хэлбэр дүрс өнгө будагны кодоороо ялгаатай. Жишээ нь цэгтэй зураасаар муруйг зурах бол цэгийн төрөл pt 7, зураасны төрлийг lt тусад нь тодорхойлж өгнө. 
Дараагийн Монгол Нюфлотчин байх болов уу??

No comments:

Post a Comment