PDA

View Full Version : Hỏi về hàm nội suy



nguyenthinu168
22-06-06, 09:11 AM
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.

OverAC
22-06-06, 09:37 AM
Đọ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é)

nguyenthinu168
22-06-06, 10:24 AM
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!

PhanTuHuong
22-06-06, 12:37 PM
Bạn thử tải file này về nghiên cứu xem, có 3 cách đó. NGoài ra có thể dễ dàng lập khi dùng VB.

PhanTuHuong
23-06-06, 09:07 AM
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.

PMXD
23-06-06, 01:38 PM
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

plka
23-06-06, 03:51 PM
Bác PMXD ở bên ketcau.com đã mò sang đây rùi! Em câu bài cái nha hi hi!

PhanTuHuong
24-06-06, 04:22 PM
Để hiểu thêm về sử dụng hàm forecast, mời bạn sang Excel và Kỹ thuật.

HAiNV
28-06-06, 01:33 PM
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ủ!

Nguyễn Duy Tuân
31-07-06, 09:58 PM
Để 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.

PhanTuHuong
03-08-06, 12:54 PM
Mục này nên để ở Excel và kỹ thuật, nghe có vẻ phù hợp hơn.

ptlong04x1
24-03-09, 08:27 PM
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.


http://www.giaiphapexcel.com/forum/attachment.php?attachmentid=24187&stc=1&d=1237831588

tuan_tram77
15-04-09, 11:13 AM
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?

giaptk3
15-04-09, 04:28 PM
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

tuanpmkn
08-10-09, 10:31 AM
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.

bravery10
23-05-10, 08:13 PM
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.


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

bravery10
23-05-10, 08:22 PM
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.

SA_DQ
24-05-10, 01:22 PM
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))

PhanTuHuong
28-05-10, 08:49 AM
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é!!!

dieplv
06-09-11, 12:12 AM
Giúp em tìm giá trị của thông số này với!

dieplv
06-09-11, 12:22 AM
Bác nào giúp em nội suy giá trị của thông số này với

bebo021999
06-09-11, 07:36 AM
Giúp em tìm giá trị của thông số này với!
Giá trị 1.143 không có, nếu tìm gần đúng là 1.10, giá trị tương ứng cần tìm là 0.0194: dùng công thức

=LOOKUP(1.143,E9:E29,F9:F29)

ptm0412
06-09-11, 08:08 AM
Đây là topic nội suy mà bebo, đâu phải tìm số cận dưới, mà là tính giá trị trong khoảng giữa cận dưới và cận trên.
Có 2 cách tính:

1. Tuyến tính:
- Tìm cận trên và cận dưới của X
- Tìm cận trên và cận dưới của Y
- Tính bằng công thức nội suy tuyến tính.

2. Phi tuyến:
- Vẽ đồ thị XY tương ứng
- Vẽ trendline, thể hiện hàm hồi quy y = f(x)
- Tính y0 theo x0: y0 = f(x0)

nguyenmanhthinh
18-04-12, 07:58 PM
anh PMXD ơi cái code nội suy hai chiều của anh viết hay quá .. nhưng có chỗ khi giá trị nội suy của hàng được chia nhỏ hơn 1 ví dụ từ 0.7 đến 0.8, thì khi chọn nội suy ở giá trị 0.75 thì lại bị trả về không.. anh có thế khác phục được không ạ.. em cảm ơn anh nhiều!!!

nguyenmanhthinh
18-04-12, 07:59 PM
anh PMXD ơi cái code nội suy hai chiều của anh viết hay quá .. nhưng có chỗ khi giá trị nội suy của hàng được chia nhỏ hơn 1 ví dụ từ 0.7 đến 0.8, thì khi chọn nội suy ở giá trị 0.75 thì lại bị trả về không.. anh có thế khác phục được không ạ.. em cảm ơn anh nhiều!!!

nguyenmanhthinh
18-04-12, 08:06 PM
anh PMXD ơi.. cái code anh viết nội suy hay quá.. nhưng có chố là khi giá trị nội suy theo hàng được chia nhỏ ( ví dụ A1= 0.7 ; A2=0.8 thì giá trị nội suy ở 0.75 lại bị trả về 0)... anh có thế khác phục được không ạ.. em đang cần cái này.. em cảm ơn anh nhiều!!

mr.ts91
17-03-13, 06:51 PM
e cũng chưa bít gì về lập trình nên cũng không hiểu lắm, e thắc mắt là làm sao để chạy được các lệnh ở trên. a có thể hướng dẫn giúp e với. thank!

mr.ts91
20-03-13, 08:54 AM
Làm sao để chậy được đoạn mã lệnh này vậy, mấy a giúp e với!