Bài toán về cao độ

Liên hệ QC

selves037

Thành viên thường trực
Tham gia
22/9/17
Bài viết
228
Được thích
66
Giới tính
Nam
Do một số kiến thức về không gian hình học mình đã không nhớ nên hôm nay mình nhờ ae và các bác trong diễn đàn giúp đỡ một bài toán về tính cao độ, nó liên quan đến hình học không gian. Mình có một mặt phẳng (p) không gian đi qua 4 điểm A(a1, a2, a3); B(b1; b2;b3); C (c1;c2;c3) và điểm D( d1, d2, z) với z là biến cần tìm; nhờ ae viết 1 Function(a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2) trả về giá trị z cần tìm (hiểu nôm na có 4 điểm ABCD trên 1 mặt phẳng, xác định điểm thứ tư khi đã biết hoành độ và tung độ của điểm đó). Cảm ơn ae nhiều
 
Do một số kiến thức về không gian hình học mình đã không nhớ nên hôm nay mình nhờ ae và các bác trong diễn đàn giúp đỡ một bài toán về tính cao độ, nó liên quan đến hình học không gian. Mình có một mặt phẳng (p) không gian đi qua 4 điểm A(a1, a2, a3); B(b1; b2;b3); C (c1;c2;c3) và điểm D( d1, d2, z) với z là biến cần tìm; nhờ ae viết 1 Function(a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2) trả về giá trị z cần tìm (hiểu nôm na có 4 điểm ABCD trên 1 mặt phẳng, xác định điểm thứ tư khi đã biết hoành độ và tung độ của điểm đó). Cảm ơn ae nhiều
bạn ví dụ bằng file mình xem nào
 
Làm việc với toán, phải không?
Đối với toán, các ký tự viết tắt chỉ dùng trong ý nghĩa toán. Cụ thể là để định danh các thông số.

Viết tắt bất cứ từ nào khác là phản toán học.

Lý thuyết toán:
Dùng công thức tính trị vec tơ và nhân vec tơ để tính ra phương trình mặt phẳng qua 3 điểm a, b, c.
Thế 2 toạ độ của d vào phương trình thì ra toạ độ thứ 3.
Lưu ý là nếu phương trình ra lằng nhằng thì là do:
- 1--> 3 điểm kia có điểm trùng nhau
- 2 --> 3 điểm kia cùng nằm trên một đường thẳng, và vì vậy không xác định được 1 mặt phẳng.
 
Do một số kiến thức về không gian hình học mình đã không nhớ nên hôm nay mình nhờ ae và các bác trong diễn đàn giúp đỡ một bài toán về tính cao độ, nó liên quan đến hình học không gian. Mình có một mặt phẳng (p) không gian đi qua 4 điểm A(a1, a2, a3); B(b1; b2;b3); C (c1;c2;c3) và điểm D( d1, d2, z) với z là biến cần tìm; nhờ ae viết 1 Function(a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2) trả về giá trị z cần tìm (hiểu nôm na có 4 điểm ABCD trên 1 mặt phẳng, xác định điểm thứ tư khi đã biết hoành độ và tung độ của điểm đó). Cảm ơn ae nhiều
bác thử tìm công thức tính tọa độ giao điểm của đường thẳng với mặt phẳng á
công thức hình học lớp 10 thì phải @@
1642230318993.png
 
bác thử tìm công thức tính tọa độ giao điểm của đường thẳng với mặt phẳng á
công thức hình học lớp 10 thì phải @@
...
Kiểu này hơi đặc thù. Chỉ xài được 1 chỗ.

Viết một hàm tổng quát tính thông số mặt phẳng thì còn xài được nhiều chỗ.

thongSo = PTMatPhang(Diem1, Diem1, Diem3)
' thongSo là một type gồm a, b, c, d
' DiemN là một type gồm x, y, z
' dùng array cũng được

Diem4.z = - (thongSo.a *Diem4.x + thongSo.b*Diem4.y + thongSo.d) / thongSo.c
 
Kiểu này hơi đặc thù. Chỉ xài được 1 chỗ.

Viết một hàm tổng quát tính thông số mặt phẳng thì còn xài được nhiều chỗ.

thongSo = PTMatPhang(Diem1, Diem1, Diem3)
' thongSo là một type gồm a, b, c, d
' DiemN là một type gồm x, y, z
' dùng array cũng được

