PDA

View Full Version : Nội suy 1 chiều



vietlge
09-02-09, 10:32 AM
Mình viết code cho hàm nội suy một chiều như thế này các bạn check xem có sai gì không nhé:
Function ns1(x As Single, mang As Range)
ns1 = mang(2, 2) + (mang(3, 2) - mang(2, 2)) * (x - mang(2, 1)) / (mang(3, 1) - mang(2, 1))
End Function
Mình thử với những giá trị x đầu tiên của mảng thì đúng. Nhưng với những giá trị x ở dưới thì lại cho gia kết quả sai
ví dụ: ta có mảng x y
1,6 1,5
1,8 2
với giá trị x=1.7 thì mình sử dụng lệnh: ns1(1.7,bôi đen mảng) =1,65
trong khi đó giá trị đúng là 1,75!
làm ơn sửa giúp mình code và cho lời khuyên nhé!
thanks and best regards!

ptlong04x1
09-02-09, 10:43 AM
công thức nội suy của bạn có vấn đề, theo mình nó phải là :
NS1 = Mang(1, 2) + (Mang(2, 2) - Mang(1, 2)) / (Mang(2, 1) - Mang(1, 1)) * (x - Mang(1, 1))
Bạn thử lại nhé!

PhanTuHuong
09-02-09, 11:15 AM
Hàm nội suy 1 chiều đã có trên diễn đàn, bạn chịu khó tìm kiếm nhé. Khó nhất là tìm kiếm ở biên thôi (không có cận trên hoặc cận dưới), vì vậy cần thiết bổ sung thêm code ngoài công thức trên.

vietlge
09-02-09, 12:53 PM
Bạn ptlong04x1 ơi!
mình thử công thức của bạn rồi, cũng như công thức của mình thôi
chẳng có chuyển biến tích cực gì cả
hình như nếu dùng code như của mình và của bạn cái mảng nó bị giới hạn thì phải
nó chỉ đúng trong một số lượng hàng xác định
còn khi giá trị x ở một hàng nào đó lớn quá thì công thức sẽ ko tính được!

ptlong04x1
09-02-09, 01:01 PM
Function NS1(x As Single, Mang As Range)

NS1 = Mang(1, 2) + (Mang(2, 2) - Mang(1, 2)) / (Mang(2, 1) - Mang(1, 1)) * (x - Mang(1, 1))

End Function


Với quan hệ tuyến tính thì dù x là bao nhiêu nó cũng đúng thôi bạn a. Ngay cả khi x>cận trên hay x<cận dưới. Mình đã thử với ví dụ của bạn và kết quả nó ra là 1,75 mà. Đây là trường hợp code đơn giản vì ta đã có các biên của x (cận trên và dưới), bạn nên xem thêm gợi ý của anh phantuhuong.

vietlge
09-02-09, 02:07 PM
bạn ơi! mình đã thử, code của mình và bạn là như nhau thôi
cả hai đều đúng trong trường hợp mảng chỉ có số dòng ít thôi, chứ đến khi mà số dòng nó tăng lên rất nhiều tầm mấy trăm dòng thì cái code này vất đi bạn ạ!mình mới tham gia nên chưa hiểu biết nhiều.Bạn có cách nào khắc phục thì chỉ bảo giúp mình hoặc là có cái code của nội suy một chiều thì gửi cho minh nhé!
mình cảm ơn bạn rất nhiều!

ptlong04x1
09-02-09, 03:32 PM
Híc, mình đã nói rồi mà, đây là mình lấy cái ví dụ đơn giản, nội suy 1 chiều thì chỉ cần tìm 2 giá trị kẹp 2 đầu của x (đó chính là động tác tô đen mảng mà bạn nói), xác định 2 giá trị cận trên và cận dưới thì chỉ cần 1 mảng có 2 dòng (2 dòng này mình phải tự xác định bằng tay tức là tô đen 2 dòng đó). Còn trường hợp có nhiều dòng mà bạn tô đen cả mảng thì 2 cận trên và dưới sẽ phải được xác định 1 cách tự động thông qua code VBA, bài toán này đã có nhiều trên diễn đàn, bạn sử dụng chức năng tìm kiếm của diễn đàn để tìm nhé (dùng search bằng google cho nhanh), chắc chắn sẽ tìm ra thôi.

vietlge
11-02-09, 11:15 AM
cảm ơn bạn ptlong04x1! Mình đã viết được hai hàm nội suy một chiều và hai chiều và sử dụng ok rồi
nhưng mà có một vấn đề nhỏ là
ở cái file excel mà mình viết code của hai hàm này ý, khi mình làm trên các work sheet mình thấy một số ô mình dùng lệnh một trong hai hàm này không được, mình cop mảng đó ra vùng khác và dùng hàm thì lại được. Kể cả khi mình sử dụng một số hàm thông dụng như Vlookup or hlookup và có mảng nằm ở khu vực đó thì hàm cũng không sử dụng được toàn cho gia giá trị 0.
Bạn làm ơn giải thích giúp mình là tại sao lại thế và chỉ mình cách khắc phục được không?
mình cảm ơn bạn nhiều!

ducka123
02-03-14, 04:23 PM
cả nhà cho e hỏi về nội suy với , e đang làm bài tập tin ứng dụng mà k hiểu gì cả :(((