Tuesday, March 10, 2015

Тохирол ба нарийвчлал /Accuracy and precision/

Тохирол ба нарийвчлал

Тохирол гэдгийг ярихын өмнө нарийвчлалын тухай жаахан өгүүлье. Нарийвчлал гэдэг бол бодит утгатайгаа ойртож буйг илэрхийлж байгаа хэмжүүр юм. Нарийвчлал сайтай жин гэвэл бараг л яг таг хэмжиж тэдэн кг, тэдэн грамм байна гэдгийг үзүүлдэг жин байж таарна. Тооцон бодох математик талаас авч үзвэл, дифференциал тэгшитгэлийн аналитик шийд ба ойролцоолон бодсон шийдийн хоорондын зөрүүн дээр илрэх хэмжүүр юм. Хоорондын зөрүү бага байх тусам нарийвчлал сайжирч, зөрүү ихсэх тусам нарийвчлал муудаж ойролцоолох аргыг сайн эсхүл муу арга болохыг илтгэнэ. Гэхдээ ямар нэгэн ойролцоолох /төгсгөлөг ялгавар, төгсгөлөг элемент, чөлөөт арга гэх мэт/ аргын хувьд нарийвчлал гэдэг үгний оронд тохирол гэж ярих нь зөв мэт. Нарийвчлалын зэрэг хэмээх эхийг Википедиад орчуулж тавьсаныхаа дараа энэ эргэцүүллийг олсон юм. Бид тооны орон, таслалын арын тооны хэмжээг оронгийн нарийвчлал гэж ярьдаг. Өшөө нарийвчлалтай хариу гарга гэвэл таслалын ард 5, эсвэл 10 оронг гаргаж ирнэ. Иймд тооцон бодох аргын нарийвчлалыг цифрийн нарийвчлал гэдэг ухагдахуунаас салгамаар ч юм шиг. Пи тоог барилгын инженерүүд ихэнхдээ 3.14 гэж хэрэглэдэг бол шинжлэх ухаанчид илүү нарийвчлалтайгаар 3.14159265 гэж хэрэглэх жишээтэй. Фортран дээр код бичиж байхад бодит тооны нарийвчлалыг үр дүнгийн нарийвчлалаас хамааруулж авдаг. Тооцон бодох аргын нарийвчлал буюу тохирол сайн байж болох ч оронгийн нарийвчлал муу бол худлаа л үр дүн гарна гэсэн үг. Тиймээс салгаж ойлгох нь чухал бөгөөд англи /англи хэл бол шинжлэх ухааны хэл/ дээр хэрхэн авч үздэгийг сонирхвол:
  • Тохирол - Accuracy /term of systematic error/
  • Нарийвчлал - Precision /term of random error/
Инженерийн зурагзүй, үйлдвэрлэлтэнд м-ээр тэмдэглэж байгаа бол таслалаас хойш 2 орон хангалттай, илүү нарийвчлалтай гэвэл мм-ээр тэмдэглэхэд болно. Учир нь бид мм-ээс илүү нарийн харж чадахгүй.

Англи хэлэнд бидний нарийвчлал гэж ойлгодог зүйл хоёр өөр янзаар хэрэглэгдэх ба нийтэд нь Accucison гэж тэмдэглэдэг. Үүнийг юу гэж орчуулахыг мэдэхгүйч хоёр алдааны үнэлэмжийг нэгтгэн багтаасан ойлголт болж таарна. Хэрэглэгдэх салбар бүрээс хамаарч өөр өөр тодорхойлолттой байх боловч инженерчлэл, тооцон бодох математикийн хувьд дээр өгүүлсэнтэй ижил эсвэл доор ишлэсэнтэй адил байна.
In numerical analysis, accuracy is also the nearness of a calculation to the true value; while precision is the resolution of the representation, typically defined by the number of decimal or binary digits.
 Тооцон бодогчийн хувьд эхлээд хэрэглэж буй аргын хувьд тохирол нь хэр вэ гэдгийг бодох, адагт нь гарч буй үр дүнг хэр нарийвчлалтай авах вэ гэдгээ шийдэх хоёр төрлийн нарийвчлалыг сайтар тунгаах нь чухал юм. Аналитик аргаас өөр тохиролтой арга одоогоор олдоогүй боловч бүх дифференциал тэгшитгэлд аналитик аргыг ашиглах боломжгүй юм. Тиймээс л тооцон бодох арга ажиллаж тохирол өндөртэй арга хайж, нарийвчлал сайтай үр дүнг хүсэмжилж байна. Тохиролын тухай илүү дэлгэрэнгүйг цаашид бичих ба энэ нийтлэлд нарийвчлалын тухай тэр дундаа ФОРТРАН хэлэнд нарийвчлалыг хэрхэн тусгадаг талаар авч үзье. 