Diem4.z = - (thongSo.a *Diem4.x + thongSo.b*Diem4.y + thongSo.d) / thongSo.c
Cụ thể array thế nào vậy b ơi, mình chưa hiểu rõ như thế nào
 
Kiểu này hơi đặc thù. Chỉ xài được 1 chỗ.

Viết một hàm tổng quát tính thông số mặt phẳng thì còn xài được nhiều chỗ.

thongSo = PTMatPhang(Diem1, Diem1, Diem3)
' thongSo là một type gồm a, b, c, d
' DiemN là một type gồm x, y, z
' dùng array cũng được

Diem4.z = - (thongSo.a *Diem4.x + thongSo.b*Diem4.y + thongSo.d) / thongSo.c
Ý của mình muốn chính là viết 1 hàm VBA với parma là a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2, hàm trả về cao độ z của điểm D đó bạn
 
Do một số kiến thức về không gian hình học mình đã không nhớ nên hôm nay mình nhờ ae và các bác trong diễn đàn giúp đỡ một bài toán về tính cao độ, nó liên quan đến hình học không gian. Mình có một mặt phẳng (p) không gian đi qua 4 điểm A(a1, a2, a3); B(b1; b2;b3); C (c1;c2;c3) và điểm D( d1, d2, z) với z là biến cần tìm; nhờ ae viết 1 Function(a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2) trả về giá trị z cần tìm (hiểu nôm na có 4 điểm ABCD trên 1 mặt phẳng, xác định điểm thứ tư khi đã biết hoành độ và tung độ của điểm đó). Cảm ơn ae nhiều
Chỉnh lại code theo gợi ý bài #10 của bạn @VetMini
Mã:
Option Explicit
Function oXYZ(ByVal P1, ByVal P2, ByVal P3, ByVal Q)
'Hàm oXYZ tìm giá tri còn thieu cua diem Q tren mat phang
'Mat phang xac dinh qua toa do 3 diem: P1, P2, P3
  Dim P(0 To 6, 1 To 3), i&, j&, j1&, j2&, jC&, t#, tt#, ch#, n&
  Const e# = 1 / 10 ^ 12
  Call add_P(P, Q, 0):    Call add_P(P, P1, 1)
  Call add_P(P, P2, 2):   Call add_P(P, P3, 3)
  For i = 1 To 2
    For j = 1 To 3
      P(3 + i, j) = P(i + 1, j) - P(i, j)
    Next j
  Next i
  For j = 1 To 3
    If j = 3 Then j1 = 1 Else j1 = j + 1
    If j = 1 Then j2 = 3 Else j2 = j - 1
    P(6, j) = P(4, j1) * P(5, j2) - P(4, j2) * P(5, j1)
    t = t - P(6, j)
    tt = tt + Abs(P(6, j))
  Next j
  If tt = 0 Then oXYZ = "Khong xac dinh duoc Mat phang": Exit Function
  For j = 1 To 3
    If Len(P(0, j)) > 0 Then
      t = t + P(0, j) * P(6, j)
      n = n + 1
    Else
      ch = -P(6, j)
    End If
  Next j
  If n <> 2 Then
    oXYZ = "Diem can tim Phai nhap 2 toa do"
  ElseIf Abs(ch) > e Then oXYZ = t / ch
  ElseIf Abs(t) > e Then oXYZ = "Vo Nghiem"
  Else: oXYZ = "Vo So Nghiem"
  End If
End Function

Private Sub add_P(ByRef P, ByVal P0, ByVal i&)
  Dim t, n&
  For Each t In P0
    n = n + 1
    P(i, n) = t
  Next
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Các cách khác xem trong file
Nếu trong tập tin sửa thành C5 = 3 thì kết quả có "3 Diem Thang Hang". Rõ ràng kết quả sai - 3 điểm không thẳng hàng. Dễ kiểm tra là 3 điểm nằm trên mặt phẳng có phương trình là -2x + 4y - 2z = 0

Trên mặt phẳng đó điểm có x = 1 và z = 0 thì y = 0,5.
------------
Thử kiểm tra với code ở sau. Công thức như hình dưới hoặc
Mã:
=toado_thieu({1\1\1;4\3\2;5\3\1;1\""\0})
Tham số gồm 4 dòng 3 cột. 3 dòng đầu là tọa độ đủ của 3 điểm, các cột liên tiếp là x, y và z. Dòng 4 là tọa độ thiếu của điểm 4.

matphang.jpg

