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

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,121
Được thích
24,279
Mời các bạn ngành ĐCCT-ĐKT biết hàm (Function) tính giá trị Eo:
Eo.jpg


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:

mk.jpg


Trường hợp độ sệt > 0.75 lấy mk = 1 - 1.5.
 
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! :-=
 
Đâ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:
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?
 
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:
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!!
 
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

  • EoRo.rar
    28.6 KB · Đọc: 2,092
Chỉnh sửa lần cuối bởi điều hành viên:
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:
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:
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:
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:
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ỉ?
 
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
 
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!):


Eo_1.jpg



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é /-*+/ .
 
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?
 
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.
 
Đú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
 
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:
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 ạ!
 
Mời các bạn ngành ĐCCT-ĐKT biết hàm (Function) tính giá trị Eo:
Eo.jpg


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:

mk.jpg


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:
Web KT
Back
Top Bottom