Фортран дахь нарийвчлал

Нарийвчлалын тухай явахын өмнө компьютерт мэдээлэл хэрхэн хадгалагдах тухай орж уншвал илүүдэхгүй байх. Мөн мэддэг бол нэмэлт хэдэн зүйл өгүүлье. Компьютерийн багтаамж гэдэг нь маш олон тооны ON ба OFF болж шилжих /switch/ нүднүүдээс тогтох ба шилжих нүд бүр нэг ширхэг бинари /0 ба 1 цифр/ тоогоор илэрхийлэгдэнэ. ON нь 1 гэсэн цифрээр, OFF нь 0 гэсэн цифрээр тэмдэглэгдэх ба тэдгээрийг бит /bit/ гэж бас нэрлэдэг. Тэгэхээр эдгээр шилжих нүдүүд 0 ба 1 гэсэн хоёр цифр харуулах ба бид энэ хоёроос өөр тоог компьютерт хадгалж ажиллах шаардлага гардаг. Энэ тохиолдолд нүднүүд хамтарч хадгалах гэж буй тоо хэмжээг хоёртын тооллын системд шилжүүлж гүйцэтгэнэ. Хамгийн жижиг хамтарсан нүдний грүппийг /багийг/ байт /byte/ гэж нэрлэдэг. Нэг байт нь 8 ширхэг битээс бүрдэнэ. Арав ба хоёртын тооллын системээр хэдэн цифр бичиж харьцуулбал:
Аравт          Хоёрт
    1                  01
    2                  10
    3                  11
    4                100
    5                101
гэх мэтээр 1 ба 0 ээлжлэн хөврөх ба яг л энэ шиг 8 ширхэг битийн нэгдэл нийлж нэг байт болно. Байт бол компьютерийн санах ойн багтаамжийг илэрхийлэх нэгж юм. 
Компьютерийн санах ойд 3-н төрлийн өгөгдөл хадгалагдах ба эдгээрийг тэмдэг /character/, бүхэл тоо /integer/, бодит тоо /real/ гэнэ. Эдгээр нь өөр өөр шинж чанартай байх учир харилцан адилгүй битүүдийг ашиглан хадгалагдана. Тэмдэг гэдэгт ази бус тэмдэглэгээ тухайлбал латин цагаан толгойн 26 том жижиг үсэгнүүд, 0-9 хүртэл цифр, хаалт таслал гэх мэт тэмдэглэгээнүүд, зарим тусгай тэмдэглэгээнүүд ороод 256 гаруй дүрс тэмдэг багтах ба тэдгээрийн нэг тэмдэгийг хадгалахад 1 байт шаардагддаг байна. Бүхэл тоо нь эерэг ба сөрөг, мөн 0 гэж гурав хуваагдах ба хадгалах зориулалт нь 1, 2, 4 ба 8 байт байна. Дөрвөн байтын бүхэл тоо нь ихэнх комьпютерт хэрэглэгддэг төрөл юм.  Нэгэнт төгсгөлөг тооны битүүд тухайн тоог хадгалахад хэрэглэгдэж байгаа бол тухайн бүхэл тоонд тодорхой хязгаар гарч ирнэ. Энэ хязгаарын утгыг n битийн тооноос хамааруулан:
                                    хамгийн бага бүхэл тооны утга = - 2^(n-1)                                   (1)
