TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT – HUNG KHOA CÔNG NGHỆ THÔNG TIN BÁO CÁO HỌC PHẦN LINUX VÀ PHẦN MỀM MÃ NGUỒN MỞ NEWTON’S DIVIDED DIFFERENCE INTERPOLATING POLYNOMIALS HÀ NỘI, NĂM 2023 TRƯỜNG ĐẠI HỌC CÔN[.]
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT – HUNG
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO HỌC PHẦN
LINUX VÀ PHẦN MỀM MÃ
NGUỒN MỞ
NEWTON’S DIVIDED-DIFFERENCE INTERPOLATING POLYNOMIALS
HÀ NỘI, NĂM 2023
Trang 2TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT – HUNG
KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO HỌC PHẦN LINUX VÀ PHẦN MỀM MÃ NGUỒN
MỞ
CHUYÊN NGÀNH: CÔNG NGHỆ THÔNG TIN
Giảng viên bộ môn :
Sinh viên thực hiện :
Hà Đăng Toàn Lương Văn Tứ - 1900734 Phạm Đức Hưởng – 1900629
Lớp : K4318CNT2
HÀ NỘI, NĂM 2023
Trang 3LỜI NÓI ĐẦU
Bạn sẽ thường xuyên có cơ hội ước tính các giá trị trung gian giữa các điểm dữ liệu chính xác Phương pháp phổ biến nhất được sử dụng cho mục đích này là phép nội suy đa thức
Nhắc lại rằng công thức chung của đa thức bậc n là
f(x) = a0 + a1x + a2x2 + + anxn (Eq)
Với n + 1 điểm dữ liệu, tồn tại một và chỉ một đa thức bậc n đi qua tất cả các điểm Chẳng hạn, chỉ có một đường thẳng (tức là một đa thức bậc nhất) nối hai điểm (Hình a) Tương tự, chỉ có một parabol kết nối một bộ ba điểm (b) Nội suy đa thức bao gồm việc xác định đa thức bậc n duy nhất phù hợp với n + 1 điểm dữ liệu Đa thức này sau đó cung cấp một công thức để tính các giá trị trung gian
Mặc dù có một và chỉ một đa thức bậc n thỏa mãn n + 1 điểm, nhưng có nhiều dạng toán học khác nhau để biểu diễn đa thức này Trong chương này, chúng ta sẽ mô tả hai phương án rất phù hợp để thực hiện trên máy tính đa thức Newton
Trang 4MỤC LỤC
PHẦN 1: CƠ SỞ LÝ THUYẾT 1
1.1 Tổng quan Newton’s divided-difference interpolating polynomial 1
1.2 Phép nội suy tuyến tính 1
1.3 Nội suy bậc hai 2
1.4 Dạng Tổng quát của Đa thức Nội suy Newton 3
1.5 Sai số của đa thức nội suy Newton 4
1.6 Thuật toán máy tính cho đa thức nội suy của Newton 6
PHẦN 2: MÔ PHỎNG CÁCH GIẢI BÀI TOÁN ĐA THỨC NỘI SUY CỦA NEWTON BẰNG NGÔN NGỮ LẬP TRÌNH PYTHON 8
2.1 Giới thiệu về ngôn ngữ lập trình Python 8
2.2 Xây dựng chương trình 8
2.2.1 Phép nội suy tuyến tính 8
2.2.2 Nội suy bậc hai 9
2.2.3 Dạng Tổng quát và Sai số của đa thức nội suy Newton 9
Trang 5PHẦN 1:
CƠ SỞ LÝ THUYẾT
1.1 Tổng quan Newton’s divided-difference interpolating polynomial
Như đã nêu ở trên, có nhiều dạng khác nhau để biểu diễn một đa thức nội suy Đa thức nội suy sai phân chia của Newton là một trong những dạng phổ biến và hữu ích nhất Trước khi trình bày phương trình tổng quát, chúng tôi sẽ giới thiệu phiên bản cấp một và cấp hai vì cách giải thích trực quan đơn giản của chúng
1.2 Phép nội suy tuyến tính
Hình thức nội suy đơn giản nhất là nối hai điểm dữ liệu bằng một đường thẳng Kỹ thuật này, được gọi là phép nội suy tuyến tính, được mô tả bằng đồ thị trong hình (1.1)
Sử dụng các tam giác đồng dạng:
f 1(x)−f ( x 0)
f (x 1)−f (x 0)
x 1− x 0
Mà có thể được sắp xếp lại để mang lại (1.1)
f 1 ( x )=f ( x 0)+ f ( x 1)−f ( x 0 )
Đó là một công thức nội suy tuyến tính Kí hiệu f1(x) cho biết đây là đa thức nội suy bậc nhất Lưu ý rằng bên cạnh việc biểu thị hệ số góc của đường nối các điểm, thuật ngữ [f(x1) - f(x0)]/(x1 - x0) là một phép chia hữu hạn
Mô tả đồ họa của phép nội suy tuyến tính Các khu vực được tô bóng biểu thị các tam giác tương tự được sử dụng để lấy công thức nội suy tuyến tính
Hình 1.1 Đồ thị phép nội suy tuyến tính Hai phép nội suy tuyến tính để ước tính ln 2 Lưu ý cách khoảng nhỏ hơn mang lại kết quả tốt hơn ước lượng
Trang 6Hình 1.2
1.3 Nội suy bậc hai
f2(x) = b0 + b1(x - x0) + b2(x - x0)(x - x1) (1.3)
Lưu ý rằng mặc dù phương trình (1.3) dường như khác với đa thức tổng quát [Eq] thì hai phương trình tương đương Điều này có thể được hiển thị bằng cách nhân các số hạng trong biểu thức (1.3) để mang lại
f2(x) = b0 + b1x - b1x0 + b2x2 + b2x0x1 - b2xx0 - b2xx1
hoặc
f2(x) = a0 + a1x + a2x2
với
a0 = b0 - b1x0 + b2x0x1
a1 = b1 - b2x0 - b2x1
a2 = b2
Do đó, các phương trình (Eq) và (1.3) là các công thức thay thế, tương đương của
đa thức bậc hai duy nhất nối ba điểm
Một thủ tục đơn giản có thể được sử dụng để xác định giá trị của các hệ số Đối với
b0, phương trình (1.3) với x = x0 có thể dùng để tính
b0 = f(x0) (1.4) Phương trình (1.4) có thể được thay thế thành phương trình (1.3), có thể được đánh giá tại x = x1 cho
b1=f(x1)−f (x0)
x1−x0 (1.5) Cuối cùng, phương trình (1.4) và (1.5) có thể được thay thế thành phương trình (18.3), có thể ước tính tại x = x2 và được giải (sau một số thao tác đại số) cho
Trang 7f(x2)−f (x1)
x2−x1 −
f(x1)−f (x0)
x1−x0
x2−x0
(1.6)
Lưu ý rằng, giống như trường hợp nội suy tuyến tính, b1 vẫn biểu thị hệ số góc của đường nối các điểm x0 và x1 Do đó, hai điều khoản đầu tiên của phương trình (1.3) tương đương với phép nội suy tuyến tính từ x0 đến x1, như được chỉ định trước đó trong biểu thức (1.2) Thuật ngữ cuối cùng, b2(x - x0)(x - x1), đưa độ cong bậc hai vào công thức
Việc sử dụng phép nội suy bậc hai để ước lượng ln 2 Phép nội suy tuyến tính từ x =
1 đến 4 là cũng được đưa vào để so sánh
Hình 1.3 Sử dụng phép nội suy bậc hai
1.4 Dạng Tổng quát của Đa thức Nội suy Newton
Phân tích trước có thể được khái quát hóa để phù hợp với một đa thức bậc n cho n + 1 điểm dữ liệu Đa thức bậc n là
fn(x) = b0 + b1(x - x0) + + bn(x - x0)(x - x1) (x – xn-1) (1.7)
Như đã được thực hiện trước đây với phép nội suy tuyến tính và bậc hai, các điểm
dữ liệu có thể được sử dụng để đánh giá các hệ số b0, b1, , bn Đối với đa thức bậc n, cần có n + 1 điểm dữ liệu: [x0, f(x0)], [x1, f(x1)], , [xn, f(xn)] Chúng tôi sử dụng các điểm dữ liệu này và các phương trình sau để đánh giá các hệ số:
b0 = f(x0) (1.8)
b1 = f [x1, x0] (1.9)
b2 = f [x2, x1, x0] (1.10)
bn = f[xn, xn-1, , x1, x0] (1.11)
Trang 8Trong đó các đánh giá chức năng được đặt trong ngoặc đơn là sự khác biệt được chia hữu hạn
Ví dụ: sự khác biệt được chia hữu hạn đầu tiên được biểu thị chung là
f [x i , x j]=f(x i)−f (x j)
x i−x j (1.12)
Sự khác biệt được chia hữu hạn thứ hai, đại diện cho sự khác biệt của hai sự khác biệt được chia đầu tiên, thường được biểu thị bằng
f[x i , x j , x k]=f [x i , x j]−f [x j , x k]
x i−x k (1.13) Tương tự, hiệu chia hữu hạn thứ n là
f[x n , x n−1 , … , x1, x0]=f[x n , x n−1 , … , x1]−f [ x n−1 , x n−2 , … , x0]
x n−x0 (1.14)
Hình 1.4 Mô tả đồ họa về bản chất đệ quy của sự khác biệt được chia hữu hạn Những khác biệt này có thể được sử dụng để đánh giá các hệ số trong phương trình (1.8) đến (1.11), sau đó có thể thay thế vào phương trình (1.7) để mang lại đa thức nội suy
(1.15) Được gọi là đa thức nội suy sai phân chia của Newton Cần lưu ý rằng không cần thiết các điểm dữ liệu được sử dụng trong biểu thức (1.15) được đặt cách đều nhau hoặc các giá trị hoành độ nhất thiết phải theo thứ tự tăng dần, như được minh họa trong ví dụ sau Ngoài ra, hãy chú ý cách phương trình (1.12) đến (1.14) là đệ quy—tức là, chênh lệch bậc cao hơn được tính bằng cách lấy chênh lệch của chênh lệch bậc thấp hơn (Hình 1.4) Tài sản này sẽ được khai thác khi chúng tôi phát triển một chương trình máy tính hiệu quả trong Sec 1.15 để triển khai phương thức
1.5 Sai số của đa thức nội suy Newton
Lưu ý rằng cấu trúc của phương trình (1.15) tương tự như khai triển chuỗi Taylor theo nghĩa là các số hạng được thêm vào một cách tuần tự để nắm bắt hành vi bậc cao
Trang 9hơn của hàm cơ bản Các số hạng này là các sai phân hữu hạn được chia và do đó, đại diện cho các xấp xỉ của các đạo hàm bậc cao
Do đó, như với chuỗi Taylor, nếu hàm cơ bản thực sự là một đa thức bậc n, thì đa thức nội suy bậc n dựa trên n + 1 điểm dữ liệu sẽ mang lại kết quả chính xác
Ngoài ra, như trường hợp của chuỗi Taylor, có thể thu được công thức cho lỗi cắt ngắn Nhớ lại từ phương trình (1.16) rằng sai số cắt ngắn đối với chuỗi Taylor có thể được biểu thị chung là:
(1.16) Trong dó ₤ ở khoảng xi đến xi+1 Đối với đa thức nội suy bậc n, một mối quan hệ tương tự cho lỗi là
(1.17) Trong đó ₤ ở đâu đó trong khoảng chứa ẩn số và dữ liệu Để công thức này được sử dụng, hàm được đề cập phải được biết và khả vi Điều này thường không xảy ra May mắn thay, có sẵn một công thức thay thế không yêu cầu kiến thức trước về chức năng Thay vào đó, nó sử dụng một phép chia hữu hạn để tính gần đúng đạo hàm thứ (n + 1),
Rn = f[x, xn, xn-1, , x0](x - x0)(x - x1) (x - xn) (1.18)
Trong đó f[x, xn, xn-1, , x0] là hiệu chia hết hạn thứ (n + 1) Bởi vì phương trình (1.18) chứa f(x) chưa biết, nên nó không thể giải quyết được lỗi Tuy nhiên, nếu có sẵn một điểm dữ liệu bổ sung f(xn+1), phương trình (1.18) có thể được sử dụng để ước tính sai số, như sau
(1.19)
Từ ví dụ trước và từ phương trình (1.19), rõ ràng ước lượng sai số cho đa thức bậc
n tương đương với hiệu giữa bậc (n + 1) và dự đoán bậc n
Đó là Rn = fn+1(x) - fn(x) (1.20) Nói cách khác, số gia được thêm vào trường hợp thứ tự n để tạo trường hợp thứ tự (n + 1) [nghĩa là, phương trình (1.19)] được hiểu là ước tính của sai số thứ tự n Điều này
có thể được nhìn thấy rõ ràng bằng cách sắp xếp lại phương trình (1.20) để cho
Fn+1(x) = fn(x) + Rn
Tính hợp lệ của cách tiếp cận này được xác định dựa trên thực tế là chuỗi đồng quy mạnh Đối với tình huống như vậy, dự đoán bậc (n + 1) phải gần với giá trị thực hơn nhiều so với dự đoán bậc n Do đó, phương trình (1.20) phù hợp với định nghĩa tiêu
Trang 10chuẩn của chúng ta về sai số khi biểu thị sự khác biệt giữa giá trị thực và giá trị gần đúng Tuy nhiên, lưu ý rằng trong khi tất cả các ước tính lỗi khác cho các phương pháp lặp được giới thiệu cho đến thời điểm này đã được xác định là dự đoán hiện tại trừ đi dự đoán trước đó, phương trình (1.20) biểu thị dự đoán trong tương lai trừ đi dự đoán hiện tại Điều này có nghĩa là đối với một chuỗi hội tụ nhanh, ước lượng sai số của phương trình (1.20) có thể nhỏ hơn sai số thực Điều này sẽ thể hiện chất lượng rất kém hấp dẫn nếu ước tính lỗi được sử dụng làm tiêu chí dừng Tuy nhiên, như sẽ được mô tả trong phần sau, các đa thức nội suy bậc cao rất nhạy cảm với các lỗi dữ liệu - nghĩa là chúng rất yếu Khi được sử dụng để nội suy, chúng thường mang lại những dự đoán khác biệt đáng kể
so với giá trị thực Bằng cách “nhìn về phía trước” để phát hiện lỗi, phương trình (1.20) nhạy cảm hơn với sự phân kỳ như vậy Như vậy, nó có giá trị hơn đối với loại phân tích
dữ liệu khám phá mà đa thức Newton là phù hợp nhất
1.6 Thuật toán máy tính cho đa thức nội suy của Newton
Ba thuộc tính làm cho các đa thức nội suy của Newton cực kỳ hấp dẫn đối với các ứng dụng máy tính:
1 Như trong phương trình (1.7), các phiên bản bậc cao hơn có thể được phát triển tuần tự bằng cách thêm một số hạng vào phương trình bậc thấp tiếp theo Điều này tạo điều kiện thuận lợi cho việc đánh giá một số phiên bản theo thứ tự khác nhau trong cùng một chương trình Khả năng như vậy đặc biệt có giá trị khi bậc của đa thức không được biết trước Bằng cách thêm các thuật ngữ mới một cách tuần tự, chúng ta có thể xác định khi nào đạt đến điểm lợi suất giảm dần—nghĩa là khi việc thêm các thuật ngữ bậc cao hơn không còn cải thiện đáng kể ước tính hoặc trong một số trường hợp thực sự làm giảm giá trị ước tính Các phương trình sai số được thảo luận dưới đây trong phần (3) rất hữu ích trong việc đưa ra một tiêu chí khách quan để xác định điểm này của các số hạng giảm dần
2 Các sai phân hữu hạn được chia tạo thành các hệ số của đa thức [Eqs (1.8)đến (1.11)] có thể được tính toán một cách hiệu quả Đó là, như trong phương trình (1.14) và Hình 1.4, chênh lệch bậc thấp được sử dụng để tính toán chênh lệch bậc cao Bằng cách
sử dụng thông tin đã được xác định trước đó này, các hệ số có thể được tính toán một cách hiệu quả Các thuật toán trong Hình 1.6 chứa sơ đồ như vậy
3 Ước tính lỗi [Eq (1.19)] có thể được kết hợp rất đơn giản vào một thuật toán máy tính do cách thức tuần tự trong đó dự đoán được xây dựng
Trang 11Hình 1.6 Một thuật toán cho đa thức nội suy của Newton được viết bằng mã giả Tất cả các đặc điểm trên có thể được khai thác và kết hợp thành một thuật toán tổng quát để thực hiện đa thức Newton (Hình 1.6) Lưu ý rằng thuật toán bao gồm hai phần: Phần thứ nhất xác định các hệ số từ phương trình (1.6), và phần thứ hai xác định các dự đoán và sai số liên quan của chúng
Trang 12PHẦN 2:
MÔ PHỎNG CÁCH GIẢI BÀI TOÁN ĐA THỨC NỘI SUY CỦA NEWTON BẰNG NGÔN NGỮ LẬP TRÌNH PYTHON.
2.1 Giới thiệu về ngôn ngữ lập trình Python.
Python là ngôn ngữ lập trình được sáng tạo bởi Guido Van Rossum – một chuyên gia lập trình người Hà Lan vào năm 1991 Người sáng lập muốn Python là một ngôn ngữ
dễ hiểu và tương đồng với tiếng anh Nhờ vậy, nó rất thân thiện với người dùng, không khó để người mới làm quen Python là một phần mềm mã nguồn mở (open source) Do
đó, ai cũng có thể đóng góp để phát triển Python, giúp ngôn ngữ này ngày càng trở nên phổ biến và mạnh mẽ hơn Ngoài ra, Python có thể chạy trên nhiều nền tảng hệ điều hành khác nhau như UNIX, MS – DOS, Mac OS, Windows và Linux…
2.2 Xây dựng chương trình
2.2.1 Phép nội suy tuyến tính
import numpy as np
import matplotlib.pyplot as plt
x1 = float(input("Nhập giá trị của x1: "))
y1 = float(input("Nhập giá trị của y1: "))
x2 = float(input("Nhập giá trị của x2: "))
y2 = float(input("Nhập giá trị của y2: "))
x_new = np.linspace(x1, x2, 1000)
y_new = (y2 - y1) / (x2 - x1) * (x_new - x1) + y1
plt.plot([x1, x2], [y1, y2], 'o', label='known points')
plt.plot(x_new, y_new, label='interpolated function')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Linear interpolation')
plt.legend()
plt.show()
VD: (0, 1); (6, 1.791759)
Hình 2.1 Nội suy bậc nhất (tuyến tính) nối hai điểm
Trang 132.2.2 Nội suy bậc hai
import numpy as np
import matplotlib.pyplot as plt
x1 = float(input("Nhập giá trị của x1: "))
y1 = float(input("Nhập giá trị của y1: "))
x2 = float(input("Nhập giá trị của x2: "))
y2 = float(input("Nhập giá trị của y2: "))
x3 = float(input("Nhập giá trị của x3: "))
y3 = float(input("Nhập giá trị của y3: "))
x_new = np.linspace(x1, x3, 1000)
a = ((y2 - y1) / ((x2 - x1) * (x2 - x3))) - ((y3 - y1) / ((x3 - x1) * (x2 - x3)))
b = ((y2 - y1) / (x2 - x1)) - a * (x1 + x2)
c = y1 - a * x1**2 - b * x1
y_new = a * x_new**2 + b * x_new + c
plt.plot([x1, x2, x3], [y1, y2, y3], 'o', label='known points')
plt.plot(x_new, y_new, label='interpolated function')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Quadratic interpolation')
plt.legend()
plt.show()
VD: (1, 0); (4, 1.386294); (6, 1.791759)
Hình 2.2 Nội suy bậc 2 nối ba điểm 2.2.3 Dạng Tổng quát và Sai số của đa thức nội suy Newton
import numpy as np
import matplotlib.pyplot as plt
Trang 14def newton_interpolation(x, y):
""" Tính đa thức nội suy Newton cho các điểm (x, y) """
n = len(x)
a = y.copy()
for j in range(1, n):
for i in range(n-1, j-1, -1):
a[i] = (a[i] - a[i-1]) / (x[i] - x[i-j])
return a
n = int(input("Nhập số điểm: "))
x = np.zeros(n)
y = np.zeros(n)
for i in range(n):
x[i] = float(input(f"Nhập x{i}: "))
y[i] = float(input(f"Nhập y{i}: "))
a = np.zeros((n,n))
a[:,0] = y
for j in range(1,n):
for i in range(n-j):
a[i][j] = (a[i+1][j-1] - a[i][j-1]) / (x[i+j] - x[i])
x_new = np.linspace(x[0], x[-1], 1000)
y_new = np.zeros_like(x_new)
for i in range(n):
p = a[0][i]
for j in range(i):
p *= (x_new - x[j])
y_new += p
error = np.abs(y_new - np.interp(x_new, x, y))
plt.plot(x, y, 'o', label='known points')
plt.plot(x_new, y_new, label='interpolated function')
plt.xlabel('x')
plt.ylabel('y')
plt.title('General Form of Newton’s Interpolating Polynomials') plt.legend()
plt.show()
VD: (1, 0); (4, 1.386294); (5, 1.609438); (6, 1.791759)