Tính giá trị mô đun tổng biến dạng Eo

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Mời các bạn ngành ĐCCT-ĐKT biết hàm (Function) tính giá trị Eo:


Trong đó:
e0: Hệ số rỗng ban đầu của đất¸
a1-2: Hệ số nén lún của đất tương ứng cấp áp lực P1 =1 KG/cm2 đến P2 = 2(KG/cm2).
bêta : Phụ thuộc vào hệ số biến dạng ngang của từng loại đất:
bêta = 0.80 đối với đất cát;
bêta = 0.74 đối với đất cát pha;
bêta = 0.62 đối với đất sét pha;
bêta = 0.40 đối với đất sét.
mk: Hệ số chuyển đổi môđun tổng biến dạng trong phòng sang môđun tổng biến dạng bằng phương pháp tải trọng tĩnh ngoài hiện trường, tra bảng phụ thuộc vào độ sệt và hệ số rỗng. Trường hợp độ sệt (Is) < 0.75 thì tra bảng:



Trường hợp độ sệt > 0.75 lấy mk = 1 - 1.5.
 

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Có 2 kiểu để các bạn xây dựng hàm:
- Thứ 1: Hàm phụ thuộc vào cơ sở dữ liệu trên bảng tính. Tức là bạn nội suy từ bảng tra giá trị mk được xây dựng trong bảng tính. Luôn phải có bảng mk đi kèm với hàm.
- Thứ 2: Hàm viết độc lập, tức là
Mã:
Function Eo(Tendat,Is,Hesorong)
      ....
      ....
End Function
Nên sử dụng kiểu thứ 2. Cơ sở dữ liệu được khai báo ở dạng mảng. Khi đó hàm mang tính độc lập, không phụ thuộc vào bảng tính.

Mời các bạn tham gia! :-=
 

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Đây là ví dụ về hàm nội suy (hàm lập nội trú - Tôi chỉ làm theo định hướng chứ không cụ thể):

Mã:
Function mk(eo As Single)
    Dim Hesorong(8), DatSet(8) As Single
    Dim Rong As Variant
    Dim i As Integer
        ' Du lieu goc cua He so rong
        Hesorong(0) = 1: Hesorong(1) = 2: Hesorong(2) = 3: Hesorong(3) = 4
        Hesorong(4) = 5: Hesorong(5) = 6: Hesorong(6) = 7: Hesorong(7) = 8: Hesorong(8) = 9
        ' Du lieu goc cua Dat set
        DatSet(0) = 9: DatSet(1) = 10: DatSet(2) = 11: DatSet(3) = 12
        DatSet(4) = 13: DatSet(5) = 14: DatSet(6) = 15: DatSet(7) = 16: DatSet(8) = 17
    For Each Rong In Hesorong
        If Rong = eo Then
            mk = DatSet(Rong)
        ElseIf Rong > eo Then
            mk = DatSet(i + 1) - (DatSet(i + 1) - DatSet(i)) * (Hesorong(i + 1) - eo) / (Hesorong(i + 1) - Hesorong(i))
        End If
    Next
End Function
Từ đó bạn có thể xây dựng hàm tính Eo hoàn chỉnh. _)()(-

Nên dùng mảng 2 chiều thì thuận tiện hơn cho việc tính nội suy đối với đất sét, sét pha, cát pha.
 
Lần chỉnh sửa cuối:

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
4,365
Được thích
9,875
Điểm
860
Nơi ở
Hà Nội
Em thấy anh Hướng có nhiều Function & Sub giải quyết trong kỹ thuật. Anh đã quy tụ lại thành một ứng dụng chung cho nhiều người chưa? Nếu có anh có thể gửi lên đây được không?
 

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Toàn những hàm đơn giản thôi mà Tuân, so với ngành TC-KT thì mức độ phức tạp kém xa. Mà các function và sub mang nặng tính chuyên môn nên chẳng có ý nghĩa đối với người không biết.
Thỉnh thoảng post 1 vài hàm để mọi người mổ xẻ cho vui, để học VBA thì vẫn phải tự nghiên cứu thôi.

Mà sao chuyên gia không bổ sung code cho anh?
 
Lần chỉnh sửa cuối:

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Ngoài ra, các bạn có thể khai báo kiểu mảng như thế này:

Mã:
Dim i as integer
    Dim Hesorong, Datset, Setpha As Single
    Hesorong = Array(1, 2, 3, 4)
    Datset = Array(5, 6, 7, 8)
Sau đó bạn có thể xác định từng giá trị:
Hesorong (i)
Datset (i)


Chú ý: i bắt đầu từ giá trị 0

Chúc thành công!!
 

bucthucuoi

Thành viên mới
Tham gia ngày
14 Tháng chín 2006
Bài viết
14
Được thích
9
Điểm
0
Tuổi
36
Nơi ở
Ha Long City
Xin lỗi các bác về hàm Eo, Ro em post lên bị sai. Đây là phiên bản chính xác nhất.}}}}}