Харин хамгийн их утгыг нь:
                                    хамгийн их бүхэл тооны утга = 2^(n-1)-1                                      (2)
Дөрвөн байтын бүхэл төрлийн хувьд, хадгалж болох хамгийн бага бүхэл тооны утга нь -2,147,483,648 харин хамгийн их бүхэл тооны утга нь 2,147,483,647 болж байна. Өөрөөр хэлбэл 4н байтын бүхэл төрөлд нийт 32 бит багтдаг гэсэн үг. Бүхэл тооны хувьд хадгалахад дараах хоёр хязгаарлалт байдаг.
  • тоог бутархайгаар хадгалах боломж байхгүй
  • их хэмжээний бүхэл тоог хадгалах боломжгүй.

Иймээс бодит тоог хадгалах шаардлага гарч ирнэ. Бодит тоонууд стандарт тэмдэглэгээгээр /scientific notation - зэрэгт тэмдэглэгээ/ хадгалагдана. Жишээлбэл вакуум орчин дахь гэрлийн хурд 299 800 000м/секунт бол түүнийг стандарт байдлаар 2.998*10^8 /2.998e08/ гэж тэмдэглэх ба эхний бутархай хэсгийг мантисс /mantissa/, сүүлчийн хураангуй хэлбэрийг зэрэг /exponent/ гэж нэрлэдэг. Бодит тоо нь нарийвлал /precision/ ба хүрээ /range/ гэсэн хоёр хэмжигдэхүүнтэй байх ба агуулж байх цифрийн хэмжээ нь нарийвчлалыг, утгын их ба багын зөрүү нь хүрээг илэрхийлнэ. Нарийвчлал нь мантиссд байх цифрийн тооноос хамаардаг бол хүрээ нь зэргээс хамаарч байх жишээний. 24 битийн мантисс нь +-2^23 тоог үзүүлэх эсвэл долоон ширхэг тодорхой тооны цифр байвал долоон цифрийн нарийвчлалтай гэж үзэж болно. Харин 8н битийн зэргийн хувьд 2^(-128) - аас 2^127 хооронд илэрхийлэх ба бодит тооны хүрээ нь 10^(-38) аас 10^38 хүртэл байна. Дээр -128 /127-гийн хувьд ялгаагүй/ нь томъёо (1) ийг дахин зэрэгт авч гаргасан байна. Фортран хэлэнд өгөгдлийг хэрхэн зарлах боломж байгаа, тэр нь санах ойтой хэрхэн холбогдох талаар нэгтгэвэл:

