Hỏi về hàm nội suy (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

nguyenthinu168

Thành viên chính thức
Tham gia
15/6/06
Bài viết
96
Được thích
9
tôi muốn hỏi cách nội suy hàng và cột, ví dụ
1 25
2 30
3 45
4 50
tôi muốn tìm giá trị của 2.5 của cột thứ nhất tìm giá trị tương ứng của cột thú hai.
 
Lần chỉnh sửa cuối:
Đọc bài của bác tôi thấy toát mồ hôi hột vì hai từ "căn bản" và "nội suy" :.
Bác thử dùng hàm này nhé: giả sử 2 cột của bác là cột A và B
=forecast(2.5, B1:B4, A1:A4) = 37.5


(em chuyển nó sang box Excel và các công thức nhé)
 
excel căn bản

Tôi đã thử dùng hàm forecast trong việc tìm giá trị cột A, nhưng nếu cột B có giá trị không tăng tuyến tính, hoặc cột A là giá trị bất kỳ thì không được?
Vi dụ
A B
2 9
4 5
1 4
5 7
8 8
Hãy tìm một giá trị bất kỳ trong cột A giúp với!
 
Hàm Forecast như bạn OverAC đưa ra chỉ áp dụng khi dãy số tăng hoặc giảm dần theo quy luật tuyến tính, không thì sẽ cho kết quả sai đấy, cần hết sức lưu ý. :*
Kết quả cho ra tương ứng với giá trị của phương trình tương quan.
Các bạn có thể tham khảo ở phần Excel và kỹ thuật.
 
Lần chỉnh sửa cuối:
Các bạn dùng thử hàm nội suy 2 chiều
'======================================================
Function TraBang2Chieu(ByVal GiaTriCot, ByVal GiaTriHang, VungChon As Range)
Dim i As Long, j As Long
Dim TangAnPha
Dim NoiSuy1 As Double, NoiSuy2 As Double

For i = 1 To UBound(VungChon.Value, 2) ' Theo phuong ngang
If GiaTriCot = VungChon(1, i) Then
For j = 1 To UBound(VungChon.Value, 1) - 1
If (GiaTriHang - VungChon(j, 1)) * (GiaTriHang - VungChon(j + 1, 1)) <= 0 Then
TangAnPha = (VungChon(j + 1, i) - VungChon(j, i)) / (VungChon(j + 1, 1) - VungChon(j, 1))
TraBang2Chieu = VungChon(j, i) + (GiaTriHang - VungChon(j, 1)) * TangAnPha
GoTo Thoat:
End If
Next j
ElseIf (GiaTriCot - VungChon(1, i)) * (GiaTriCot - VungChon(1, i + 1)) < 0 Then
For j = 1 To UBound(VungChon.Value, 1) - 1
If (GiaTriHang - VungChon(j, 1)) * (GiaTriHang - VungChon(j + 1, 1)) < 0 Then
TangAnPha = (VungChon(j, i + 1) - VungChon(j, i)) / (VungChon(1, i + 1) - VungChon(1, i))
NoiSuy1 = VungChon(j, i) + (GiaTriCot - VungChon(1, i)) * TangAnPha

TangAnPha = (VungChon(j + 1, i + 1) - VungChon(j + 1, i)) / (VungChon(1, i + 1) - VungChon(1, i))
NoiSuy2 = VungChon(j + 1, i) + (GiaTriCot - VungChon(1, i)) * TangAnPha

TangAnPha = (NoiSuy2 - NoiSuy1) / (VungChon(j + 1, 1) - VungChon(j, 1))
TraBang2Chieu = NoiSuy1 + (GiaTriHang - VungChon(j, 1)) * TangAnPha
GoTo Thoat:
End If
Next j
End If
Next i

Thoat:
'TraBang = UBound(VungChon.Value, 2)
End Function
 
Bác PMXD ở bên ketcau.com đã mò sang đây rùi! Em câu bài cái nha hi hi!
 
Trên ketcau.com, có nhiều người đã viết hàm nội suy này rồi. Rất tiện dụng!
Tuy nhiên, hàm nội suy của bác PMXD là tuyệt vời nhất, nội suy 1 hay 2 chiều đều được, bất kể dãy số tăng hay giảm.
Theo tôi, có thể viết lại code của bác PMXD một cách gọn hơn và nên đưa ra thông báo trong trường hợp mốc nội suy nằm ngoài hàng hay ngoài cột để người dùng tiện xử lý!
Các bác có gì thắc mắc về món VBA, cứ liên hệ bác PMXD ấy. Cao thủ!
 
Để viết hàm Nội suy đúng thì bạn cần quan tâm tới các vấn đề này:
+ Biến thiên của số liệu: Bạn hãy insert chart chọn kiểu "Line", xem hướng của đồ thị trên đồ thị.
+ Xác định kiểu hàm số, tìm tham số a,b,c - Phương pháp "Hồi quy - Tương quan"
Nếu thấy nó có hướng một đường thẳng - Tuyến tính thì dùng ngay hàm Forecast. Bản chất của hàm Forecast là nội suy theo hàm số Y=aX+b (đường thẳng).
Nếu hai mảng số liệu X,Y có phân bố "tương quan" chặt chẽ thì kết quả nội suy của bạn có có thể tin cậy. Vậy thế nào đển đánh giá mối quan hệ tương quan của X và Y là chặt chẽ? Bạn phải dùng thêm hàm CORREL. Hàm CORREL tính ra hệ số tương quan (r), -1<=r<=1, nếu r-trị tuyệt đối gần bằng 1 (0.9x) thì đáng tin cậy còn ngược lại.

Dạng đồ thì thứ 2 có biểu hiện của hàm số Hypebol Y=a/X+b
Khi đó cách dùng của cách trên (Y=aX+b) là không được vì mối quan hệ của X,Y không theo luật đường thẳng. Bạn phải dùng nội suy theo cách "Hồi quy phi tuyến tính" theo hàm số Hypebol.

Dạng thứ 3 là biểu hiện của hình Parabol Y=aX^2+bX+c
Đương nhiên cũng phải dùng phương pháp "Hồi quy phi tuyến tính"

* Với phương pháp "Hồi quy phi tuyến tính", để đánh giá tính quan hệ chặt chẽ người ta dùng chỉ tiêu "Tỷ số tương quan" chứ không phải r-Hệ số tương quan.

Khi nào có dịp I sẽ nói chi tiết thêm về phương pháp nội suy này nhưng ví dụ minh họa sẽ là kinh tế, trong kinh tế thì gọi đây là dự báo chỉ tiêu ngắn hạn.
 
Lần chỉnh sửa cuối:
Các bạn dùng thử hàm nội suy 2 chiều
'======================================================
Function TraBang2Chieu(ByVal GiaTriCot, ByVal GiaTriHang, VungChon As Range)
Dim i As Long, j As Long
Dim TangAnPha
Dim NoiSuy1 As Double, NoiSuy2 As Double

For i = 1 To UBound(VungChon.Value, 2) ' Theo phuong ngang
If GiaTriCot = VungChon(1, i) Then
For j = 1 To UBound(VungChon.Value, 1) - 1
If (GiaTriHang - VungChon(j, 1)) * (GiaTriHang - VungChon(j + 1, 1)) <= 0 Then
TangAnPha = (VungChon(j + 1, i) - VungChon(j, i)) / (VungChon(j + 1, 1) - VungChon(j, 1))
TraBang2Chieu = VungChon(j, i) + (GiaTriHang - VungChon(j, 1)) * TangAnPha
GoTo Thoat:
End If
Next j
ElseIf (GiaTriCot - VungChon(1, i)) * (GiaTriCot - VungChon(1, i + 1)) < 0 Then
For j = 1 To UBound(VungChon.Value, 1) - 1
If (GiaTriHang - VungChon(j, 1)) * (GiaTriHang - VungChon(j + 1, 1)) < 0 Then
TangAnPha = (VungChon(j, i + 1) - VungChon(j, i)) / (VungChon(1, i + 1) - VungChon(1, i))
NoiSuy1 = VungChon(j, i) + (GiaTriCot - VungChon(1, i)) * TangAnPha

TangAnPha = (VungChon(j + 1, i + 1) - VungChon(j + 1, i)) / (VungChon(1, i + 1) - VungChon(1, i))
NoiSuy2 = VungChon(j + 1, i) + (GiaTriCot - VungChon(1, i)) * TangAnPha

TangAnPha = (NoiSuy2 - NoiSuy1) / (VungChon(j + 1, 1) - VungChon(j, 1))
TraBang2Chieu = NoiSuy1 + (GiaTriHang - VungChon(j, 1)) * TangAnPha
GoTo Thoat:
End If
Next j
End If
Next i

Thoat:
'TraBang = UBound(VungChon.Value, 2)
End Function

Không biết sao em không sử dụng được hàm này, các anh chỉ giúp em với.

attachment.php



 

File đính kèm

Lần chỉnh sửa cuối:
Noi suy 2 chieu

Các bạn dùng thử hàm nội suy 2 chiều
'======================================================
Function TraBang2Chieu(ByVal GiaTriCot, ByVal GiaTriHang, VungChon As Range)
Dim i As Long, j As Long
Dim TangAnPha
Dim NoiSuy1 As Double, NoiSuy2 As Double

For i = 1 To UBound(VungChon.Value, 2) ' Theo phuong ngang
If GiaTriCot = VungChon(1, i) Then
For j = 1 To UBound(VungChon.Value, 1) - 1
If (GiaTriHang - VungChon(j, 1)) * (GiaTriHang - VungChon(j + 1, 1)) <= 0 Then
TangAnPha = (VungChon(j + 1, i) - VungChon(j, i)) / (VungChon(j + 1, 1) - VungChon(j, 1))
TraBang2Chieu = VungChon(j, i) + (GiaTriHang - VungChon(j, 1)) * TangAnPha
GoTo Thoat:
End If
Next j
ElseIf (GiaTriCot - VungChon(1, i)) * (GiaTriCot - VungChon(1, i + 1)) < 0 Then
For j = 1 To UBound(VungChon.Value, 1) - 1
If (GiaTriHang - VungChon(j, 1)) * (GiaTriHang - VungChon(j + 1, 1)) < 0 Then
TangAnPha = (VungChon(j, i + 1) - VungChon(j, i)) / (VungChon(1, i + 1) - VungChon(1, i))
NoiSuy1 = VungChon(j, i) + (GiaTriCot - VungChon(1, i)) * TangAnPha

TangAnPha = (VungChon(j + 1, i + 1) - VungChon(j + 1, i)) / (VungChon(1, i + 1) - VungChon(1, i))
NoiSuy2 = VungChon(j + 1, i) + (GiaTriCot - VungChon(1, i)) * TangAnPha

TangAnPha = (NoiSuy2 - NoiSuy1) / (VungChon(j + 1, 1) - VungChon(j, 1))
TraBang2Chieu = NoiSuy1 + (GiaTriHang - VungChon(j, 1)) * TangAnPha
GoTo Thoat:
End If
Next j
End If
Next i

Thoat:
'TraBang = UBound(VungChon.Value, 2)
End Function

Mình chép vào không chạy được?
Có thể giúp mình không?
 
Public Function NOISUY(day1, day2, x, n) As Variant
Dim i As Integer
j = 0
For i = 1 To n - 1
If (day1(i) - x) * (day1(i + 1) - x) <= 0 Then
j = i
End If
Next i
If j <> 0 Then
NOISUY = (x - day1(j)) * (day2(j + 1) - day2(j)) / (day1(j + 1) - day1(j)) + day2(j)
Else: NOISUY = "FALSE"
End If

End Function
 
Nội suy Ko

Bác nào có file tính nội suy Ko chỉ đơn giản bằng hàm Match và index kết hợp, cho em xin?
Em dăng mắc, không làm được.
Có thể gửi vào địa chỉ tuanpmkn@gmail.com
Thank you Bác.
 
Trên ketcau.com, có nhiều người đã viết hàm nội suy này rồi. Rất tiện dụng!
Tuy nhiên, hàm nội suy của bác PMXD là tuyệt vời nhất, nội suy 1 hay 2 chiều đều được, bất kể dãy số tăng hay giảm.
Theo tôi, có thể viết lại code của bác PMXD một cách gọn hơn và nên đưa ra thông báo trong trường hợp mốc nội suy nằm ngoài hàng hay ngoài cột để người dùng tiện xử lý!
Các bác có gì thắc mắc về món VBA, cứ liên hệ bác PMXD ấy. Cao thủ!

Về nội suy thì phải hỏi Anh Cao văn Dũng 52TL2 ĐHXD. Nội suy 1 biến, 2 biến, 3 biến, nội suy đường cong đều có hàm do anh viết.
Mã:
Function NSZ(Xo, Yo, Z) As Single  'Ham Noi suy 2 bien
Dim i, j As Integer
        cao = Z.Rows.Count 'Xac dinh so hang
        Rong = Z.Columns.Count 'Xac dinh so cot
    Dim A1, A2, B1, B2, Y, X, Tim As Single 'Cac diem chan
    For i = 2 To cao
         If Z(i, 1) <= Xo And Xo <= Z(i + 1, 1) Then
                n = i
                    For j = 2 To Rong
                        If Z(1, j) <= Yo And Yo <= Z(1, j + 1) Then
                            m = j
                            Y = Z(1, m + 1) - Z(1, m)
                            X = Z(n + 1, 1) - Z(n, 1)
                            B1 = Z(n, m + 1)
                            B2 = Z(n + 1, m + 1)
                            A1 = Z(n, m)
                            A2 = Z(n + 1, m)
                            Tim = (A1 * (Z(1, m + 1) - Yo) * (Z(n + 1, 1) - Xo) + A2 * (Xo - Z(n, 1)) * (Z(1, m + 1) - Yo) + B1 * (Yo - Z(1, m)) * (Z(n + 1, 1) - Xo) + B2 * (Xo - Z(n, 1)) * (Yo - Z(1, m))) / (X * Y)
                        End If
                    Next j
    Exit For
        End If
    Next i
        NSZ = Tim
End Function
Function NS(SoX, X, Y) As Double
    Dim i As Integer
    Dim n, cao As Integer
    cao = X.Rows.Count
        For i = 1 To cao
            If X(i) <= SoX And SoX <= X(i + 1) Then
                n = i
                NS = Y(n) + (SoX - X(n)) * (Y(n + 1) - Y(n)) / (X(n + 1) - X(n))
        Exit For
            End If
        Next i
End Function
Function NSP(SoX, X, Y) As Double 'Ham noi suy parabol
Dim a, b, c, Ya, Yb, Yc, t As Double
Dim i, n, cao As Integer
cao = X.Rows.Count
    For i = 1 To cao - 2
        a = X(i)
        b = X(i + 2)
            If a <= SoX And SoX <= b Then
            n = i
            c = X(i + 1)
            Ya = Y(n)
            Yb = Y(n + 2)
            Yc = Y(n + 1)
            t = 2 * (SoX - a) / (b - a)
            NSP = Ya + (Yc - Ya) * t + (Yb - 2 * Yc + Ya) * t * (t - 1) / 2
        Exit For
            End If
    Next i
End Function
 

File đính kèm

Các bạn phải có chút kiến thức về VBA để khi copy CODE về thì còn biết mà sử dụng. Ví dụ khi copy thường mắc lỗi cú pháp như 1 câu lệnh mà đặt trên 2 dòng. Khắc phục bằng cách nối 2 dòng bằng dấu '':'', hoặc để trên 1 dòng.
 
Tính nội suy 2 chiều không dùng vòng lặp đây, xin mời!

PHP:
 Option Explicit
Function NS_GPE(LookupRange As Range, X0 As Double, Y0 As Double) As Double
 Dim Rd As Range, Rc As Range, Rng As Range
 Dim Cot As Byte:                            Dim Yy As Double, Xx As Double
 
 Set Rng = LookupRange
 With Rng.Cells(1, 1)
   Set Rd = .Resize(Rng.Rows.Count)
   Set Rc = .Resize(, Rng.Columns.Count)
 End With
 With Application.WorksheetFunction
   Cot = Rc.Find(.Lookup(Y0, Rc), , xlFormulas, xlWhole).Column
   Set Rc = Rng.Cells(1, Cot)
   Yy = Rng.Cells(1, Cot + 1).Value - Rng.Cells(1, Cot).Value
   
   Set Rng = Rd.Find(.Lookup(X0, Rd))
   Xx = Rng.Offset(1).Value - Rng.Value
   Set Rd = Rng:                             Set Rng = Rd.Offset(, Cot - 1)
 End With
 
 NS_GPE = (Rng * (Rc.Offset(, 1) - Y0) * (Rng.Offset(1, 1 - Cot) - X0) _
   + Rng.Offset(1) * (X0 - Rd) * (Rc.Offset(, 1) - Y0) _
   + Rng.Offset(, 1) * (Y0 - Rc) * (Rd.Offset(1) - X0) _
   + Rng.Offset(1, 1) * (X0 - Rd) * (Y0 - Rc)) / (Xx * Yy)
End Function

Mời các bạn xem hình trong file
Mô tả cú fáp dùng hàm tại [H3] ( =NS_GPe(BangTra,12,8))
 

File đính kèm

Lần chỉnh sửa cuối:
Hầuhư chủ yếu ở đây là nội suy tuyến tính, còn phi tuyến thì chưa có. Bác nào am hiểu cùng trao đổi nhé!!!
 
Nội suy

Giúp em tìm giá trị của thông số này với!
 

File đính kèm

Nội suy

Bác nào giúp em nội suy giá trị của thông số này với
 

File đính kèm

Web KT

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

Back
Top Bottom