Mã:
Function toado_thieu(ByVal coord)
Dim r As Long, c As Long, chieu As Long, heso(1 To 3) As Double, D As Double, Arr
    Arr = coord
    If UBound(Arr, 1) <> 4 Or UBound(Arr, 2) <> 3 Then
        toado_thieu = "Du lieu loi"
        Exit Function
    End If
    For c = 1 To 3
        If Arr(4, c) = "" Then
            chieu = c
            Exit For
        End If
    Next c
    If c > 3 Then
        toado_thieu = "Khong thieu toa do, khong xet tiep"
        Exit Function
    End If
    For r = 2 To 3
        For c = 1 To 3
            Arr(r, c) = Arr(r, c) - Arr(1, c)
        Next c
    Next r
    heso(1) = Arr(2, 2) * Arr(3, 3) - Arr(3, 2) * Arr(2, 3)
    heso(2) = Arr(3, 1) * Arr(2, 3) - Arr(2, 1) * Arr(3, 3)
    heso(3) = Arr(2, 1) * Arr(3, 2) - Arr(3, 1) * Arr(2, 2)
    If heso(1) = 0 And heso(2) = 0 And heso(3) = 0 Then
        toado_thieu = "Mat phang khong xac dinh"
        Exit Function
    End If
    D = -(Arr(1, 1) * heso(1) + Arr(1, 2) * heso(2) + Arr(1, 3) * heso(3))
    For r = 1 To 3
        If r <> chieu Then D = D + Arr(4, r) * heso(r)
    Next r
    If heso(chieu) = 0 Then
        If D = 0 Then
            toado_thieu = "Gia tri khong xac dinh - vo so"
        Else
            toado_thieu = "Khong ton tai diem thoa man nam tren mat phang cho boi 3 diem"
        End If
    Else
        toado_thieu = -D / heso(chieu)
    End If
End Function
 
Lần chỉnh sửa cuối:
Lưu ý các bạn viết code:
Bài toán ở đây tính toán trên số thực.
Biểu thức so sánh x = 0 phải cẩn thận với sai số. Biểu thức x/y có thể bị tràn số nếu y rất nhỏ so với x.

Bình thường nếu tôi làm toán số thực thì tôi có một hằng số xác định trị rất nhỏ (ví dụ 1E-10). Trị tuyệt đối dưới số này thì coi như 0.
 
Lưu ý các bạn viết code:
Bài toán ở đây tính toán trên số thực.
Biểu thức so sánh x = 0 phải cẩn thận với sai số. Biểu thức x/y có thể bị tràn số nếu y rất nhỏ so với x.

Bình thường nếu tôi làm toán số thực thì tôi có một hằng số xác định trị rất nhỏ (ví dụ 1E-10). Trị tuyệt đối dưới số này thì coi như 0.
Có cách nào để hiện trả về số thực không bạn, mình có chỉnh sửa hàm mà nó bị lỗi trả về 0 Function NoiSuyCaoDo(a1 As Double, a2 As Double, a3 As Double, a4 As Double, a5 As Double, a6 As Double, a7 As Double, a8 As Double, a9 As Double, x4 As Double, y4 As Double) As Double Dim r As Long, c As Long, chieu As Long, heso(1 To 3) As Double, D As Double, Arr(1 To 4, 1 To 3) ' Arr = coord Arr(1, 1) = a1 Arr(1, 2) = a2 Arr(1, 3) = a3 Arr(2, 1) = a4 Arr(2, 2) = a5 Arr(2, 3) = a6 Arr(3, 1) = a7 Arr(3, 2) = a8 Arr(3, 3) = a9 Arr(4, 1) = x4 Arr(4, 2) = y4 Arr(4, 3) = "" If UBound(Arr, 1) <> 4 Or UBound(Arr, 2) <> 3 Then toado_thieu = "Du lieu loi" Exit Function End If For c = 1 To 3 If Arr(4, c) = "" Then chieu = c Exit For End If Next c If c > 3 Then toado_thieu = "Khong thieu toa do, khong xet tiep" Exit Function End If For r = 2 To 3 For c = 1 To 3 Arr(r, c) = Arr(r, c) - Arr(1, c) Next c Next r heso(1) = Arr(2, 2) * Arr(3, 3) - Arr(3, 2) * Arr(2, 3) heso(2) = Arr(3, 1) * Arr(2, 3) - Arr(2, 1) * Arr(3, 3) heso(3) = Arr(2, 1) * Arr(3, 2) - Arr(3, 1) * Arr(2, 2) If heso(1) = 0 And heso(2) = 0 And heso(3) = 0 Then toado_thieu = "Mat phang khong xac dinh" Exit Function End If D = -(Arr(1, 1) * heso(1) + Arr(1, 2) * heso(2) + Arr(1, 3) * heso(3)) For r = 1 To 3 If r <> chieu Then D = D + Arr(4, r) * heso(r) Next r If heso(chieu) = 0 Then If D = 0 Then toado_thieu = "Gia tri khong xac dinh - vo so" Else toado_thieu = "Khong ton tai diem thoa man nam tren mat phang cho boi 3 diem" End If Else toado_thieu = -D / heso(chieu) End If End Function
1642310536245.png1642310557873.png
 
