Nội suy theo hai chiều???

  • Thread starter Thread starter dhxd49
  • Ngày gửi Ngày gửi
Liên hệ QC

dhxd49

Thành viên mới
Tham gia
19/10/07
Bài viết
8
Được thích
6
Mình có một bảng cơ sỡ dữ liệu theo 2 toạ độ . Trong đó mình muốn tìm ra giá trị tại toạ độ mà ko có trong bảng thì phải nội suy. Các bạn có thể giúp mình viết hàm tính toán được khôg? Mình xin cảm ơn.
Dưới đây là file đính kèm của mình!!
 

File đính kèm

Bạn đến đây:http://www.giaiphapexcel.com/forum/showthrea d.php?t=5828

Hàm của mình tính kết quả ra là .656; Bạn thử kiểm chứng lại nha.
PHP:
Option Explicit
Function NoiSuyGPE(VungTra As Range, xX As Double, yY As Double) As Double
  'Ham Noi Suy 2 Chieu Tai GPE.COM (Sa_DQ)'
   Dim iW As Integer, jI As Integer
    Dim x1 As Double, x2 As Double, y1 As Double, y2 As Double
    Dim a11 As Double, a12 As Double, a21 As Double, a22 As Double
    Dim t1 As Double, t2 As Double
    
    Dim RgNg As Range, RgDoc As Range
    Dim Rng As Range, Clls As Range
    Set RgNg = VungTra.Cells(1, 1).Resize(1, VungTra.Columns.Count - 1)
    Set RgDoc = VungTra.Cells(1, 1).Resize(VungTra.Rows.Count, 1)
    
1    For Each Rng In RgNg
2      If Rng <= yY And Rng.Offset(, 1) >= yY Then
3        y1 = Rng:           y2 = Rng.Offset(, 1)
      For Each Clls In RgDoc
5        If Clls <= xX And Clls.Offset(1) >= xX Then
         x1 = Clls:         x2 = Clls.Offset(1)
        '3*'
7       a11 = Cells(Clls.Row, Rng.Column):  a12 = Cells(Clls.Row, Rng.Column + 1)
       a21 = Cells(Clls.Row + 1, Rng.Column): a22 = Cells(Clls.Row + 1, Rng.Column + 1)
9         t1 = (a12 - a11) * (yY - y1) / (y2 - y1) + a11
         t2 = (a22 - a21) * (yY - y1) / (y2 - y1) + a21
11         NoiSuyGPE = (t2 - t1) * (xX - x1) / (x2 - x1) + t1
         Exit For
13        End If
        Next Clls
15      End If
    Next Rng
17    If NoiSuyGPE = 0 Then  '!'
        MsgBox "gia tri can tim ko nam trong bang tra", vbInformation
19    End If
End Function
 
đây bạn

[FONT=.VnTime]Public Function NOISUY2CHIEU(Zij, Xi, yj, x, y, sohang, socot) As Variant[/FONT]
[FONT=.VnTime]'Dim Cv(1 To 200) As Double[/FONT]
[FONT=.VnTime]'Dim a(1 To 200) As Double[/FONT]
[FONT=.VnTime]Dim i, j As Integer[/FONT]
[FONT=.VnTime]Dim z1, z2 As Double[/FONT]
[FONT=.VnTime][/FONT]
[FONT=.VnTime]'Tim vi tri Xi, Yj[/FONT]
[FONT=.VnTime]j = 0[/FONT]
[FONT=.VnTime]Do[/FONT]
[FONT=.VnTime] j = j + 1[/FONT]
[FONT=.VnTime]Loop Until ((x - Xi(j)) * (x - Xi(j + 1)) <= 0 Or j = socot)[/FONT]
[FONT=.VnTime][/FONT]
[FONT=.VnTime]i = 0[/FONT]
[FONT=.VnTime]Do[/FONT]
[FONT=.VnTime] i = i + 1[/FONT]
[FONT=.VnTime]Loop Until ((y - yj(i)) * (y - yj(i + 1)) <= 0 Or i = sohang)[/FONT]
[FONT=.VnTime]If (i = sohang Or j = socot) Then[/FONT]
[FONT=.VnTime] NOISUY2CHIEU = "False"[/FONT]
[FONT=.VnTime]Else[/FONT]
[FONT=.VnTime] z1 = Zij(i, j) + (x - Xi(j)) * (Zij(i, j + 1) - Zij(i, j)) / (Xi(j + 1) - Xi(j))[/FONT]
[FONT=.VnTime] z2 = Zij(i + 1, j) + (x - Xi(j)) * (Zij(i + 1, j + 1) - Zij(i + 1, j)) / (Xi(j + 1) - Xi(j))[/FONT]
[FONT=.VnTime] NOISUY2CHIEU = z1 + (y - yj(i)) * (z2 - z1) / (yj(i + 1) - yj(i))[/FONT]
[FONT=.VnTime][/FONT]
[FONT=.VnTime]End If[/FONT]
[FONT=.VnTime]End Function[/FONT]
 