Data Type
Өгөгдлийн төрөл
Bytes
Бит
Description
Тайлбар
BYTE
(INTEGER*1)
1 (8 bits)
INTEGER*1 эсвэл INTEGER (KIND=1) гэж зарласантай ижил.
INTEGER
1, 2, 4, эсвэл 8
Ингэж зарлагдсан тохиолдолд бүхэл тооны орон нь кинд төрлийн параметр эсвэл бусад зүйлсээр тодорхойлогдоно.
INTEGER(KIND=1)
INTEGER*1
1 (8 bits)
Заагдсан бүхэл тооны хүрээ нь -128 –аас 127 (--2**7 аас 2**7--1). Заагдаагүй утга нь 0-ээс 255 (2**8-1). хүртэл байна.
INTEGER(KIND=2)
INTEGER*2
2 (16 bits)
Заагдсан бүхэл тооны хүрээ нь -32,768 –аас 32,767 (--2**15 аас 2**15--1). Заагдаагүй утга нь 0-ээс 65,535 (2**16-1) хүртэл байна.
INTEGER(KIND=4)
INTEGER*4
4 (32 bits)
Заагдсан бүхэл тооны хүрээ нь -2,147,483,648 –аас 2,147,483,647 (--2**31 аас 2**31--1). Заагдаагүй утга нь 0-ээс 4,294,967,295 (2**32-1) хүртэл байна.
INTEGER(KIND=8)
INTEGER*8
8 (64 bits)
Заагдсан бүхэл тооны утга нь -9,223,372,036,854,775,808 – аас 9,223,372,036,854,775,807 (--2**63 аас 2**63--1) хооронд байна.
LOGICAL
1, 2, 4, эсвэл 8
Ингэж зарлагдсан тохиолдолд логик утгын орон нь кинд төрлийн параметр эсвэл бусад зүйлсээр тодорхойлогдоно.
LOGICAL(KIND=1)
LOGICAL*1
1 (8 bits)
Логик утгууд .TRUE. эсвэл .FALSE.
LOGICAL(KIND=2)
LOGICAL*2
2 (16 bits)
Логик утгууд .TRUE. эсвэл .FALSE.
LOGICAL(KIND=4)
LOGICAL*4
4 (32 bits)
Логик утгууд .TRUE. эсвэл .FALSE.
LOGICAL(KIND=8)
LOGICAL*8
8 (64 bits)
Логик утгууд .TRUE. эсвэл .FALSE.
REAL
4, 8, эсвэл 16
Бодит хөвөгч цэгтэй тооны орон болон нарийвчлал нь кинд төрлийн параметр, эсвэл бусад зүйлсээр тохируулагдана.
REAL (KIND=4)
REAL*4
4 (32 bits)
Дан-нарийвчлалтай бодит хөвөх цэгтэй тооны утга нь IEEE S_float форматад 1.17549435E--38 –ээс 3.40282347E38 хүртэл байна. Харин 1.17549429E--38 -ээс 1.40129846E--45 хоорондох утга нь дахин нормчлогдсон /denormalized/ байна. Энэ төрлийн нормчлогдсон тоогоор тогтмол тоог өгөх боломжгүй.
DOUBLE PRECISION
Давхар-нарийвчлал
REAL (KIND=8)
REAL*8
8 (64 bits)
Давхар-нарийвчлалтай бодит хөвөх цэгтэй тооны утга нь IEEE T_float форматад 2.2250738585072013D-308 - оос 1.7976931348623158D308 хооронд байна. Харин 2.2250738585072008D--308 – аас 4.94065645841246544D--324 хоорондох утга нь дахин нормчлогдсон байна. Мөн л дээрхтэй адил тогтмол тоог энэ хүрээнд өгөх боломжгүй.
Extended-precision
Өргөтгөсөн-нарийвчлал
REAL (KIND=16)
REAL*16
16 (128 bits)
Өргөтгөсөн-нарийвчлалтай бодит хөвөх цэгт тооны DIGITAL IEEE style X_float фортмат дахь хүрээ нь 6.4751751194380251109244389582276465524996Q-4966 - аас 1.189731495357231765085759326628007016196477Q4932 хүртэл байна.
COMPLEX
8 эсвэл 16
Комплекс хөвөгч цэгтэй тооны орон болон нарийвчлал нь кинд төрлийн параметр, эсвэл бусад зүйлсээр тохируулагдана
COMPLEX (KIND=4)
COMPLEX*8
8 (64 bits)
Дан нарийвчлалтай хөвөг цэгт комплекс тоо нь IEEE-ын хос S_float форматад бодит /real/ ба төсөөллийн /imaginary/ хэсгүүдээс бүрдэнэ. Эдгээрийн хүрээ нь адилхан 1.17549435E--38 – аас  3.40282347E38 хүртэл байх ба 1.17549429E--38 болон 1.40129846E--45 утгын хоорондох нь дахин нормчлогддог. Мөн л энэ хүрээнд тогтмол тоо өгөх боломжгүй.
DOUBLE COMPLEX
Давхар комплекс
COMPLEX (KIND=8)
COMPLEX*16
16 (128 bits)
Давхар нарийвчлалтай хөвөг цэгт комплекс тоо нь IEEE T_float форматад бодит /real/ ба төсөөллийн /imaginary/ хэсгүүдээс бүрдэнэ. Эдгээрийн хүрээ нь адилхан 2.2250738585072013D-308 - аас 1.7976931348623158D308 хүртэл байна. Харин 2.2250738585072008D--308 -аас 4.94065645841246544D--324 хүртэлх хүрээнд дахин нормчлогдсон байх учир тогтмол тоогоор ашиглах боломжгүй.
CHARACTER
Тэмдэглэгээ бүрд 1 byte (8 bits)
Тэмдэглэгээний /Character/ төрлийн өгөгдөл нь тусгай тохирсон кодоор илэрхийлэгдэх ба фортранд зарлагдах хэлбэр нь CHARACTER(LEN=n), CHARACTER( n), эсвэл CHARACTER* n байна. Үүнд n нь байтын тоо эсвэл n тэмдэглэгээний уртыг илэрхийлнэ.
HOLLERITH
Холлеритийн тэмдэглэгээ бүрд 1 byte (8 bits)
Холлеритийн тогтмол.

