Về đánh giá sai số, do kết quả tính toán của chương trình còn khác biệt khá lớn với kết quả tính trên phần mềm QOCA do vậy em không đưa vào so sánh, tuy vậy phần tính toán sai số là phần tương đối phức tạp nên hiện tại em chưa thể hoàn thành phần tính toán sai số này.
Đánh giá chung thì chương trình đã đạt được mục tiêu đề ra là tính biến dạng xoay trong một tam giác địa động lực, và kết quả tính toán của nó có thể đưa vào sử dụng trong thực tế.
76 trang |
Chia sẻ: lylyngoc | Lượt xem: 2366 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Luận văn Nghiên cứu lập trình tính biến dạng xoay trong một tam giác địa động lực, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
1 TỔNG QUAN VỀ XÂY DỰNG CHƯƠNG TRÌNH
Để xây dựng chương trình tính biến dạng xoay trong một tam giác địa động lực này trước tiên ta cần xác định các dữ liệu đầu vào và dữ liệu đầu ra. Ở đây dữ liệu đầu vào của chương trình là file số liệu là một file Excel có chứa các dữ liệu về các điểm đo tốc độ dịch chuyển trong đó tại mỗi điểm có chứa các thông số tọa độ, vận tốc dịch chuyển theo phương Bắc và Đông, sai số vận tốc dịch chuyển (Hình 3.3). Và thêm một file đầu vào nữa là file Excel chứa dữ liệu chọn tam giác (Hình 3.4), file chọn tam giác này do người sử dụng tự chọn để tính biến dạng cho những tam giác trong lưới đo một cách trực quan nhất.
Trong hình 3.3 là một ví dụ về file số liệu đầu vào để tính biến dạng, file này lấy số liệu từ bảng “ Vận tốc chuyển dịch tuyệt đối của các điểm đo GPS trong khu vực nghiên cứu tính biến dạng trong tài liệu luận văn tiến sĩ “BIẾN DẠNG KIẾN TẠO HIỆN ĐẠI KHU VỰC BIỂN ĐÔNG VIỆT NAM THEO SỐ LIỆU DỊCH CHUYỂN GPS” của nghiên cứu sinh Nguyễn Văn Hướng tại Phòng Địa Động Lực – Viện Địa Chất.
Trong hình 3.4 là file chọn tam giác địa động lực cho tính biến dạng, File này gồm các trường đó là tên tam giác (tên này sẽ được thể hiện tại trọng tâm của tam giác) và 3 trường là số ký hiệu của 3 đỉnh tam giác, mỗi trường là một ký hiệu cho một điểm của tam giác được chọn. Ký hiệu này là số thứ tự trong file Excel của file đầu vào cho tính toán biến dạng. Các con số ký hiệu ở 3 trường này là không được trùng nhau.Ví dụ như tại file chọn tam giác, tam giác có tên TG_01 sẽ là 3 điểm BLV1, DOHO,KUNM trong file số liệu đầu vào tạo thành. 2,4,7 là ký hiệu trong 3 trường của file chọn tam giác là số thứ tự của 3 điểm BLV1, DOHO, KUNM trong file số liệu đầu vào.
Tên điểm đo
Kinh độ
Vỹ độ
Vận tốc chuyển dịch theo hướng Đông
Vận tốc chuyển dịch theo hướng Bắc
Sai số Vận tốc chuyển dịch theo hướng Đông,Bắc
Hình 2.3: File đầu vào theo số liệu GPS Biển Đông
Tên tam giác chọn
3 đỉnh của tam giác được ký hiệu là số thứ tự của điểm đo trong file đầu vào
Hình 2.4: File chọn tam giác địa động lực
Để tính biến dạng xoay trong một tam giác địa động lực theo công thức (1.14) thì ta phải làm tuần tự các bước như trong mục 1.1.2.2(Chương 1). Trong xây dựng chương trình thì đầu tiên chương trình cần phải đọc hiểu được dữ liệu trong file đầu vào (Hình 2.3) và kết quả đầu ra là một file kết quả cho ta biết được giá trị biến dạng xoay và sai số của nó trong từng tam giác. Kết quả này được ghi vào một file có định dạng “.txt “. Các thuật toán sẽ được chỉ rõ ở mục 2.2.2 (Chương 2) và cách sử dụng và giao diện của chương trình được chỉ rõ tại chương 3 của đồ án.
2.2.2 THUẬT TOÁN TRONG XÂY DỰNG CHƯƠNG TRÌNH
Chương trình được xây dựng sử dụng cho tính biến dạng xoay trong một tam giác địa động lực được thực hiện bằng thuật toán tổng hợp như sau (Hình 2.5) :
Yes
Bắt đầu
Nhập dữ liệu từ file Excel
Yes/No
Hiển thị lưới tốc độ chuyển dịch
No
Hiển thị lưới điểm đo
Nhập dữ liệu chọn tam giác
Tính ω=12∂vx∂y-∂vy∂x
Tính sai số
Xuất file dữ liệu kết quả
Hiển thị lưới tam giác
Hiển thị ký hiệu biến dạng xoay
Kết thúc
Hình 2.5: Minh họa thuật toán chương trình
Dưới đây là những thuật toán chi tiết trong chương trình :
2.2.2.1 Thuật toán lấy dữ liệu và hiển thị điểm lưới đo
Thuật toán này có thể mô tả như sau : Trước tiên ta có một khai báo một biến có cấu trúc DI() có dạng cấu trúc tên là Diem có cách khai báo như sau:
Type Diem
tendiem as string
x as float
y as float
vx as float
vy as float
svx as float
svy as float
End Type
Global DI() as Diem
Trong này có chứa các biến x,y,vx,vy,svx,svy có nghĩa lần lượt là các biến lưu kinh độ, vĩ độ, vận tốc dịch chuyển theo hướng Đông, vận tốc chuyển dịch theo hướng Bắc bản đồ, sai số vận tốc dịch chuyển theo hướng Đông, Bắc bản đồ.Biến DI() này sẽ lưu dữ liệu từ file Excel số liệu có chứa nhưng thông tin trên (Hình 2.3), dữ liệu được lấy lần lượt theo hàng và DI(i) với i tương ứng là số hàng lưu trên DI() cho tới khi kết thúc file số liệu thì thôi:
Sub HienDiem
Filename=FileOpenDlg("","","XLS","Hay nhap file so lieu cho tinh bien dang")
Register Table Filename
Type "XLS"
Into "C:\BienDang.Tab"
Dim awin as integer
Dim tenlop as String
awin=frontwindow()
tenlop=LayerInfo(awin,1,LAYER_INFO_NAME)
if tenlop"Cosmetic1" then
Set Coordsys table tenlop
Set Map Layer 1 Editable on
else
tenlop=LayerInfo(1,2,LAYER_INFO_NAME)
Set Coordsys table tenlop
Set Map Layer 2 Editable on
End if
Dim i as integer
i=1
Redim DI(i)
Open table "C:\BienDang.Tab"
Fetch First From BienDang
DI(i).tendiem = BienDang.col1
DI(i).x= BienDang.col2
DI(i).y= BienDang.col3
DI(i).vx= BienDang.col4
DI(i).vy= BienDang.col5
DI(i).svx= BienDang.col6
DI(i).svy= BienDang.col7
Do while not EOT(BienDang)
DI(i).tendiem = BienDang.col1
DI(i).x= BienDang.col2
DI(i).y= BienDang.col3
DI(i).vx= BienDang.col4
DI(i).vy= BienDang.col5
DI(i).svx= BienDang.col6
DI(i).svy= BienDang.col7
i=i + 1
Redim DI(i)
Fetch Next From BienDang
Loop
Call Thehiendiem(DI())
Close Table BienDang
Alter Menu Item BienDang Enable
Alter Menu Item HienDiem Disable
End Sub
Phía trên là dòng code khai báo của hàm có tên là Hienthi trong hàm này có dòng lệnh Call có tác dụng gọi một hàm con là Thehiendiem(D()). Hàm này có tác dụng lấy dữ liệu từ biến D() vừa đã được chứa dữ liệu từ file Excel (Hình 2.3) để hiển thị ra bản đồ của Mapinfo những thông số của dữ liệu được lấy là vị trí của điểm, tên điểm,và khi chạy hết hàm Hienthi sẽ cho ra bản đồ Mapinfo thông tin của lưới các điểm như vậy :
Sub Thehiendiem(DI() as Diem)
Dim i as integer
Dim tl as float
Dim hoi as logical
tl=5/50
Dim ten as string
For i=1 to (ubound(DI)-1)
Create Point (DI(i).x,DI(i).y)
Symbol (34,Black,5)
ten = DI(i).tendiem
Create text
ten
(DI(i).x, DI(i).y) (DI(i).x + 0.2,DI(i).y + 0.2)
Font MakeFont ("Helvetica",1,12,BLUE,WHITE)
Next
Hoi = Ask(" Ban co muon the hien toc do dich chuyen","Co","Khong")
If Hoi = True then
For i=1 to (ubound(DI)-1)
Call Tocdodichchuyen(DI(i).x, DI(i).y,DI(i).vx, DI(i).vy,DI(i).svx, DI(i).svy,tl)
Next
End If
End Sub
2.2.2.2 Thuật toán hiển thị tốc độ dịch chuyển
Trong phần trên tại hàm Thehiendiem(DI() as Diem) có lệnh gọi tới hàm Tocdodichchuyen(DI(i).x, DI(i).y,DI(i).vx, DI(i).vy,DI(i).svx, DI(i).svy,tl) thì đây là một hàm thể hiện tốc độ chuyển dịch của tại một điểm đo có chứa các thông số về thông tin kinh độ x, vỹ độ y, vận tốc chuyển dịch theo hướng Đông, Bắc là vx,vy và sai số vận tốc chuyển dịch theo hướng Đông, Bắc là svx,svy, tỷ lệ bản đồ tl :
Sub Tocdodichchuyen(x as float,y as float,vx as float, vy as float, svx as float, svy as float,tle as float)
Dim x1,y1,x2,y2,x3,y3 as float
x1= x + tle*vx
y1= y + tle*vy
x2= x1 + svx*tle*3
y2= y1 - svy*tle*3
x3= x1 - svx*tle*3
y3= y1 + svy*tle*3
Create Ellipse
(x2,y2) (x3,y3)
Pen MakePen(1,2,GREEN)
Brush MakeBrush(01,Black,Black)
Create Line (x,y) (x1,y1)
Pen MakePen(1,59,Black)
End Sub
2.2.2.3 Thuật toán lấy dữ liệu chọn tam giác và hiển thị lưới tam giác
Sau khi ta có phần hiển thị và lấy dữ liệu của lưới điểm đo thì công việc tiếp theo sẽ là việc chọn tam giác địa động lực. Qua phần hiển thị điểm ta có cách nhìn trực quan từ đó chọn các tam giác vào file Excel như hình 2.4. Dữ liệu tam giác này sẽ được lưu vào một biến có cấu trúc tên là Tamgiac:
Type Tamgiac
Tendiem as string
d1 as integer
d2 as integer
d3 as integer
End Type
Trong đó biến Tendiem là kiểu chuỗi lưu tên của tam giác được chọn, d1,d2,d3 là 3 biến lưu tương ứng 3 điểm trên một tam giác được chọn. Dưới đây là code của hàm có tác dụng lấy dữ liệu tam giác trong file dữ liệu chọn tam giác:
Sub Laydulieutamgiac(TGD() as Tamgiac)
Filename=FileOpenDlg("","","XLS","Hay nhap file so lieu cho chon tam giac")
Register Table Filename
Type "XLS"
Into "C:\Chontamgiac.Tab"
Dim i as integer
i=1
Redim TGD(i)
Open table "C:\Chontamgiac.Tab"
Fetch First From Chontamgiac
TGD(i).Tendiem = Chontamgiac.col1
TGD(i).d1 = Chontamgiac.col2
TGD(i).d2 = Chontamgiac.col3
TGD(i).d3 = Chontamgiac.col4
Do while not EOT(Chontamgiac)
TGD(i).Tendiem = Chontamgiac.col1
TGD(i).d1 = Chontamgiac.col2
TGD(i).d2 = Chontamgiac.col3
TGD(i).d3 = Chontamgiac.col4
i=i + 1
Redim TGD(i)
Fetch Next From Chontamgiac
Loop
Close Table Chontamgiac
End Sub
2.2.2.4 Thuật toán nhân ma trận bậc 4
Do Mapbasic không hỗ trợ mảng hai chiều do đó hạn chể trong việc tính toán trong ma trận.Trong chương trình này ta chỉ cần tính toán đối với các ma trận bậc 4.Do đặc điểm này mà ta sẽ khai báo một kiểu cấu trúc ma trận bậc 4 như sau :
Type Matranb4
h1 as float
h2 as float
h3 as float
h4 as float
End Type
Trong đó h1,h2,h3,h4 được ví như các hàng của ma trận, khai báo một biến chuỗi kiểu Matranb4 ta sẽ có được một biến dữ liệu ma trận 4 hàng và nhiều cột. Hàm có tên NhanMT(MT1() as Matranb4, MT2() as Matranb4, MTKQ() as Matranb4) có tác dụng nhân 2 ma trận bậc 4 đầu vào là MT1(), MT2() và cho ra một kết quả là MTKQ(). Code của hàm này như sau :
Sub NhanMT(MT11() as Matranb4, MT22() as Matranb4, MTN() as Matranb4)
Dim k1,k2,k3,k4 as float
Dim i,s as integer
s = ubound(MT22)
Redim MTN(s)
For i = 1 to ubound(MT22)
k1 = MT11(1).h1 * MT22(i).h1
k2 = MT11(2).h1 * MT22(i).h2
k3 = MT11(3).h1 * MT22(i).h3
k4 = MT11(4).h1 * MT22(i).h4
MTN(i).h1 = k1+k2+k3+k4
Next
For i = 1 to ubound(MT22)
k1 = MT11(1).h2 * MT22(i).h1
k2 = MT11(2).h2 * MT22(i).h2
k3 = MT11(3).h2 * MT22(i).h3
k4 = MT11(4).h2 * MT22(i).h4
MTN(i).h2 = k1+k2+k3+k4
Next
For i = 1 to ubound(MT22)
k1 = MT11(1).h3 * MT22(i).h1
k2 = MT11(2).h3 * MT22(i).h2
k3 = MT11(3).h3 * MT22(i).h3
k4 = MT11(4).h3 * MT22(i).h4
MTN(i).h3 = k1+k2+k3+k4
Next
For i = 1 to ubound(MT22)
k1 = MT11(1).h4 * MT22(i).h1
k2 = MT11(2).h4 * MT22(i).h2
k3 = MT11(3).h4 * MT22(i).h3
k4 = MT11(4).h4 * MT22(i).h4
MTN(i).h4 = k1+k2+k3+k4
Next
End Sub
2.2.2.5 Thuật toán chuyển vị ma trận bậc 4
Đây là một hàm có tác dụng với đầu vào là một ma trận bậc 4 sẽ cho ra kết quả là ma trận chuyển vị của nó có dạng ma trận bậc 4 theo phép chuyển đổi ma trận chuyển vị ở chương 2 phần ma trận chuyển vị. Hàm này được khai báo có tên Chuyenvi(MTBD() as Matranb4, MTCV() as Matranb4) Trong đó MTBD() là biến có kiểu cấu trúc Matranb4 là ma trận dữ liệu đầu vào, và kết quả của chuyển vị này là ma trận dữ liệu được lưu vào biến MTCV() có cấu trúc Matranb4. Hàm này có code như sau :
Sub Chuyenvi(MTBD() as Matranb4, MTCV() as Matranb4)
Dim a1,a2,a3,a4 as float
Dim i as integer
Redim MTCV(4)
For i = 1 to 4
a1=MTBD(i).h1
a2=MTBD(i).h2
a3=MTBD(i).h3
a4=MTBD(i).h4
If i=1 then
MTCV(1).h1 = a1
MTCV(2).h1 = a2
MTCV(3).h1 = a3
MTCV(4).h1 = a4
ElseIf i=2 then
MTCV(1).h2 = a1
MTCV(2).h2 = a2
MTCV(3).h2 = a3
MTCV(4).h2 = a4
ElseIf i=3 then
MTCV(1).h3 = a1
MTCV(2).h3 = a2
MTCV(3).h3 = a3
MTCV(4).h3 = a4
ElseIf i=4 then
MTCV(1).h4 = a1
MTCV(2).h4 = a2
MTCV(3).h4 = a3
MTCV(4).h4 = a4
End If
Next
End Sub
2.2.2.6 Thuật toán tính định thức ma trận bậc 4
Để tính định thức của ma trận bậc 4 theo công thức (1.22) trước tiên ta tạo một hàm tính định thức bậc 3 rồi tính định thức bậc 4 theo như phần trình bày tại mục 1.2.3. Hàm tính định thức bậc 4 được khai báo có tên như sau: Det44(MT4() as Matranb4,det as float) và hàm con của nó tính định thức cho ma trận bậc 3 có tên được khai báo là Det33(MT3() as Matranb4,det as float).
Sub Det44(MT4() as Matranb4,det as float)
Dim MT33() as Matranb4
Dim dt,b1,b2,b3,k1,k2,k3,k4 as float
Dim i as integer
Redim MT33(3)
For i=1 to 3
b1 = MT4(i+1).h2
b2 = MT4(i+1).h3
b3 = MT4(i+1).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k1 = dt* MT4(1).h1
For i=1 to 4
If i = 1 then
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>2 then
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k2 = dt* MT4(2).h1
For i=1 to 4
If i=1 or i=2 then
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>3 then
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k3 = dt* MT4(3).h1
For i=1 to 3
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k4 = dt* MT4(4).h1
det = k1 - k2 + k3 -k4
End Sub
'.......................................................................
Sub Det33(MT3() as Matranb4,det as float)
Dim a1,a2,a3,a4,a5,a6 as float
a1= MT3(1).h1 * MT3(2).h2 * MT3(3).h3
a2= MT3(1).h1 * MT3(3).h2 * MT3(2).h3
a3= MT3(2).h1 * MT3(1).h2 * MT3(3).h3
a4= MT3(2).h1 * MT3(3).h2 * MT3(1).h3
a5= MT3(3).h1 * MT3(1).h2 * MT3(2).h3
a6= MT3(3).h1 * MT3(2).h2 * MT3(1).h3
det = a1 - a2 - a3 + a4 + a5 -a6
End Sub
Trong đó hàm Det33 xử lý tính định thức ma trận đầu vào là MT3() cho kết quả định thức của ma trận này là det. Hàm Det44 sẽ tính định thức cho ma trận đầu vào MT4() và kết quả là det.
2.2.2.7 Thuật toán tính ma trận nghịch đảo bậc 4
Do việc Mapbasic không hỗ trợ mảng 2 chiều do vậy việc tính ma trận nghịch đảo tương đối dài dòng. Hàm có tên được khai báo là Ngichdao(MT4() as Matranb4, MTND() as Matranb4) có tác dụng tính ma trận nghịch đảo của ma trận đầu vào được lưu tại biến tên MT4() và kết quả của nó được lưu tại biến MTND(), cả hai biến này đều có dạng biến cấu trúc của Matranb4. Cách thức tính toán theo phần lý thuyết tính ma trận nghịch đảo tại chương 1. Dưới đây là code của hàm tính ma trận nghịch đảo bậc 4 :
Sub Ngichdao(MT4() as Matranb4, MTND() as Matranb4)
Dim MT33(),ND() as Matranb4
Dim k,dt,b1,b2,b3 as float
Dim i as integer
Redim MT33(3)
Redim MT4(4)
Redim ND(4)
Redim MTND(4)
'1111111111111111111111111111111111111111111111
For i=1 to 3
b1 = MT4(i+1).h2
b2 = MT4(i+1).h3
b3 = MT4(i+1).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k = dt
ND(1).h1 = k
For i=1 to 4
If i = 1 then
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>2 then
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k = dt
ND(2).h1 = -k
For i=1 to 4
If i=1 or i=2 then
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>3 then
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k = dt
ND(3).h1 = k
For i=1 to 3
b1 = MT4(i).h2
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k = dt
ND(4).h1= -k
'222222222222222222222222222222222222222222
For i=1 to 3
b1 = MT4(i+1).h1
b2 = MT4(i+1).h3
b3 = MT4(i+1).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k = dt
ND(1).h2 = -k
For i=1 to 4
If i = 1 then
b1 = MT4(i).h1
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>2 then
b1 = MT4(i).h1
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k = dt
ND(2).h2 = k
For i=1 to 4
If i=1 or i=2 then
b1 = MT4(i).h1
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>3 then
b1 = MT4(i).h1
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k = dt
ND(3).h2 = -k
For i=1 to 3
b1 = MT4(i).h1
b2 = MT4(i).h3
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k = dt
ND(4).h2= k
'33333333333333333333333333333333333333
For i=1 to 3
b1 = MT4(i+1).h1
b2 = MT4(i+1).h2
b3 = MT4(i+1).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k = dt
ND(1).h3 = k
For i=1 to 4
If i = 1 then
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>2 then
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h4
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k = dt
ND(2).h3 = -k
For i=1 to 4
If i=1 or i=2 then
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>3 then
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h4
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k = dt
ND(3).h3 = k
For i=1 to 3
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h4
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k = dt
ND(4).h3= -k
'4444444444444444444444444444444444444444444
For i=1 to 3
b1 = MT4(i+1).h1
b2 = MT4(i+1).h2
b3 = MT4(i+1).h3
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k = dt
ND(1).h4 = -k
For i=1 to 4
If i = 1 then
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h3
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>2 then
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h3
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k = dt
ND(2).h4 = k
For i=1 to 4
If i=1 or i=2 then
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h3
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
ElseIf i>3 then
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h3
MT33(i-1).h1 = b1
MT33(i-1).h2 = b2
MT33(i-1).h3 = b3
End If
Next
Call Det33(MT33(),dt)
k = dt
ND(3).h4 = -k
For i=1 to 3
b1 = MT4(i).h1
b2 = MT4(i).h2
b3 = MT4(i).h3
MT33(i).h1 = b1
MT33(i).h2 = b2
MT33(i).h3 = b3
Next
Call Det33(MT33(),dt)
k = dt
ND(4).h4= k
Dim ND2() as Matranb4
Dim det as float
Call Det44(MT4(),det)
Call Chuyenvi(ND(),ND2())
For i= 1 to 4
MTND(i).h1 = ND2(i).h1/det
MTND(i).h2 = ND2(i).h2/det
MTND(i).h3 = ND2(i).h3/det
MTND(i).h4 = ND2(i).h4/det
Next
End Sub
2.2.2.8 Thuật toán tính và hiển thị biến dạng xoay và sai số
Đây là thuật toán đòi hỏi sự tổng hợp của các thuật toán trình bày ở trên trong việc tính toán để đưa ra được kết quả là giá trị của biến dạng xoay trong một tam giác địa động lực, từ đó tính cho tất cả các tam giác trong lưới tam giác đã được chọn.Đó là để tính được giá trị biến dạng xoay ω trong một tam giác thì đầu tiên phải sử dụng hàm lấy dữ liệu từ file số liệu đầu vào, số liệu này được lưu vào biến DI() như một ma trận lưu dữ liệu. Đây là số liệu thô ban đầu gồm tất cả các dữ liệu liên quan đến số liệu đầu vào cho việc tính toán biến dạng và sai số cho biến dạng xoay. Từ số liệu thô này ta phải chuyển dữ liệu để có thể tính được ma trận F như theo công thức (1.15) là F=A-1Vij, ma trận A và Vij là 2 ma trận cần tìm, ma trận A là ma trận khoảng cách, và Vij là ma trận giá trị vận tốc đều có thể tính được theo công thức tính biến dạng trình bày ở mục 1.1.5.2, ma trận A các giá trị khoảng cách sẽ được tính bằng hàm tính khoảng cách trong Mapbasic. Và việc tính giá trị của 2 ma trận này sẽ được thực hiện theo hàm có tên ChuyenDuLieuMatran(MTDL() as Diem,VIJ() as Matranb4,A() as Matranb4,MS() as Matranb4) Trong đó có biến đầu vào là MTDL() sẽ chứa dữ liệu đầu vào ban đầu, và các biến đầu ra là :VIJ() là biến lưu giá trị của ma trận Vij, A() là biến lưu giá trị của ma trận A, MS() là ma trận lưu giá trị sai sổ được tính cho sai số vận tốc dịch chuyển.Hàm này được định nghĩa trong code của chương trình như sau :
Sub ChuyenDuLieuMatran(MTDL() as Diem,VIJ() as Matranb4,A() as Matranb4,MS() as Matranb4)
Redim MS(1)
Redim VIJ(1)
Redim A(4)
VIJ(1).h1=(MTDL(1).vx - MTDL(2).vx)/1000
VIJ(1).h2=(MTDL(1).vy - MTDL(2).vy)/1000
VIJ(1).h3=(MTDL(1).vx - MTDL(3).vx)/1000
VIJ(1).h4=(MTDL(1).vy - MTDL(3).vy)/1000
MS(1).h1=abs((MTDL(1).svx - MTDL(2).svx)/1000)
MS(1).h2=abs((MTDL(1).svy - MTDL(2).svy)/1000)
MS(1).h3=abs((MTDL(1).svx - MTDL(3).svx)/1000)
MS(1).h4=abs((MTDL(1).svy - MTDL(3).svy)/1000)
Dim kx12,ky12,kx13,ky13 as float
kx12 = distance(MTDL(1).x,MTDL(1).y,MTDL(2).x,MTDL(1).y,"m")
ky12 = distance(MTDL(1).x,MTDL(1).y,MTDL(1).x,MTDL(2).y,"m")
kx13 = distance(MTDL(1).x,MTDL(1).y,MTDL(3).x,MTDL(1).y,"m")
ky13 = distance(MTDL(1).x,MTDL(1).y,MTDL(1).x,MTDL(3).y,"m")
If MTDL(2).x > MTDL(1).x then
kx12 = -kx12
End If
If MTDL(2).y > MTDL(1).y then
ky12 = -ky12
End If
If MTDL(3).x > MTDL(1).x then
kx13 = -kx13
End If
If MTDL(3).y > MTDL(1).y then
ky13 = -ky13
End If
A(1).h1 = kx12
A(2).h1 = ky12
A(3).h2 = kx12
A(4).h2 = ky12
A(1).h3 = kx13
A(2).h3 = ky13
A(3).h4 = kx13
A(4).h4 = ky13
End Sub
Sau khi tìm được ma trận A và Vij phục vụ cho việc tìm ma trận F thì ta sẽ áp dụng thuật toán tính nghịch đảo của ma trận A và thuật toán nhân 2 ma trận để tính F theo công thức (1.15). Tìm được ma trận F từ đó ta tính được biến dạng xoay theo công thức (1.14) là ω=12∂vx∂y-∂vy∂x, Sử dụng hàm lấy dữ liệu chọn tam giác ta sẽ tính được các giá trị ω trong các tam giác trong lưới được chọn. Việc này được thực hiện tuần tự trong từng tam giác một kèm theo cách tính sai số của trong từng tam giác, Tính các giá trị biến dạng xoay rồi ra cũng sẽ thể hiện lưới tam giác ra bản đồ của Mapinfo bằng hàm có tên Biendangxoay(x as float, y as float, w as float) trong code của chương trình Hàm này có tác dụng nhận các biến đầu vào là kinh độ x, vỹ độ y, giá trị biến dạng xoay w để thể hiện biến dạng xoay ra bản đồ mapinfo giống trong hình 1.2((c),(d)). Hàm này sẽ xét các điều kiện giá trị biến dạng xoay w là lớn hay bé, ngược chiều hay cùng chiều kim đồng hồ mà có những góc xoay hay kiểu xoay khác nhau được thể hiện trên bản đồ Mapinfo theo tỉ lệ của bản đồ.Hàm này được định nghĩa trong code của chương trình như sau :
Sub Biendangxoay(x as float, y as float, w as float)
Dim tle,sw as float
tle = 500
sw = w*(10^9)
Dim y1,x2,y2 as float
y1=y + 1
Dim o,ob,ob1,ob2,ob3,oo as object
o = CreatePoint(x,y)
ob1 = CreateLine(x,y,x,y1)
ob2 = RotateAtPoint(ob1,-5,Centroid(o))
x2 = ObjectGeography(ob2, OBJ_GEO_LINEENDX)
y2 = ObjectGeography(ob2, OBJ_GEO_LINEENDY)
ob3 = CreateLine(x,y1,x2,y2)
ob = combine(ob1,ob2)
ob = combine(ob,ob3)
oo= RotateAtPoint(ob,-5,Centroid(o))
If sw>0 then
If sw <= 1 then
Insert Into Lonlat(obj) values (ob)
ElseIf sw >1 and sw <=3 then
oo= combine(ob,oo)
Insert Into Lonlat(obj) values (oo)
ElseIf sw>3 and sw <=5 then
oo = combine (ob,oo)
ob1 = RotateAtPoint(ob,-10,Centroid(o))
oo = combine (ob,oo)
Insert Into Lonlat(obj) values (oo)
Else
oo = combine (ob,oo)
ob1 = RotateAtPoint(ob,-30,Centroid(o))
oo = combine (ob,oo)
Insert Into Lonlat(obj) values (oo)
End If
Else
oo= RotateAtPoint(ob,5,Centroid(o))
If sw >= -1 then
Insert Into Lonlat(obj) values (oo)
ElseIf sw >1 and sw <=3 then
oo= combine(ob,oo)
Insert Into Lonlat(obj) values (oo)
ElseIf sw=-5 then
oo = combine (ob,oo)
ob1 = RotateAtPoint(ob,10,Centroid(o))
oo = combine (ob,oo)
Insert Into Lonlat(obj) values (oo)
Else
oo = combine (ob,oo)
ob1 = RotateAtPoint(ob,30,Centroid(o))
oo = combine (ob1,oo)
Insert Into Lonlat(obj) values (oo)
End If
End if
End Sub
Tiếp theo sẽ là phần ghi dữ liệu đó là hàm ghi file dữ liệu Print File trong Mapbasic và việc này se được ghi tuần tự khi mỗi giá trị biến dạng xoay và sai số được tính trong một tam giác.File này sẽ được lưu vào đường dẫn chứa file chọn tam giác.
Công việc tính toán giá trị biến dạng xoay của lưới tam giác trong vùng nghiên cứu, việc in file kết quả, xuất hiển thị ra bản đồ sẽ được xử lý bằng hàm có tên BienDang trong code của chương trình. Hàm này được định nghĩa như sau:
Sub BienDang
Dim x,y,vx,vy,svx,svy,ex,ey,exy,e1,e2,w,g as float
Dim i as integer
Call Laydulieutamgiac(TG())
Dim DDI() as Diem
ReDim DDI(3)
Dim d as integer
Dim tle as float
tle = tile/10
Dim se1,se2,sw,sg,sex,sey,sexy,xg,yg as float
Dim V(),A(),NA(),MTN(),MS(),MTN1() as Matranb4
Dim st2,st3,st4,st6,st7,st8 as string*15
Dim st,st1,st5,st9 as string*8
Open File "ketqua.txt" for Output as #1
Print #1, "TenDagiac"+" "+" LON "+" " + " LAT "+" " + "BienDangXoay_W"+" "+ " SaiSo_W "
Print #1, " Name "+" "+ " (Độ) "+" " + " (Độ) "+" " + " (Radian/Năm) "+" "+ " (Radian/Năm) "
For i=1 to (ubound(TG)-1)
d = TG(i).d1
DDI(1).tendiem = DI(d).tendiem
DDI(1).x=DI(d).x
DDI(1).y=DI(d).y
DDI(1).vx=DI(d).vx
DDI(1).vy=DI(d).vy
DDI(1).svx=DI(d).svx
DDI(1).svy=DI(d).svy
d = TG(i).d2
DDI(2).tendiem = DI(d).tendiem
DDI(2).x=DI(d).x
DDI(2).y=DI(d).y
DDI(2).vx=DI(d).vx
DDI(2).vy=DI(d).vy
DDI(2).svx=DI(d).svx
DDI(2).svy=DI(d).svy
d = TG(i).d3
DDI(3).tendiem = DI(d).tendiem
DDI(3).x=DI(d).x
DDI(3).y=DI(d).y
DDI(3).vx=DI(d).vx
DDI(3).vy=DI(d).vy
DDI(3).svx=DI(d).svx
DDI(3).svy=DI(d).svy
Call Trongtam(DDI(),xg,yg)
Create text
TG(i).tendiem
(xg, yg) (xg + 0.2,yg + 0.2)
Font MakeFont ("Helvetica",1,12,Black,Green)
Call ChuyenDuLieuMatran(DDI(), V(),A(),MS())
Call Ngichdao(A(),NA())
Call NhanMT(NA(),V(), MTN())
Call NhanMT(NA(),MS(),MTN1())
ex=MTN(1).h1
ey=MTN(1).h4
exy = (MTN(1).h2 + MTN(1).h3)/2
e1= (ex+ey)/2 + sqr(exy^2 + ((ex-ey)/2)^2)
e2= (ex+ey)/2 - sqr(exy^2 + ((ex-ey)/2)^2)
w= (MTN(1).h2 - MTN(1).h3)/2
g=atn(2*exy/(ey-ex))/2
g=g*(180/3.141)
sex=abs(MTN1(1).h1)
sey=abs(MTN1(1).h4)
sexy = (abs(MTN1(1).h2) + abs(MTN1(1).h3))/2
se1= (sex+sey)/2 + sqr(sexy^2 + ((sex+sey)/2)^2)
se2= abs((sex+sey)/2 - sqr(sexy^2 + (abs(sex-sey)/2)^2))
sw= abs(abs(MTN1(1).h2) - abs(MTN1(1).h3))/2
sg=atn(2*sexy/abs(sey-sex))/2
sg=sg*(180/3.141)
st= Str$(xg)
st1= Str$(yg)
st2= Str$(e1)
st3= Str$(e2)
st4= Str$(w)
st5= Str$(g)
st6= Str$(se1)
st7= Str$(se2)
st8= Str$(sw)
st9= Str$(sg)
Print #1, TG(i).Tendiem + " "+ st + " " + st1 + " " +" " + st4 +" " + st8
g = -g
' Call Vemuiten(xg,yg,e1,e2,g,tle)
Call Biendangxoay(xg,yg,w)
Next
Close File #1
Alter Menu Item BienDang Disable
Alter Menu Item HienDiem Enable
End Sub
Ngoài ra còn một số hàm nhỏ khác phục vụ cho các hàm chính được trình bày ở trên. Các hàm này được chỉ rõ trong code của chương trình.
2.2.2 ĐÁNH GIÁ VỀ THUẬT TOÁN TRONG CHƯƠNG TRÌNH
Cũng do Mapbasic không hỗ trợ mảng 2 chiều do đó thuật toán còn khá dài và hạn chế tính đa dạng của nó trong tính toán (như trong ngôn ngữ lập trình C có hỗ trợ mảng 2 chiều nên việc tính ma trận trong thuật toán rất ngắn gọn mà sử dụng cho việc tính cho các ma trận lớn nhiều bậc khác nhau rất linh hoạt mà ở đây chỉ hạn chế trong tính ma trận bậc 4). Từ đó mà những thuật toán trong chương trình tương đối khó hiểu và dài dòng. Tuy nhiên nó cũng đáp ứng được những yêu cầu đề ra để tính toán thể hiện các số liệu biến dạng xoay trong lưới tam giác địa động lực của khu vực nghiên cứu. Việc phân tách các hàm xử lý cho từng vấn đề giúp người lập trình dễ dàng trong việc sửa chữa và nâng cấp.
CHƯƠNG 3 :
GIAO DIỆN VÀ SỬ DỤNG CHƯƠNG TRÌNH
Để minh họa cho cách sử dụng chương trình em sẽ minh họa chương trình sẽ tính biến dạng xoay trong một tam giác địa động lực theo số liệu trong luận văn tiến sĩ “BIẾN DẠNG KIẾN TẠO HIỆN ĐẠI KHU VỰC BIỂN ĐÔNG VIỆT NAM THEO SỐ LIỆU DỊCH CHUYỂN GPS” của nghiên cứu sinh Nguyễn Văn Hướng tại Phòng Địa Động Lực – Viện Địa Chất mà trong luận văn này sử dụng để tính toán biến dạng.
3.1 GIAO DIỆN CHƯƠNG TRÌNH
Chương trình có giao diện trong khung đỏ ở hình 3.1
Hình 3.1: Giao diện của chương trình
Chương trình khi chạy lên Mapinfo nằm ở ngoài cùng của menu chính, có tên là Tinh Bien Dang (Hình 3.1), khi click chuột vào tool này nó sẽ sổ xuống là các lựa chọn : Tinh thực hiện việc chạy chương trình cho tính biến dạng, Ket Thuc C.trinh thực hiện thoát tool khỏi Mapinfo và Thoat thực hiện việc thoát tất cả cửa sổ Mapinfo. Khi lựa chọn menu Tinh (Hình 3.1) thì ở đây có 2 lựa chọn nhỏ đó là Hien Thi Diem có nhiệm vụ hiển thị các điểm hay tốc độ chuyển dịch ra cửa sổ bản đồ Mapinfo và Tinh Bien Dang thực hiện việc tính biến dạng xoay, in file dữ liệu kết quả, hiển thị lưới tam giác và biến dạng xoay trong tam giác ra cửa sổ bản đồ của Mapinfo.
3.2 SỬ DỤNG CHƯƠNG TRÌNH
Để minh họa cho việc chạy chương trình ta kiểm định bằng việc chạy thử một ví dụ. Đó là tính biến dạng xoay cho khu vực biển Đông theo ssố liệu GPS trong đề tài “BIẾN DẠNG KIẾN TẠO HIỆN ĐẠI KHU VỰC BIỂN ĐÔNG VIỆT NAM THEO SỐ LIỆU DỊCH CHUYỂN GPS” của nghiên cứu sinh Nguyễn Văn Hướng tại Phòng Địa Động Lực – Viện Địa Chất. Bảng dữ liệu đầu vào gồm các số liệu như sau :
STT
Tên điểm
Kinh độ
Vỹ độ
Ve
Vn
SVe
SVn
1
STT1
114,331
11,429
23,40
-10,57
1,44
1,34
2
BLV1
107,723
20,128
30,12
-12,46
1,36
1,29
3
CDA1
106,652
8,692
21,76
-9,84
1,39
1,32
4
DOHO
106,616
17,507
26,63
-9,48
1,37
1,31
5
HOCM
106,560
10,849
22,00
-13,75
1,47
1,36
6
NTUS
103,680
1,346
27,41
-7,05
0,87
0,85
7
KUNM
102,797
25,030
30,63
-17,77
0,80
0,79
8
PIMO
121,078
14,636
-29,00
4,70
0,90
0,90
9
TNML
120,987
24,798
28,66
-9,62
0,80
0,80
10
TNSM
116,725
20,702
29,70
-12,90
0,20
0,10
11
BRG1
120,601
18,520
-48,50
9,80
0,40
0,40
12
BTS3
121,963
20,438
-38,50
27,90
0,90
0,60
13
S102
121,558
22,037
-38,80
39,30
0,30
0,30
14
S23R
120,606
22,645
-22,90
-10,60
0,10
0,10
15
LNI1
106,539
11,822
25,83
-13,47
2,50
2,19
16
JB21
110,306
25,186
33,01
-13,49
0,07
0,15
17
XIAM
118,082
24,449
32,10
-14,40
0,10
0,10
18
YONG
112,335
16,834
30,10
-11,60
0,10
0,10
19
TABA
108,891
0,863
29,83
-9,20
0,95
1,26
20
BRUN
115,031
4,966
28,66
-10,65
2,10
3,30
21
PUER
118,851
10,086
32,00
-13,60
1,00
0,70
Bảng 3.1: Số liệu tốc độ chuyển dịch theo số liệu GPS khu vực biển Đông
Trong đó Ve,Vn lần lượt là giá trị tốc độ chuyển dịch theo hướng Đông và Bắc, đơn vị là mm/năm. SVe và SVn lần lượt các sai số của Ve và Vn,đơn vị là mm/năm.
Ngoài bảng số liệu ta còn có dữ liệu đầu vào nữa đó là một ảnh mô hình số độ cao DEM (Hình 3.2) cho khu vực Biển Đông để làm nền cho hiển thị cửa sổ bản đồ trong Mapinfo.
Hình 3.2: Mô hình số độ cao DEM khu vực Biển Đông
Trước khi sử dụng chương trình đầu tiên ta tạo một file số liệu Excel (Hình 2.3) theo số liệu ở bảng 3.1 (Lưu ý: file Excel lưu định dạng của Excel 97 -2003 có đuôi.XLS) Sau khi tạo file dữ liệu đầu vào xong ta khởi động Mapinfo. Chọn Tool\Run MapBasic Program (Hình 3.3). Sau đó sẽ xuất hiện hộp thoại chọn file chạy chương trình (Hình 3.4). Ta chọn đường dẫn tới chương trình được lưu có tên biendang.MBX rồi chọn Open.Ta được giao diện như trong hình 3.5.
Hình 3.3: Giao diện chạy chương trình MapBasic
Hình 3.4: Hộp thoại chọn chương trình chạy
Hình 3.5: Giao diện chương trình khi khởi động
Trước khi chạy chương trình ta tạo một bản đồ mới có hệ tọa tọa địa lý (Lon/Lat) được minh họa bằng các hình dưới đây:
Hình 3.6: Giao diện lựa chọn tạo một bản đồ mới
Ta chọn File\New Table... để tạo một bản đồ mới.Sẽ xuất hiện hộp thoại lựa chọn tạo một Table mới (Hình 3.7):
Hình 3.7: Hộp thoại tạo một Table mới
Hộp thoại xuất hiện ta click chọn Create để tạo một Table mới.Sẽ xuất hiện hộp thoại lựa chọn (Hình 3.8). Ta chọn Add Field để tạo một trường bản đồ, Click chọn Projection để chọn hệ qui chiếu và hệ tọa độ chỏ Table.
Hình 3.8: Hộp thoại lựa chọn tạo Table mới
Hình 3.9: Hộp thoại lựa chọn hệ tọa độ cho Table
Ở đây ở mục Category ta chọn hệ qui chiếu là hệ tọa độ địa lý Longitude /Latitude Và mục Category Member là lựa chọn hệ tọa độ ta chọn Longitude /Latitude.Sau đó ta click Ok sẽ xuất hiện hộp thoại chọn đường dẫn và lưu tên Table (Hình 3.10).
Hình 3.10: Chọn đường dẫn và lưu tên Table mới
Ta click chọn Save lúc này ở trong thư mục được chọn sẽ được tạo các file Lonlat.DAT,Lonlat.ID,Lonlat.Map, và Lonlat.TAB là những tệp liên quan đến table, dữ liệu, bản đồ, liên kết của Table có tên Lonlat.Lúc này cửa sổ bản đồ trong Mapinfo sẽ xuất hiện như hình 3.11. Ta khởi chạy chương trình Tinh Bien Dang bằng chọn Tinh Bien Dang\Tinh\Hien Thi Diem. Lúc này chương trình sẽ xuất hiện một hộp thoại chọn đường dẫn tới file số liệu đầu vào tính biến dạng, file này được chọn có định dạng.xls. Khi chọn được file dữ liệu đầu vào cho tính toán biến dạng ta chọn Open (Hình 3.12), Khi đó sẽ xuất hiện một hộp thoại hỏi “ Ban co muon the hien toc do dich chuyen” Chọn “ Co” để hiện thị tốc độ chuyển dịch, Chọn “ Khong” để chỉ hiển thị lưới điểm (Hình 3.13).
Hình 3.11: Giao diện sau khi tạo Table mới tên Lonlat
Hình 3.12: Hộp thoại chọn file số liệu đầu vào
Hình 3.13: Hộp thoại lựa chọn có thể hiện tốc độ dịch chuyển hay không
Nếu ta chọn “Khong” thì chương trình chạy sẽ hiển thị toàn bộ các điểm đo ra cửa sổ bản đồ của Mapinfo (Hình 3.14) gồm ký hiệu điểm, tên điểm đo và vị trí của nó trên cửa sổ bản đồ, khi phóng to hình ta nhìn rõ hơn (Hình 3.15).
Hình 3.14: Lưới điểm đo khi chạy chương trình
Khi phóng to một góc trên cửa sổ bản đồ này ta thấy rõ hơn tên điểm và ký hiệu của điểm đo trong cửa sổ bản đồ này (Hình 3.15).
Hình 3.15: Phóng to một góc hình 3.14
Trong hình 3.15 ta quan sát được 4 điểm đo đó là LNI1, HOCM, CDA1,STT1 là 4 điểm đo có trong dữ liệu file đầu vào, được ký hiệu điểm bởi một chấm đen và chữ có màu xanh,nền trắng.Trên hộp thoại hỏi (Hình 3.13) nếu ta chọn “Co” thì trên cửa sổ bàn đồ sẽ xuất hiện các đường dịch chuyển trong lưới đo (Hình 3.16).
Hình 3.16: Lưới tốc độ chuyển dịch
Khi phóng to một góc của bản đồ thể hiện lưới dịch chuyển ta sẽ quan sát được rõ hơn hình dáng mũi tên thể hiện tốc độ chuyển dịch (Hình 3.17).
Hình 3.17: Phóng to một góc hình 3.16
Trên hình 3.17 ta quan sát thấy tại vị trí các điểm đo có một đường mũi tên màu đen và hình elip máu xanh lục xuất hiện ở đầu mũi tên. Ở đây ta có thể thấy hình mũi tên chính là đường thể hiện tốc độ chuyển dịch tại vị trí điểm đo được thể hiện trên bản đồ. Hướng của mũi tên chính là hướng dịch chuyển của vị trí điểm đo, còn hình elip màu xanh lục thể hiện sai số tốc độ dịch chuyển tại vị trí điểm đấy. Elip và đường mũi tên đều được phóng đại theo cùng một tỷ lệ nhất định (vì thông số dịch chuyển rất bé nên khi hiển thị trên bản đồ cần phóng đại để có thể quan sát được).
Để minh họa lưới dịch chuyển được quan sát thực tế ta cho thể hiện thêm bản đồ số độ cao DEM của khu vực Biển Đông lên bản đồ sẽ cho ta nhìn một cách trực quan hơn (Hình 3.18). Cách thức thêm bản đồ mô hình số độ cao vào làm nền minh họa sẽ được trình bày ở phía dưới.
Hình 3.18: Lưới tốc độ dịch chuyển trên nền bản đồ độ cao khu vực biển Đông
Sau khi chạy chương trình trong lựa chọn menu Hien Thi Diem, lúc này menu Tinh Bien Dang sẽ được kích hoạt đậm màu và menu Hien Thi Diem bị vô hiệu hóa và mờ đi (Hình 3.19).Để tiếp tục chạy chức năng Tinh Bien Dang ta tạo file dữ liệu chọn tam giác (Quan sát lưới điểm đo hình 3.14) để có tiếp tục (Hình 2.4).Sau khi tạo file dữ liệu chọn tam giác ta chọn menu Tinh Bien Dang để tiếp tục chạy chương trình (Hình 3.18).
Hình 3.19: Menu của chương trình
Khi chạy chọn Tinh Bien Dang trong Menu Tinh (Hình 2.19) Chương trình sẽ xuất hiện một hộp thoại chọn đường dẫn tới file dữ liệu chọn tam giác vừa mới được tạo (Hình 3.20).
Hình 3.20: Hộp thoại chọn mở file dữ liệu chọn tam giác
Ta sẽ chọn file có tên “File chon tam giac.xls” Rồi click chọn Open (Hình 3.20). Sau khi khởi chạy chương trình cửa sổ bản đồ lúc này hiển thị kết quả là một lưới tam giác có các cạnh màu đỏ được liên kết với nhau (Lưới tam giác này được chọn theo người dùng đã lưu vào file số liệu chọn tam giác(Hình 2.4)) (Hình 3.21). Tại mỗi tam giác tại vị trí trọng tâm là ký hiệu của biến dạng xoay, ký hiệu này tùy thuộc vào giá trị của biến dạng xoay mà được thể hiện khác nhau.
Khi phóng to một góc bản đồ ta sẽ quan sát rõ hơn cách thể hiện biến dạng xoay trong một tam giác (Hình 3.23).
Hình 3.21: Lưới tam giác thể hiện biến dạng xoay
Trong đó các ký hiệu của biến dạng xoay trong hình 3.21 có ý nghĩa sau (Hình 3.22):
-1
-3
-5
<-5
+1
+3
+5
>+5
Ngược chiều kim đồng hồ
Đơn vị (nano radian/năm)
Cùng chiều kim đồng hồ
Đơn vị (nano radian/năm)
Hình 3.22: Ký hiệu biến dạng xoay
Hình 3.23: Phóng to một góc bản đồ của hình 3.21
Hình 3.21 thể hiện kết quả hiển thị trên cửa sổ bản đồ của Mapinfo bằng kết quả của hiển thị lưới tam giác và thể hiện tốc độ xoay.Cùng đó chương trình cũng xuất một file dữ liệu kết quả của tính toán tốc độ biến dạng xoay và sai số của nó, file này có tên mặc định là “ketqua.txt” được lưu vào đường dẫn có chứa file dữ liệu đầu vào. File dữ liệu kết quả này cho ta biết các thông số về tên tam giác được chọn, kinh độ,vĩ độ trọng tâm của tam giác đó, giá trị biến dạng xoay và sai số của nó trong tam giác được tính. File dữ liệu kết quả được minh họa ở hình 3.24 :
Hình 3.24: File kết quả tính biến dạng xoay và sai số
Ở hình 3.21 thể hiện lưới tam giác cùng ký hiệu thể hiện tốc độ biến dạng xoay của khu vực tính toán, vấn đề đặt ra là chèn một nền bản đồ thực tế để minh họa cho khu vực nghiên cứu.Trong phần đầu chương 3 đã có mô tả dữ liệu đầu vào gồm có một ảnh số mô hình độ cao (DEM) của khu vực Biển Đông và khu vực lân cận. Nhiệm vụ bây giờ là đưa file ảnh lên cửa sổ Mapinfo làm nền cho kết quả sau việc chạy chương trình.Dưới đây là trình tự các bước thực hiện:
Sau khi chạy chương trình đã có kết quả được hiển thị trên cửa sổ bản đồ trong Mapinfo, tiếp theo ta sẽ mở một Table có chứa ảnh số mô hình độ cao đã được Register (đăng ký). Đầu tiên từ thanh menu chính của Mapinfo ta chọn File\Open (Hình 3.25) một hộp thoại sẽ xuất hiện chọn đường dẫn tới file Table có chứa dữ liệu bản đồ mô hình số độ cao, ta chọn Open (Hình 3.26) lúc này cửa sổ bản đồ hiện thị bản đồ mô hình số độ cao cùng lưới tam giác trong đó (Hình 3.27).
Hình 3.25: Menu mở một Table trong Mapinfo
Hình 3.26: Hộp thoại chọn đường dẫn tới Table cần mở
Hình 3.27: Lưới tam giác trên bản đồ mô hình số độ cao
Khi đã có một kết quả cuối cùng trên hình 3.27 ta sẽ in bản đồ với những tỷ lệ khác nhau và tùy trên những bản giấy có khổ in khác nhau tùy thuộc vào lựa chọn của người dùng, những công cụ này có hỗ trợ sẵn trên Mapinfo.
CHƯƠNG 4:
ĐÁNH GIÁ VÀ PHÂN TÍCH KẾT QUẢ CHƯƠNG TRÌNH ĐẠT ĐƯỢC
4.1 ƯU ĐIỂM VÀ HẠN CHẾ CỦA CHƯƠNG TRÌNH
4.1.1 ƯU ĐIỂM
Chương trình chạy nhanh và ổn định trên nền của phần mềm Mapinfo
Giao diện dễ nhìn, phần mềm tương đối dễ sử dụng đối với người dùng
Kết quả tính toán biến dạng xoay có độ chính xác cao (phù hợp với mục tiêu tính toán đề ra)
Các số liệu đầu ra mang tính thực tế cao (vừa xuất luôn ra cửa sổ dữ liệu kiểu bản đồ và file dữ liệu kết quả)
4.1.2 HẠN CHẾ
Chương trình vẫn chạy dựa trên là một tool của Mapinfo, không chạy trực tiếp trên nền Window (do vậy cần phải cài đặt Mapinfo trước khi sử dụng)
Vẫn chưa bắt được hết các lỗi về dữ liệu cũng như lỗi hiển thị
Chương trình vẫn còn dạng sơ khai, chưa có những công cụ để lựa chọn thuộc tính trong việc nhập cũng như xuất dữ liệu
Kết quả tính sai số vẫn còn chưa chuẩn xác.
Trên là những hạn chế trong chương trình, tuy nhiên những hạn chế này là do hạn hẹp về thời gian cũng như kiến thức, nếu có thời gian tiếp tục nghiên cứu đề tài này em tin tưởng rằng trong tương lai gần sẽ khắc phục được những hạn chế nói trên.
4.2 PHÂN TÍCH ĐÁNH GIÁ KẾT QUẢ ĐẠT ĐƯỢC
Để đánh giá kết quả đạt được của chương trình, ta so sánh kết quả của chương trình tính được với kết quả tính của bộ phần mềm QOCA, kết quả so sánh này được thể hiện trong bảng 4.1 :
STT
Tên tam giác
Kinh độ trọng tâm
(degere)
Vỹ độ trọng tâm
(degere)
Biến dạng xoay tính theo chương trình
(radian/năm)
Biến dạng xoay tính theo QOCA
(radian/năm)
1
TG_01
105.712
20.8883
4.53437e-009
4.53e-09
2
TG_02
106.942
23.448
-9.18381e-010
-1.01e-09
3
TG_03
110.121
20.716
1.7459e-009
1.77 e-09
4
TG_04
113.122
20.9073
1.60446e-009
1.61 e-09
5
TG_05
115.038
23.4457
3.71338e-009
3.71 e-09
6
TG_06
108.891
18.1563
6.90789e-009
6.88 e-09
7
TG_07
111.094
15.2567
8.76603e-009
8.97 e-09
8
TG_08
114.464
16.3217
4.53523e-009
5.55 e-09
9
TG_09
109.162
13.586
-1.21725e-009
-1.18 e-09
10
TG_10
109.174
10.6477
4.36526e-009
1.23 e-09
11
TG_11
108.221
7.15567
-4.71115e-009
-4.81 e-09
12
TG_12
108.967
4.546
-1.77868e-009
-1.81 e-09
13
TG_13
112.751
5.75267
-2.45351e-009
-2.49 e-09
14
TG_14
116.071
8.827
3.363e-010
2.83 e-10
15
TG_15
118.087
12.0503
-5.83877e-008
-5.85 e-08
16
TG_16
117.378
15.589
1.29965e-009
1.53 e-09
17
TG_17
119.468
17.9527
-6.91522e-008
-7.18 e-08
18
TG_18
119.628
20.4197
-1.19375e-008
-
19
TG_19
119.757
22.5123
2.00909e-008
-
20
TG_20
118.598
23.3163
-3.48413e-009
-
Bảng 4.1: Bảng so sánh kết quả biến dạng xoay với phần mềm QOCA
Nhìn vào bảng so sánh kết quả tính biến dạng xoay trong chương trình ta thấy các tam giác có số thứ tự từ 1-17 là có sự lựa chọn về tam giác địa động lực là giống nhau nên ta chỉ so sánh kết quả tính được trong những tam giác này. Kết quả tính theo phần mềm QOCA được thể hiện trong chuyên đề tiến sĩ : “BIẾN DẠNG KIẾN TẠO HIỆN ĐẠI KHU VỰC BIỂN ĐÔNG VIỆT NAM THEO SỐ LIỆU DỊCH CHUYỂN GPS” của nghiên cứu sinh Nguyễn Văn Hướng.Theo PGS.TS Phan Trọng Trịnh-Viện Địa Chất thì các kết quả này nằm trong sự chênh lệch e-10 nên có thể chấp nhận đối với chương trình. Và kết quả mang độ chính xác tương đối cao. Trừ điểm tam giác TG_10 thì độ chênh lệch là tương đối lớn (3.12e-09) tuy vậy kết quả này vẫn có thể chập nhận được bởi vẫn nằm trong phạm vi sai số.
Về đánh giá sai số, do kết quả tính toán của chương trình còn khác biệt khá lớn với kết quả tính trên phần mềm QOCA do vậy em không đưa vào so sánh, tuy vậy phần tính toán sai số là phần tương đối phức tạp nên hiện tại em chưa thể hoàn thành phần tính toán sai số này.
Đánh giá chung thì chương trình đã đạt được mục tiêu đề ra là tính biến dạng xoay trong một tam giác địa động lực, và kết quả tính toán của nó có thể đưa vào sử dụng trong thực tế.
KẾT LUẬN VÀ KIẾN NGHỊ
Chương trình theo nhận định chung đã đáp ứng được yêu cầu tính biến dạng xoay và sai số của nó trong một tam giác địa động lực. Chương trình tương đối dễ sử dụng và dễ hiểu đối với người dùng. Kết quả của nó mang độ chính xác và tin cậy cao. Tuy nhiên hạn chế về thời gian cũng như kiến thức còn hạn hẹp nên kết quả này vẫn chưa được hiệu chỉnh tuy nhiên nó cũng đáp ứng được mục đích của tính biến dạng xoay trong một tam giác địa động lực. Chương trình vẫn chưa đa dạng trong phần lựa chọn các công cụ (như việc chọn màu chữ, cỡ chữ, đường, font... vẫn để chế độ mặc định khách quan của người lập trình viên).
Tuy vậy chương trình vẫn dừng lại ở tính biến dạng xoay cho một tam giác, chưa tính được đối với các đa giác lớn hơn (tứ giác, ngũ giác...) và việc chọn tam giác phải mang tính chất thủ công, chưa tự động chọn được lưới tam giác.Và tính biến dạng còn thiếu phần nội suy, đó là tại bất kỳ đâu trong lưới tính biến dạng có thể xác định được giá trị của biến dạng xoay chứ không phải chỉ ở mỗi trọng tâm tam giác tính được.
Tất cả những yếu tố trên đều là những hạn chế của chương trình, tuy nhiên để khắc phục được nó cần những kiến thức chuyên sâu về ngôn ngữ lập trình Mapbasic, sử dụng phần mềm Mapinfo, kiến thức về trắc địa, địa thống kê,cơ học, toán học...và cần một thời gian tương đối dài để thục hiện. Do sự hiểu biết có hạn của mình và thời gian hạn hẹp nên em chưa thể khắc phục được những điểm hạn chế này.
Nếu còn thời gian tiếp tục nghiên cứu về đề tài này em có những hướng phát triển chương trình như sau: Xây dựng chương trình trên một nền tảng riêng biệt có thể chạy trực tiếp trên Window mà không phụ thuộc vào các phần mềm khác (Mapinfo). Điều này đòi hỏi một kiến thức trắc địa thâm sâu vì nếu tính trên nền tảng riêng như vậy đòi hỏi phải tự xây dựng một hàm tính khoảng cách giữa 2 điểm bất kỳ trên trái đất và trên những hệ tọa độ chiếu khác nhau (Điều này thực hiện trên Mapinfo rất dễ dàng, đây chính là ưu điểm của nó). Chương trình xây dựng sẽ nghiên cứu tính nhiều giá trị biến dạng kiến tạo trong vỏ Trái Đất chứ không phải biến dạng xoay, như biến dạng chính, biến dạng trượt,... và nghiên cứu tính biến dạng trong một đa giác bất kỳ chứ không phải trong một tam giác. Nghiên cứu thuật toán Delaunay để có thể lựa chọn các đa giác một cách tự động mang độ chính xác cao trong lựa chọn tính toán biến dạng. Nghiên cứu phương pháp nội suy Kringing để có thể tính biến dạng tại bất kỳ vị trí nào trong lưới tính biến dạng. Và nghiên cứu các phương pháp nội suy khác để áp dụng cho từng khu vực có điều kiện khác nhau một cách hợp lý. Một vấn đề nữa cần nghiên cứu đó là hiệu chỉnh biến dạng theo tỷ lệ của tam giác địa động lực,....
Để hoàn thành được đề tài tốt nghiệp “ Nghiên cứu tính biến dạng xoay trong một tam giác địa động lực” này em xin chân thành cám ơn PGS Phan Trọng Trịnh, trưởng phòng Địa Động Lực – Viện Địa Chất, người đã hướng dẫn chỉ bảo tận tình giúp em hoàn thành đề tài tốt nghiệp của mình một cách tốt nhất. Cùng đó em cũng xin cám ơn các thầy các cô trong bộ môn Tin Học Địa Chất đã tạo điều kiện cho em hoàn thành tốt đồ án tốt nghiệp của mình, một lần nữa em xin chân thành cám ơn!
Các file đính kèm theo tài liệu này:
- Luận văn- Nghiên cứu lập trình tính biến dạng xoay trong một tam giác địa động lực.docx