Bài không dấu sẽ bị xoá, tôi đã xóa nội dung bài post sai!
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Rất hoan nghênh bạn bucthucuoi đã thực hiện thành công hàm tính Ro (kG/cm2). Để hiểu cụ thể hơn về hàm này, tôi đã sửa 1 chút về hình thức và đã ghi chú cụ thể cho các bạn hiểu. Ngoài ra để sử dụng hàm này, tác giả nên bổ sung chú thích cho hoàn thiện.

Mã:
Function Ro(Khoiluongtt, C, Gocmasat as String, Bangtra As Range) As Single
     'Khoiluongtt: Khối lượng thể tích tự nhiên của đất (g/cm3)
     'C: lực dính kết (kG/cm2)
     'Gocmasat: trường hợp này vào ở dạng độ như 12o15'. Quy định cụ thể không thì sai, nếu độ nhỏ hơn 10 thì thêm số 0 ở đầu.

     ' Chuyển góc ma sát trong từ độ sang thập phân
        Dai = Len(Gocmasat) 'Tính số ký tự của Gocmatsat
           If Dai = 5 Then
               Gocmasat = Val(Left(Gocmasat, 1)) + Val(Mid(Gocmasat, 3, 2)) / 60
           ElseIf Dai = 6 Then
                Gocmasat = Val(Left(Gocmasat, 2)) + Val(Mid(Gocmasat, 4, 2)) / 60
           End If
    ' Kết hợp với hàm TraBang2Chieu để nội suy các hệ số A, B, D.
           HsA = TraBang2Chieu(1, Gocmasat, Bangtra)
           HsB = TraBang2Chieu(2, Gocmasat, Bangtra)
           HsD = TraBang2Chieu(3, Gocmasat, Bangtra)
    'Em kiểm tra lại công thức tính Ro, có thể sai do chưa đổi đơn vị đấy
           Ro = (HsA + HsB) * Khoiluongtt / 10 + C * HsD
End Function
Em phải hướng dẫn cụ thể hơn về cách sử dụng hàm thì mọi người mới hiểu được. Còn hàm tính Eo thì chưa được hoàn thiện.
 
Lần chỉnh sửa cuối:

nvson

Geotechnics
Thành viên danh dự
Tham gia ngày
20 Tháng chín 2006
Bài viết
794
Được thích
1,278
Điểm
860
Nơi ở
Thái Bình - Quảng Ninh
To bucthucuoi:
Mình cũng download về dùng thử. Xin đóng góp với bạn một vài ý kiến nhỏ như sau:
- Các hệ số A, B, D thực chất là những biểu thức rút gọn (tạm coi là hệ số phụ thuộc vào dung trọng, lực dính và góc ma sát..). Mình nghĩ ngày xưa chưa có máy tính và vi tính (mục đích chỉ là tính các hàm sin(x), cos(x)...) nên người ta mới thành lập các bảng tra có sẵn để mình nội suy. Còn bây giờ tại sao phải dùng cách tra bảng như vậy?
- Tuy giá trị tính Ro không cần độ chính cao lắm, nhưng mình nghĩ nếu sử dụng cách nội suy tra bảng sẽ gặp sai số (tuy không nhiều và có thể chấp nhận được).

To everybody:
Nếu bạn nào cần mình sẽ post hàm tính Ro (thuật toán rất đơn giản chỉ duy nhất 3 dòng lệnh).
 
Lần chỉnh sửa cuối:

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Thực ra, để tính Ro thì rất đơn giản vì các hệ số A,B,D đã có công thức tính rồi. Nhưng đối với Eo thì bắt buộc phải tra bảng. Cách thực hiện này mang tính học thuật là chính thôi các bạn à. Cứ thế mà phát huy !!! --=0 @$@!^% @$@!^%
Hàm tính Ro như Sơn nói ở đây:
Bấm vào đây --=0
 