Тэмдэглэл: -- тэмдэг нь сөрөг тэмдэгийг, ** нь фортраны дагуу зэргийг тэмдэглэсэн болно. 
Зарлах үед дээрх шиг нарийвчлалыг давхар зарлаад үр дүнг мөн нарийвчлалтай авна гэвэл мөн л эндүүрэл болно. Нарийвчлалыг мөн өгөгдөл унших /read/ болон өгөгдөл хэвлэх /write or print/ үед формат тушаалын /format statement/ дагуу өгөх хэрэгтэй.

Stored Value
Хадгалах утга
Format Specifier
Формат тодорхойлогч
Output
Үр дүн буюу гаралт
1.234567
f8.2
^^^^1.23
0.00001
f5.3
0.000
-12345
i5
*****
-12345
i6
-12345
12345
i6
^12345
0.00001234
e10.3
^0.123E-04
0.0001234
e12.4
^^0.1234E-03
1234567.89
e9.2
^0.12E+07
altai
a8
^^^altai
1.23456789123D0
d17.10
^0.1234567891E+01

Тэмдэглэл: ^ тэмдэг нь хоосон мөрийг илтгэнэ. 
Дээрх хүснэгт үр дүн болон өгөгдлийг унших форматыг өөрөөр хэлбэл давхар нарийвчлалыг зааж өгнө. Эхний F8.2 - ийг тайлбал нийт тооны орон 8 байх ба таслалаас хойш 2 оронг харуулна. энэ найман орон дотор таслал өөрөө тоологдох ба чингэвэл нийт 7 цифр, нэг таслал нийтдээ 8н оронтой утга бичигдэнэ гэсэн үг. Дээрх хүснэгтэнд өгөгдсөн жишээ тооны хувьд 1-ийн өмнө ямар нэгэн цифр байхгүй учир өмнөх 4н орон нь хоосон бичигдэж байгаа юм. F гэдэг бол бутархай байдлаар бичих код, i бол бүхэл байдлаар бичих, e ба d бол зэрэгт байдлаар бичих, a бол текст, үсэг, тэмдэглэгээ бичих кодууд юм. Нэгэн энгийн жишээг сонирхоё.

1:     program format1  
2:     real x  
3:     x = 0.025  
4:     write(*,100) 'x=', x  
5:   100 format (A,F)  
6:     write(*,110) 'x=', x  
7:   110 format (A,F5.3)  
8:     write(*,120) 'x=', x  
9:   120 format (A,E)  
10:     write(*,130) 'x=', x  
11:   130 format (A,E8.1)  
12:     end program  

Дээрх кодыг бичиж  нэгтгэвэл дараах үр дүнг бидэнд хэвлэж харуулах болно. 