Mình có một bảng cơ sỡ dữ liệu theo 2 toạ độ . Trong đó mình muốn tìm ra giá trị tại toạ độ mà ko có trong bảng thì phải nội suy. Các bạn có thể giúp mình viết hàm tính toán được khôg?

Tôi chẳng biết nội suy là sao cả, dùng Index và Match tra bảng mà không biết bạn cần lấy cận trên hay cận dưới đây.
 

File đính kèm

File đính kèm

Lần chỉnh sửa cuối:
Thêm 1 bài nữa cho phong phú. Kết qua của tôi chạy ra cũng giống Pác SA_DQ là: 0.65646398067. Code:
Function Noisuy2chieu(SoX, SoY, vungXY) As Single
Dim i, j As Integer
Cao = vungXY.Rows.Count 'Xac dinh so hang
Rong = vungXY.Columns.Count 'Xac dinh so cot
Dim a1, a2, B1, B2, Y1, Y2, Tim As Single 'Cac diem chan
For i = 2 To Cao + 1
If vungXY(i, 1) > SoX Then
n = i
For j = 2 To Rong + 1
If vungXY(1, j) > SoY Then
m = j
B1 = vungXY(n - 1, m)
B2 = vungXY(n, m)
a1 = vungXY(n - 1, m - 1)
a2 = vungXY(n, m - 1)
Y1 = (SoY - vungXY(1, m - 1)) * (B1 - a1) / (vungXY(1, m) - vungXY(1, m - 1)) + a1
Y2 = (SoY - vungXY(1, m - 1)) * (B2 - a2) / (vungXY(1, m) - vungXY(1, m - 1)) + a2
Tim = (SoX - vungXY(n - 1, 1)) * (Y2 - Y1) / (vungXY(n, 1) - vungXY(n - 1, 1)) + Y1
Exit For
End If
Next j
Exit For
End If
Next i
Noisuy2chieu = Tim
End Function
 

File đính kèm

Em đã làm theo cách của trungnt (với bài của em) nhưng lại có vấn đề, các anh có thể giúp e đc hok ạh? thnx
 

File đính kèm

Tôi chạy đâu thấy có vấn đề gì đâu, lỗi thông báo đó là tham chiếu vòng vo (tạm dịch vòng quanh) nghĩa là trong công thức đó có 1 giá trị đó phụ thuộc 1 giá khác mà giá trị này lại phụ thuộc chính giá trị mà bạn muốn tìm. Tôi kiểm tra lại thì phát hiện bạn nhập giá trị nhầm ô. Nhập công thức đúng là: = Noisuy2chieu(D20;D21;B4:H17), nhưng bạn lại nhập: Noisuy2chieu(D20;D22;B4:H17) nên mới có thông báo trên......... lần sau phải cận thận lại bạn nhé! Chào thân ái.
 
thnx anh trungnt, thực ra trước đó e cũng đã ghi công thức như của anh đó, e test thử, thì các giá trị đa phần, NGOẠI TRỪ CÁC GIÁ TRỊ KHI z/b = 6.0 (hoặc y/b = 2) thì các phép tính đều cho kết quả = 0. còn các phép tính khác vẫn đúng. Anh có thể giải thích giúp e đc hok ạh? thnx anh

Ah, e làm 1 bảng tra mới trong cùng 1 sheet đó, vẫn dùng hàm này, nhưng kết quả lại không chính xác. Làm thế nào bây h hả anh?
 

File đính kèm