Nếu trong tập tin sửa thành C5 = 3 thì kết quả có "3 Diem Thang Hang". Rõ ràng kết quả sai - 3 điểm không thẳng hàng. Dễ kiểm tra là 3 điểm nằm trên mặt phẳng có phương trình là -2x + 4y - 2z = 0

Trên mặt phẳng đó điểm có x = 1 và z = 0 thì y = 0,5.
------------
Thử kiểm tra với code ở sau. Công thức như hình dưới hoặc
Mã:
=toado_thieu({1\1\1;4\3\2;5\3\1;1\""\0})
Tham số gồm 4 dòng 3 cột. 3 dòng đầu là tọa độ đủ của 3 điểm, các cột liên tiếp là x, y và z. Dòng 4 là tọa độ thiếu của điểm 4.

View attachment 271498

Mã:
Function toado_thieu(ByVal coord)
Dim r As Long, c As Long, chieu As Long, heso(1 To 3) As Double, D As Double, Arr
    Arr = coord
    If UBound(Arr, 1) <> 4 Or UBound(Arr, 2) <> 3 Then
        toado_thieu = "Du lieu loi"
        Exit Function
    End If
    For c = 1 To 3
        If Arr(4, c) = "" Then
            chieu = c
            Exit For
        End If
    Next c
    If c > 3 Then
        toado_thieu = "Khong thieu toa do, khong xet tiep"
        Exit Function
    End If
    For r = 2 To 3
        For c = 1 To 3
            Arr(r, c) = Arr(r, c) - Arr(1, c)
        Next c
    Next r
    heso(1) = Arr(2, 2) * Arr(3, 3) - Arr(3, 2) * Arr(2, 3)
    heso(2) = Arr(3, 1) * Arr(2, 3) - Arr(2, 1) * Arr(3, 3)
    heso(3) = Arr(2, 1) * Arr(3, 2) - Arr(3, 1) * Arr(2, 2)
    If heso(1) = 0 And heso(2) = 0 And heso(3) = 0 Then
        toado_thieu = "Mat phang khong xac dinh"
        Exit Function
    End If
    D = -(Arr(1, 1) * heso(1) + Arr(1, 2) * heso(2) + Arr(1, 3) * heso(3))
    For r = 1 To 3
        If r <> chieu Then D = D + Arr(4, r) * heso(r)
    Next r
    If heso(chieu) = 0 Then
        If D = 0 Then
            toado_thieu = "Gia tri khong xac dinh - vo so"
        Else
            toado_thieu = "Khong ton tai diem thoa man nam tren mat phang cho boi 3 diem"
        End If
    Else
        toado_thieu = -D / heso(chieu)
    End If
End Function
Mình có thực hiện với các thông số là số thực như trong ảnh #11 nhưng hàm trả về =0
 
Chỉnh lại code theo gợi ý bài #10 của bạn @VetMini
...
Private Function SoSanh(x1 As Double, x2 As Double) As Long
' hàm so sánh 2 số thực x1 và x2 và trả về:
' 0: x1 coi như bằng x2 với một sai số xác định
' -1: x1 nhỏ hơn x2
' 1: x1 lớn hơn x2
Const SAISO = 1E-10
If ABS(x1-x2) <= SAISO Then Exit Function
SoSanh = IIF(x1>x2, 1, -1)
End Function

Private Function CoiNhuZero(x As Double) As Boolean
CoiNhuZero = SoSanh(x, 0) = 0
End Function

If tt = 0
thay bằng:
If CoiNhuZero(tt)
 
Web KT

Bài viết mới nhất

Back
Top Bottom