7-р мөрөнд байх 110 гэсэн дугаар нь өмнөр 6-р мөрний бичих тушаалтай холбож өгөх тоо юм. Ингэснээр 7 -р мөрний format гэсний араас хаалтанд бичсэн код нь бичих тушаалд үйлчилж эхэлнэ. "А" гэсэн код бол "х=" гэсэн тэмдэглэгээний тодорхойлогч, харгалзан F бол "х" гэсэн тооны өгөгдсөн утгыг хэвлэхэд үйлчилнэ. Ямар нэгэн илүүдэл заалт оруулаагүй учир харгалзан 8 ба 8н байтаар үр дүнг хэвлэсэн байна. Харин 11-рт байгаа форматны кодын хувьд "х" тоог зэрэгт хэлбэрээр бичих ба таслалын ард нэг орон, таслалтай нийлээд 8н оронг бич гэсэн тодорхойлогч байна. Иймд үр дүнд ^0.3E-01 гэж хэвлэжээ /өнгөөр ялгав/. Дараах кодод түгээмэл хэрэглэгддэг формат тодорхойлогчийг шингээж өгөв. 


1:     Program form  
2:  !***** declaration part-зарлах хэсэг *****!  
3:     complex T  
4:     character P*11,Q*20  
5:     logical X,Y  
6:     X = .FALSE.  
7:     Y = .TRUE.  
8:  !***** execution part-гүйцэтгэл хэсэг *****!  
9:     open(10, file='formatdat.dat') ! opening the file  
10:  ! format for integer variables  
11:     I = -1024  
12:     J = 666  
13:     K = 112358  
14:     WRITE(10,100) i,j,k  
15:     WRITE(* ,100) i,j,k  
16:  100  FORMAT(' ', 3I10.8)  
17:  ! format for real variables  
18:     A = -1024.8  
19:     B = 666.56  
20:     C = 11.2358e-02  
21:     WRITE(10,101) A,B,C  
22:     WRITE(* ,101) A,B,C  
23:  101  FORMAT(' ', 3f8.2)  
24:  ! format for double precision variables  
25:     A = -1024.8  
26:     B = 666.56  
27:     C = 11.2358e-02  
28:     WRITE(10,102) A,B,C  
29:     WRITE(* ,102) A,B,C  
30:  102  FORMAT(' ', 2e8.2, d8.2)  
31:  ! format for complex variables  
32:     T=(-15.8,309.67)  
33:     WRITE(10,103) T  
34:     WRITE(* ,103) T  
35:  103  FORMAT(' ', 2F10.4)  
36:  ! format for double precision variables with Gw.d  
37:     A = 3.14159  
38:     B = -88.9  
39:     C = 123.4567E-02  
40:     D = 2.99792458D+08  
41:     WRITE(10,104) A,B,C,D  
42:     WRITE(* ,104) A,B,C,D  
43:  104  FORMAT(' ',4G10.2)  
44:  ! format for character variables  
45:     P = 'hello world'  
46:     Q = 'Program bichih uu'  
47:     WRITE(10,105)P,Q  
48:     WRITE(*,105)P,Q  
49:  105  FORMAT(1x,A11, 2x, A20)  
50:  ! formats for logical expressions  
51:     WRITE(10,106)X,Y  
52:     WRITE(*,106)X,Y  
53:  106  FORMAT(' ','X =',L2,' and Y =',L5)  
54:  ! formats for control sign  
55:     WRITE(10,107)I,A,J,B,K,C  
56:     WRITE(*,107)I,A,J,B,K,C  
57:  107  FORMAT(' ',SP,I6,F6.2,I8,F8.2,SS,I12,E12.4)  
58:  !***** terminal part-төгсгөл хэсэг *****!  
59:     close(10)    ! closing the opened file in beginning  
60:     End program  
Дээрхийг сайн ажиглаж, гарсан үр дүнтэй нь харьцуулж харвал форматаар нарийвчлалыг тохируулахад төвөгтэй зүйл байхгүй билээ. Мөн дээрх кодонд фортран кодны бүрдэл хэсэг болох зарлах, гүйцэтгэл, төгсгөл хэсгүүдийг тусгайлан харуулав.

No comments:

Post a Comment