Hỏi cách viết hàm nội suy mảng 2 chiều!

Liên hệ QC

MicrosoftExcel

Thành viên chính thức
Tham gia
21/8/08
Bài viết
97
Được thích
30
Tôi có một file như sau:
Mã:
http://www.mediafire.com/?qmnijx1smti
http://www.mediafire.com/?qmnijx1smti

my.php

1_936849853m.jpg



Tôi cần tính toán giá trị nội suy theo hai chiều và viết hàm cho nó. Ai có hàm này rồi thì giúp tôi với!!
 
Lần chỉnh sửa cuối:
Bạn tham khảo file này xem thử có đúng với yêu cầu của bạn kô này.
 

File đính kèm

Upvote 0
Cảm ơn bạn đã trả lời, nhưng vấn đề bài toán tôi đưa ra lại là nội suy từ 2 tham số trên 2 mảng giao nhau để ra được một giá trị yêu cầu! Bài toán này là nội suy 4 góc! Ta phải xác định được 4 góc giá trị trên mảng đó, rồi từ đó tính ra giá trị của điểm giá trị trong "hình chữ nhật giá trị" đó. Bạn download file gắn kèm về và thử viết một hàm giúp tôi được không? Xin cảm ơn!
 
Upvote 0
Đã hoàn thành song cái noisuy mang 2 chieu cho ban!
Cảm ơn bạn rất nhiều rất đúng ý muốn và yêu cầu! Tôi cũng đang ngồi viết hàm này chỉ dùng hàm match và index, tôi nghĩ sử dụng hai hàm này sẵn có sẽ nhanh hơn là dùng lệnh if và cũng đỡ "nặng" hơn. Tôi đã có một hàm nội suy mảng một chiều và đã tránh phải dùng hàm if, kết quả cho thấy có vẻ nhẹ hơn :) . Bạn có thể xem hộ mình xem có phải vậy không nhé!

Hàm nội suy thứ nhất:

PHP:
Function KQNS(Value As Double, Array1, Array2, N) As Double
Dim i As Integer
    If Value < Array1(1) And Value > Array1(N) Then
        MsgBox ("Ngoai gia tri noi suy")
    Else
        For i = 1 To N - 1
            If Value > Array1(i) Then
                KQNS = (Value - Array1(i)) * (Array2(i + 1) - Array2(i)) / (Array1(i + 1) - Array1(i)) + Array2(i)
            End If
        Next i
    End If
   'ActiveWorkbook.Save
   'ThisWorkbook.Close
End Function
Hàm nội suy thứ 2

PHP:
Function NS(Value As Variant, Array1 As Range, Array2 As Range, N) As Variant    'Variant Double
Dim i As Integer
Dim Fn As WorksheetFunction
Set Fn = Application.WorksheetFunction
    If Value < Array1(1) And Value > Array1(N) Then
        MsgBox ("Ngoai gia tri noi suy")
    Else
        i = Fn.Match(Value, Array1)
        If i < N Then
           NS = Fn.Index(Array2, i) + (Fn.Index(Array2, i + 1) - Fn.Index(Array2, i)) * (Value - Fn.Index(Array1, i)) / (Fn.Index(Array1, i + 1) - Fn.Index(Array1, i))
        Else
           NS = Fn.Index(Array2, i, 0)
        End If
    End If
   'ActiveWorkbook.Save
   'ThisWorkbook.Close
End Function
 
Lần chỉnh sửa cuối:
Upvote 0
Chịu,không hiểu là dùng như thế nào.Nếu bạn thử mà thấy được thì là tôt.
 
Upvote 0
Của bạn thì dùng tốt rồi, rất cảm ơn bạn, nhưng mà ý tôi muốn nói là hàm match và index đơn giản hơn thôi. Còn hàm của tôi là hàm nội suy mảng một chiều, đánh vào chữ
Giá trị cần tính =NS(giá trị tham chiếu, mảng chứa giá trị tham chiếu, mảng đích chứa giá trị cần tính, số dữ liệu)
 
Lần chỉnh sửa cuối:
Upvote 0
Uh.tưởng là mảng 2 chiều.Thế cũng được.
 
Upvote 0
Nếu chỉ sử dụng hai hàm Match và Index bạn sẽ làm thế nào với mảng hai chiều như trên??
 