Lần chỉnh sửa cuối:

nvson

Geotechnics
Thành viên danh dự
Tham gia ngày
20 Tháng chín 2006
Bài viết
794
Được thích
1,278
Điểm
860
Nơi ở
Thái Bình - Quảng Ninh
Nhân tiện em xin đóng góp cách lấy chính xác hệ số pi
Trong Excel là hàm pi()
Trong VBA:
Dim pi As Double
pi = 4 * Atn(1)
 
Lần chỉnh sửa cuối:

Hamvui

Thành viên hoạt động
Tham gia ngày
26 Tháng chín 2006
Bài viết
165
Được thích
214
Điểm
0
Tuổi
42
Nơi ở
Nơi nào vui vẻ!!!
Hay quá bác nhỉ, nhưng trong cái VBA mà bác nói sao lại không có hàm nào tính giá trị Pi trực tiếp như hàm trong excel nhỉ?
 

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Tôi xin bổ sung thêm về cách tính Eo:

- Với đất có độ sệt (Is) < 0.75 thì mk tra bảng ở trên.
- Với đất có độ sệt (Is) từ 0.75 đến 1.00 thì lấy mk=1.5
- Với đất có độ sệt (Is) > 1.00 thì lấy mk=1.0

Để hàm tính Eo được đầy đủ, đối số của hàm cần có là chỉ số dẻo Ip(để xác định tên đất), độ sệt Is(để xác định trạng thái), hệ số rỗng tự nhiên (để tính và tra bảng mk), hệ số nén lún a1-2 (để tính toán). Tức là hàm kiểu như sau:
Function Eo(Ip,Is,eo,a1-2)
.....
.....
end function
 

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Thôi, tự giải vậy :-= . Cái này có thể tính trực tiếp trong bảng tổng hợp (nhưng lạm dụng thì dễ quên công thức lắm đấy!):





Mã:
Function Eo(Chisodeo As Single, Doset As Single, Hsrong As Single, Hsnenlun As Single)
    Dim Hsr(8) As Single, CF(8) As Single, SF(8) As Single, S(8) As Single
    Dim mk As Single, Beta As Single
    'Khai bao he so rong trong bang tra
    Hsr(1) = 0.4: Hsr(2) = 0.55: Hsr(3) = 0.65: Hsr(4) = 0.75
    Hsr(5) = 0.85: Hsr(6) = 0.95: Hsr(7) = 1.05: Hsr(8) = 3
    'Khai bao he so mk trong cat pha
    CF(1) = 4: CF(2) = 4: CF(3) = 3.5: CF(4) = 2: CF(5) = 2: CF(6) = 2: CF(7) = 2: CF(8) = 2
    'Khai bao he so mk trong set pha
    SF(1) = 5: SF(2) = 5: SF(3) = 4.5: SF(4) = 4: SF(5) = 3: SF(6) = 2.5: SF(7) = 2: SF(8) = 2
    'Khai bao he so mk trong set pha
    S(1) = 6: S(2) = 6: S(3) = 6: S(4) = 6: S(5) = 5.5: S(6) = 5.5: S(7) = 4.5: S(8) = 4.5
    ' Tinh gia tri mk
    For i = 1 To 8
            If Chisodeo >= 17 Then
               Beta = 0.4
               If (Doset <= 0.75 And Hsr(i) >= Hsrong) Then
                  mk = S(i) + (Hsrong - Hsr(i)) * (S(i) - S(i - 1)) / (Hsr(i) - Hsr(i - 1))
                  Exit For
               ElseIf Doset < 1 Then
                  mk = 1.5
               ElseIf Doset >= 1 Then
                  mk = 1
               End If
            ElseIf Chisodeo >= 7 Then
               Beta = 0.62
               If (Doset <= 0.75 And Hsr(i) >= Hsrong) Then
                  mk = SF(i) + (Hsrong - Hsr(i)) * (SF(i) - SF(i - 1)) / (Hsr(i) - Hsr(i - 1))
                  Exit For
               ElseIf Doset < 1 Then
                  mk = 1.5
               ElseIf Doset >= 1 Then
                  mk = 1
               End If
            ElseIf Chisodeo < 7 Then
               Beta = 0.74
               If (Doset <= 0.75 And Hsr(i) >= Hsrong) Then
                  mk = CF(i) + (Hsrong - Hsr(i)) * (CF(i) - CF(i - 1)) / (Hsr(i) - Hsr(i - 1))
                  Exit For
               ElseIf Doset < 1 Then
                  mk = 1.5
               ElseIf Doset >= 1 Then
                  mk = 1
               End If
            End If
    Next
    ' Tinh modun tong bien dang
        Eo = Round(mk * (1 + Hsrong) * Beta / Hsnenlun, 0)