Lần chỉnh sửa cuối:
Thắc mắc của totolo cũng dễ giải quyết thôi, trong đoạn mã code tôi thêm dấu bằng ở dòng lệnh: If vungXY(i, 1) >= SoX Then và If vungXY(1, j) >= SoY Then đồng thời tại các vị trí ô có dấu "-", bạn phải cho nó 1 trị số nào đó chẳng hạn =0 thì công thức trên mới hiểu, còn nếu bạn không muốn thấy số 0 mà muốn hiện thị dấu "-" (có thể hiểu là không xác định) thì vào Format cell lại các ô -----> custom ----> nhập vào ô type là : "-". Còn nếu số liệu nằm ngoài vùng tra mà bạn muốn hiện lên không tìm được giá trị thì kẹp thêm lệnh If vào: VD IF(Noisuy2chieu(SoX, SoY, vungXY)=0, "Số liệu nằm ngoài bảng tra",Noisuy2chieu(SoX, SoY, vungXY))....... Tôi nghĩ giải quyết đến đây đã thỏa mãn tất cả ý của a.
 

File đính kèm

hi hi, trc hết thnx anh trungnt đã giúp em.
Anh này, trong bài anh sửa cho em, em test lại thì gần như đúng hết (trong bảng 1), nhưng ở ô B19 (z/b=6, y/b=0) thì kết quả lại không ra ( #VALUE!);
- Và vì với hàm kết quả anh đặt là: =IF(Noisuy2chieu(F1,F2,B6:H19)=0,"KXD",Noisuy2chieu(F1,F2,B6:H19)) nên các giá trị trong bảng = 0 đều tự động cho kết quả là ( #VALUE!) *_*.
- Thêm 1 thắc mắc nhỏ nữa là: Em muốn làm > 1 Bảng tra trong cùng 1 SHEET or 1 FILE có được không? vì khi em làm 2 bảng tra trong cùng 1 sheet thì lại không ra kết quả. *_*
THNX ANH 1 LẦN NỮA.

----
P/S: thầy Hướng ơi, Help me *_*
 
Tôi thử lại code và viết lại cho rõ ràng đồng thời bỏ đi dấu "=". A dùng lại xem có vấn đề gì mới không nhé ........ hy vọng sẽ được như ý muốn. Việc a àm > 1 Bảng tra trong cùng 1 SHEET or 1 FILE hoàn toàn được vì công thức trên là hàm người dùng tự tạo dùng trên mọi bảng đều hiều cả (giống như công thức có sẵn trong Excel).
 

File đính kèm

Tôi hiện không rảnh lắm, nhờ các cao thủ khác kiểm tra lại.
 
Xin hướng dần chi tiết!

Thêm 1 bài nữa cho phong phú. Kết qua của tôi chạy ra cũng giống Pác SA_DQ là: 0.65646398067. Code:

Function Noisuy2chieu(SoX, SoY, vungXY) As Single
Dim i, j As Integer
Cao = vungXY.Rows.Count 'Xac dinh so hang
Rong = vungXY.Columns.Count 'Xac dinh so cot
Dim a1, a2, B1, B2, Y1, Y2, Tim As Single 'Cac diem chan
For i = 2 To Cao + 1
If vungXY(i, 1) > SoX Then
n = i
For j = 2 To Rong + 1
If vungXY(1, j) > SoY Then
m = j
B1 = vungXY(n - 1, m)
B2 = vungXY(n, m)
a1 = vungXY(n - 1, m - 1)
a2 = vungXY(n, m - 1)
Y1 = (SoY - vungXY(1, m - 1)) * (B1 - a1) / (vungXY(1, m) - vungXY(1, m - 1)) + a1
Y2 = (SoY - vungXY(1, m - 1)) * (B2 - a2) / (vungXY(1, m) - vungXY(1, m - 1)) + a2
Tim = (SoX - vungXY(n - 1, 1)) * (Y2 - Y1) / (vungXY(n, 1) - vungXY(n - 1, 1)) + Y1
Exit For
End If
Next j
Exit For
End If
Next i
Noisuy2chieu = Tim
End Function



Làm ơn có thể hướng dẫn chi tiết được không, mình mới tìm hiểu nên khôg hiêu nhiều, mình làm thì thấy bào #Name?

Cảm ơn rất nhiều.
 
Mình có một bảng cơ sỡ dữ liệu theo 2 toạ độ . Trong đó mình muốn tìm ra giá trị tại toạ độ mà ko có trong bảng thì phải nội suy. Các bạn có thể giúp mình viết hàm tính toán được khôg? Mình xin cảm ơn.
Dưới đây là file đính kèm của mình!!
Bạn xem fiel thủ được chưa nhé
 

File đính kèm

Web KT

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

Back
Top Bottom