Upvote 0
Sao chẳng thấy ai trả lời giúp nhỉ?
Tôi dùng hàm match và index với mảng chứa dữ liệu trên nhưng không hiểu bị một lỗi gì đấy.
Ai có thể xem hộ xem sao với, hình như là hàm match nó không bắt được với mảng có text ở vị trí Mang(1,1).
PHP:
Function NS2C1(ByVal Mang As Range, ByVal XValue As Variant, ByVal YValue As Variant) As Variant
Dim i, j  As Integer
Dim a, b, c, d, x, y, z As Double
'           a          XValue         b
'                        |
'           YValue ------|NS2C1       z
'
'           c                         d
'
Dim Fn As WorksheetFunction
Set Fn = Application.WorksheetFunction
    If XValue < Mang(1, 2).Value Or XValue > Mang(1, Mang.Columns.Count).Value Or YValue < Mang(2, 1).Value Or YValue > Mang(Mang.Rows.Count, 1).Value Then
       MsgBox ("Ngoai gia tri noi suy")
    Else
        i = Fn.Match(XValue, Mang(1, Columns.Count + 1))
        j = Fn.Match(YValue, Mang(Rows.Count + 1, 1))
        a = Mang(i, j).Value
        b = Mang(i + 1, j).Value
        c = Mang(i, j + 1).Value
        d = Mang(i + 1, j + 1).Value
        z = b + ((d - b) * (YValue - a)) / (c - a)
        NS2C1 = YValue + (XValue - a) * (z - YValue) / (b - a)
    End If
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hic,Bạn dùng cái của mình cũng được mà,hình như là ngắn hơn thì fải.
1.Lỗi ở :Mang
(1, Columns.Count + 1):vượt qua ngoài mảng
2.Lỗi ở :Fn.Match(XValue, Mang(1, Columns.Count + 1)):Cú pháp Match bị sai
3.chú ý:không cần thiết phải thêm .value.
 
Upvote 0
Mình đang muốn thử dùng hàm match và index với cái hàm của bạn để xem tốc độ cái nào nhanh hơn, và đỡ tốn bộ nhớ hơn. Bởi vì mình có một file tính với hàng mấy trăm ô cần nội suy như vậy, nên rất cần sự nhanh nhẹ và tốn ít bộ nhớ! Bạn có thể sửa giúp mình cho đúng được kô? Cảm ơn bạn!
 
Upvote 0
Mình đang muốn thử dùng hàm match và index với cái hàm của bạn để xem tốc độ cái nào nhanh hơn, và đỡ tốn bộ nhớ hơn. Bởi vì mình có một file tính với hàng mấy trăm ô cần nội suy như vậy, nên rất cần sự nhanh nhẹ và tốn ít bộ nhớ! Bạn có thể sửa giúp mình cho đúng được kô? Cảm ơn bạn!
Phù,cái này chắc vừa ý bạn rồi (Định kô làm,nhưng thấy bạn cần quá nên ngâm kứu),hehe,cũng hay phết!
 

File đính kèm

Upvote 0
Cảm ơn bạn, mình cũng nghĩ đến giải pháp là phải chỉ định hai mảng riêng cho hàm match! và cũng đang phải lập range riêng. Rất đúng ý! Thanks! Tuy nhiên mình đang muốn tối thiểu hóa chỉ cần nhập mảng và hai giá trị cần tìm như ban đầu của bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn, mình cũng nghĩ đến giải pháp là phải chỉ định hai mảng riêng cho hàm match! và cũng đang phải lập range riêng. Rất đúng ý! Thanks! Tuy nhiên mình đang muốn tối thiểu hóa chỉ cần nhập mảng và hai giá trị cần tìm như ban đầu của bạn.
Chắc bạn sẽ rất hài lòng!?
 

File đính kèm

Upvote 0
Lần này thì đúng là không còn gì phải bàn thêm! Rất đúng ý! Cảm ơn bạn rất nhiều!!
 
Upvote 0
Tuy nhiên hàm nội suy hai chiều của bạn chỉ là nội suy tuyến tính, không phải phi tuyến.
 
Upvote 0
bạn vào vbe và insert module và viết code sau vào nhé
sau đó save lại
Function NS2(x, y As Single, Mang As Range)
Dim Tam1, Tam2 As Single
Tam1 = Mang(2, 2) + (Mang(3, 2) - Mang(2, 2)) / (Mang(3, 1) - Mang(2, 1)) * (x - Mang(2, 1))
Tam2 = Mang(2, 3) + (Mang(3, 3) - Mang(2, 3)) / (Mang(3, 1) - Mang(2, 1)) * (x - Mang(2, 1))
NS2 = Tam1 + (Tam2 - Tam1) / (Mang(1, 3) - Mang(1, 2)) * (y - Mang(1, 2))
End Function
câu lệnh là:=ns2(x,y,bôi đen mảng dữ liêu) là ok
vi du:
ta có mảng sau: 40 50
5 7 8
10 20 30
bây giờ với x = 7 nằm giữa 5,10
y = 45 nằm giữa 40,50
giá trị cần tìm là: = ns2(7,45,và bôi đen mảng đó)
chúc bạn thành công!
 
Upvote 0
Tôi có một file như sau:
Mã:
http://www.mediafire.com/?qmnijx1smti
http://www.mediafire.com/?qmnijx1smti

my.php

1_936849853m.jpg



Tôi cần tính toán giá trị nội suy theo hai chiều và viết hàm cho nó. Ai có hàm này rồi thì giúp tôi với!!

Bên box Excel kỹ thuật cũng có người hỏi về vấn đề này, bạn vào đây xem thử có dùng được không.
http://www.giaiphapexcel.com/forum/showthread.php?t=19203
 
Upvote 0
Web KT

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

Back
Top Bottom