End Function

Ai có kinh nghiệm sửa code cho gọn hơn nhé /-*+/ .
 

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia ngày
13 Tháng sáu 2006
Bài viết
6,950
Được thích
23,811
Điểm
1,860
Nơi ở
Hà Nội
Lâu mới đọc topic này, không biết có bạn nào ngành Địa chất công trình, địa kỹ thuật bổ sung thêm gì không?
 

aheartexpcons

Thành viên mới
Tham gia ngày
4 Tháng sáu 2009
Bài viết
1
Được thích
0
Điểm
0
Tuổi
37
Xin chào a Phan Tu Huong, a có thể cho em xin tiêu chuẩn TCXD74-1987 được ko, e chỉ có vài trang của nó mà lại còn nhìn ko rõ nữa. Cám ơn anh...! Vì em đang phải thiết kế tường barret nên muốn tìm hiểu rõ về địa kỹ thuật.
 

SA_DQ

/(hông là gì!
Thành viên danh dự
Tham gia ngày
8 Tháng sáu 2006
Bài viết
11,884
Được thích
17,860
Điểm
1,860
Đúng cảm giác của thầy là đúng đó

Thôi, tự giải vậy :-= . Cái này có thể tính trực tiếp trong bảng tổng hợp (nhưng lạm dụng thì dễ quên công thức lắm đấy!):

Mã:
[B]Function Eo(Chisodeo As Single, Doset As Single, Hsrong As Single, Hsnenlun As Single)[/B]
   
   [COLOR=Blue] ' Tinh modun tong bien dang[/COLOR]
 ' Các dòng lệnh (Xem bên trên) . . . '
        Eo = Round(mk * (1 + Hsrong) * Beta / Hsnenlun, 0)
[B]End Function[/B]
Ai có kinh nghiệm sửa code cho gọn hơn nhé /-*+/ .
Nhờ các bạn trong ngành kiểm lại dùm nha:

PHP:
Option Explicit
Function Eo(Chisodeo As Single, Doset As Single, Hsrong As Single, Hsnenlun As Single)
    Dim Hsr(8) As Single, CF(8) As Single, SF(8) As Single, S(8) As Single
    Dim mk As Single, Beta As Single, jJ As Byte
    ' Tinh gia tri mk'
    For jJ = 1 To 8
      'Khai Bao Cac Bien Nho Ham SWITCH() Nen Rut Gon Kha Tot :'
         Hsr(jJ) = Switch(jJ = 1, 0.4, jJ = 2, 0.55, jJ = 3, 0.65, jJ = 4, 0.75, _
            jJ = 5, 0.85, jJ = 6, 0.95, jJ = 7, 1.05, jJ = 8, 3)
         CF(jJ) = Switch(jJ < 3, 4, jJ = 3, 3.5, jJ > 3, 2)
         SF(jJ) = Switch(jJ < 3, 5, jJ = 3, 4.5, jJ = 4, 4, jJ = 5, 3,  _
               jJ = 6, 2.5, jJ > 6, 2)
         S(jJ) = Switch(jJ < 5, 6, jJ < 7, 5.5, jJ > 6, 4.5)
      '           *           *           *                    *           *           *'
            If Chisodeo >= 17 Then
               Beta = 0.4
               If (Doset <= 0.75 And Hsr(jJ) >= Hsrong) Then
                  mk = S(jJ) + (Hsrong - Hsr(jJ)) * (S(jJ) - S(jJ - 1)) /  _
                         (Hsr(jJ) - Hsr(jJ - 1))
                  Exit For
               Else
                  mk = IIf(Doset < 1, 1.5, 1) '<=|'
               End If
            ElseIf Chisodeo >= 7 Then
               Beta = 0.62
               If (Doset <= 0.75 And Hsr(jJ) >= Hsrong) Then
                  mk = SF(jJ) + (Hsrong - Hsr(jJ)) * (SF(jJ) - SF(jJ - 1)) /  _
                          (Hsr(jJ) - Hsr(jJ - 1))
                  Exit For
               Else
                  mk = IIf(Doset < 1, 1.5, 1) '<=|'
               End If
            ElseIf Chisodeo < 7 Then
               Beta = 0.74
               If (Doset <= 0.75 And Hsr(jJ) >= Hsrong) Then
                  mk = CF(jJ) + (Hsrong - Hsr(jJ)) * (CF(jJ) - CF(jJ - 1)) / _
                            (Hsr(jJ) - Hsr(jJ - 1))
                  Exit For
               Else
                  mk = IIf(Doset < 1, 1.5, 1) '<=|'
            End If
    Next
    ' Tinh modun tong bien dang '
        Eo = Round(mk * (1 + Hsrong) * Beta / Hsnenlun, 0)
End Function
 

tigertiger

Coming back ...
Tham gia ngày
25 Tháng một 2007
Bài viết
1,706
Được thích
1,602
Điểm
860
Hsr(jJ) = Switch(jJ = 1, 0.4, jJ = 2, 0.55, jJ = 3, 0.65, jJ = 4, 0.75, _
jJ
= 5, 0.85, jJ = 6, 0.95, jJ = 7, 1.05, jJ = 8, 3)
Cái này thì nên để vào mảng luôn,

{0.4,0.55,.......}
Sao lại dùng switch làm gì cho rắc rồi nhỉ, HYen???

Và toàn bộ cái sau cũng thế, như thế đỡ phải tính lại mỗi vòng FOR rắc rồi, gán mảng HẰNG luôn

Hsr(jJ) = Switch(jJ = 1, 0.4, jJ = 2, 0.55, jJ = 3, 0.65, jJ = 4, 0.75, _
jJ
= 5, 0.85, jJ = 6, 0.95, jJ = 7, 1.05, jJ = 8, 3)
CF(jJ) = Switch(jJ < 3, 4, jJ = 3, 3.5, jJ > 3, 2)
SF(jJ) = Switch(jJ < 3, 5, jJ = 3, 4.5, jJ = 4, 4, jJ = 5, 3, _
jJ
= 6, 2.5, jJ > 6, 2)
S(jJ) = Switch(jJ < 5, 6, jJ < 7, 5.5, jJ > 6, 4.5)
 
Lần chỉnh sửa cuối:

engineering_geology47

Thành viên mới
Tham gia ngày
24 Tháng chín 2006
Bài viết
3
Được thích
0
Điểm
0
Tuổi
36
Em chào thầy ạ! Thầy cho em hỏi với ạ. Sao mọi người cứ viết là Eo = Round(mk * (1 + Hsrong) * Beta / Hsnenlun, 0). Mà ở đây Hsrong mình khai báo từ đầu có phải là eo không ạ (vì tra mk là phải tra theo eo). Còn trong công thức Eo = Round(mk * (1 + Hsrong) * Beta / Hsnenlun, 0) thì Hsrong là e1 (hệ số rỗng của đất ứng với cấp áp lực nén 1kG/cm2) chứ ạ! Mong thầy giúp em hiểu rõ chỗ này với ạ!
 

790312

Thành viên hoạt động
Tham gia ngày
7 Tháng tư 2008
Bài viết
181
Được thích
8
Điểm
670
Tuổi
40
Mời các bạn ngành ĐCCT-ĐKT biết hàm (Function) tính giá trị Eo:


Trong đó:
e0: Hệ số rỗng ban đầu của đất¸
a1-2: Hệ số nén lún của đất tương ứng cấp áp lực P1 =1 KG/cm2 đến P2 = 2(KG/cm2).
bêta : Phụ thuộc vào hệ số biến dạng ngang của từng loại đất:
bêta = 0.80 đối với đất cát;
bêta = 0.74 đối với đất cát pha;
bêta = 0.62 đối với đất sét pha;
bêta = 0.40 đối với đất sét.
mk: Hệ số chuyển đổi môđun tổng biến dạng trong phòng sang môđun tổng biến dạng bằng phương pháp tải trọng tĩnh ngoài hiện trường, tra bảng phụ thuộc vào độ sệt và hệ số rỗng. Trường hợp độ sệt (Is) < 0.75 thì tra bảng:



Trường hợp độ sệt > 0.75 lấy mk = 1 - 1.5.
Anh cho e hỏi Eo có phải là Eoed không?Với lại hình của anh đưa lên đã bị xóa hay sao vậy?Thanks
 
Lần chỉnh sửa cuối:
Top Bottom