Thuật toán nội suy tuyến tính là một kỹ thuật cơ bản nhưng cực kỳ hữu ích trong nhiều lĩnh vực như đồ họa máy tính, xử lý tín hiệu và phân tích dữ liệu. Nó cho phép ước lượng giá trị tại một điểm nằm giữa hai điểm đã biết thông qua một hàm tuyến tính.
Cơ sở toán học
Giả sử có hai điểm dữ liệu: A(a, va) và B(b, vb). Với một giá trị x nằm trong khoảng [a, b], giá trị tương ứng v được tính theo công thức:
v = va + (x - a) * (vb - va) / (b - a)
Điều kiện bắt buộc: a ≠ b để tránh chia cho 0.
Lĩnh vực ứng dụng tiêu biểu
- Đồ họa máy tính: Nội suy màu sắc giữa các đỉnh trong shader hoặc gradient.
- Xử lý dữ liệu: Lấp đầy giá trị thiếu hoặc làm mượt chuỗi số liệu.
- Âm thanh kỹ thuật số: Thay đổi tần số lấy mẫu bằng cách chèn thêm mẫu mới.
Triển khai thực tế
Phiên bản Python với kiểm tra đầu vào
def interpolate_value(start_pt, end_pt, target_x):
ax, ay = start_pt
bx, by = end_pt
if abs(bx - ax) < 1e-9:
raise ValueError("Hai điểm phải khác nhau trên trục X")
ratio = (target_x - ax) / (bx - ax)
interpolated_y = ay + ratio * (by - ay)
return interpolated_y
# Ví dụ sử dụng
point_a = (2.0, 4.0)
point_b = (8.0, 16.0)
query_x = 5.0
result = interpolate_value(point_a, point_b, query_x)
print(f"Giá trị tại x={query_x}: {result}")
Phiên bản C++ tối ưu với struct
#include <iostream>
#include <cmath>
struct Point {
double x, y;
};
double interpolate(const Point& p1, const Point& p2, double target_x) {
const double dx = p2.x - p1.x;
if (std::abs(dx) < 1e-9) {
throw std::domain_error("Khoảng cách X quá nhỏ");
}
return p1.y + (target_x - p1.x) * (p2.y - p1.y) / dx;
}
int main() {
Point left{1.5, 3.0}, right{7.5, 15.0};
double x_target = 4.5;
std::cout << "Nội suy tại " << x_target << ": "
<< interpolate(left, right, x_target) << std::endl;
return 0;
}
Mở rộng nâng cao
Trong đồ họa 3D, nội suy tuyến tính thường được áp dụng đồng thời trên nhiều kênh màu (R, G, B, A). Khi xử lý âm thanh, thuật toán có thể chạy theo thời gian thực để tái tạo mẫu ở tần số mới mà không làm biến dạng tín hiệu gốc.