Tải bản đầy đủ (.docx) (15 trang)

phương pháp chia đôi và bairstow

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (0 B, 15 trang )

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT - HUNG
KHOA CÔNG NGHỆ THÔNG TIN

BÁO CÁO KẾT THÚC HỌC PHẦN
LINUX VÀ PHẦN MỀM MÃ NGUỒN MỞ

Hà Nội - Năm 2023


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Ở

CHUN NGÀNH: CƠNG NGHỆ THƠNG TIN
Giảng viên bộ mơn

: Hà Đăng Toàn

Sinh viên thực hiện

: Nguyễn Văn Chiến 1900699
: Mào Quốc Huy 1900730

Lớp

: K4318CNT2

HÀ NỘI, NĂM 2023



LỜI MỞ ĐẦU
Xin chào và chào mừng đến với báo cáo của tơi về phương pháp tìm nghiệm
chia đơi và phương pháp Bairstow trong giải toán số học.
Phương pháp chia đôi là một phương pháp đơn giản và hiệu quả để tìm nghiệm
của một hàm số. Nó được sử dụng để tìm kiếm nghiệm trên một khoảng giá trị xác
định của biến độc lập. Phương pháp này là một trong những phương pháp cơ bản nhất
trong giải toán số học và được sử dụng rộng rãi trong các lĩnh vực khác nhau.
Tuy nhiên, phương pháp chia đôi không phải là phương pháp duy nhất để tìm
nghiệm của một hàm số. Phương pháp Bairstow là một phương pháp khác cũng rất
hiệu quả trong giải quyết các bài tốn tìm nghiệm của một hàm số. Phương pháp
Bairstow được sử dụng để giải những phương trình bậc cao bằng cách áp dụng thuật
tốn tìm nghiệm đa thức.
Trong báo cáo này, tơi sẽ trình bày các bước thực hiện phương pháp chia đôi và
phương pháp Bairstow, cũng như đưa ra các ví dụ minh họa để giúp bạn hiểu rõ hơn
về các phương pháp này. Báo cáo này sẽ giúp bạn hiểu và áp dụng phương pháp chia
đôi và phương pháp Bairstow để giải quyết các bài tốn tìm nghiệm trong các lĩnh vực
khác nhau.
Hy vọng báo cáo này sẽ giúp bạn hiểu rõ hơn về các phương pháp này và áp
dụng chúng vào giải các bài tốn tìm nghiệm trong thực tế.


NHẬN XÉT CỦA GIẢNG VIÊN
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………

……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………

Hà Nội, ngày…..tháng…..năm 2023
GIẢNG VIÊN


MỤC LỤC
PHẦN A: TÌM HIỂU ĐỀ TÀI...........................................................1
1.Ngơn ngữ Python............................................................................ 1
2. Giới thiệu về phương pháp chia đôi và bairstow........................1
2.1. Nghiệm của đa thức là gì?..........................................................1
2.2. Phương pháp chia đơi................................................................2
2.3. Phương pháp Bairstow..............................................................3
PHẦN B: XÂY DỰNG CHƯƠNG TRÌNH......................................6
1.Cách thức hoạt động của phương pháp chia đơi......................6
2.Xây dựng chương trình phương pháp chia đôi............................7
2.1.Hướng dẫn sử dụng:....................................................................8
3.Cách thức hoạt động của phương pháp Bairstow........................8
4.Xây dựng chương trình phương pháp Bairstow..........................9



PHẦN A: TÌM HIỂU ĐỀ TÀI
1. Ngơn ngữ Python.
Ngơn ngữ lập trình Python là một ngơn ngữ lập trình thơng dịch, được tạo ra
bởi Guido van Rossum vào năm 1991. Python được thiết kế để đọc dễ hiểu và dễ
sử dụng, cho phép lập trình viên tập trung vào giải quyết vấn đề thay vì phải quan
tâm đến cú pháp. Python cũng được sử dụng rộng rãi trong khoa học dữ liệu và trí
tuệ nhân tạo, do tính đơn giản, dễ học và cộng đồng phát triển mạnh mẽ.
So sánh với một số ngơn ngữ lập trình khác:
 Python so với Java: Python là ngơn ngữ lập trình cao cấp, có cú pháp đơn
giản hơn so với Java và được sử dụng rộng rãi trong khoa học dữ liệu và trí
tuệ nhân tạo. Java được sử dụng rộng rãi trong các ứng dụng doanh nghiệp
lớn và các ứng dụng máy tính.
 Python so với C++: Python là ngơn ngữ lập trình thơng dịch, dễ học và có
cú pháp đơn giản hơn so với C++. C++ được sử dụng rộng rãi trong các
ứng dụng hệ thống và ứng dụng máy tính đòi hỏi hiệu suất cao.
 Python so với JavaScript: Python là ngơn ngữ lập trình thơng dịch, được sử
dụng chủ yếu trong phát triển web và khoa học dữ liệu. JavaScript là ngơn
ngữ lập trình phía máy khách được sử dụng rộng rãi trong phát triển web.
Tóm lại, Python là một ngơn ngữ lập trình thơng dịch, đơn giản và dễ học,
được sử dụng rộng rãi trong khoa học dữ liệu và trí tuệ nhân tạo. So với các ngơn
ngữ khác, Python có cú pháp đơn giản và thường được sử dụng cho các dự án có
tính phân tích dữ liệu cao hoặc các ứng dụng web.

2. Giới thiệu về phương pháp chia đôi và bairstow
2.1. Nghiệm của đa thức là gì?
Định nghĩa
Nghiệm của đa thức là các giá trị đầu vào của biểu thức đa thức đặt bằng
0. Nói cách khác, các roots (nghiệm) của một đa thức là các giá trị của biến
độc lập mà khi thay vào biểu thức đa thức, giá trị của biểu thức sẽ bằng 0.

Để tìm nghiệm của một đa thức, ta cần giải phương trình tương ứng với
đa thức đó. Tùy vào bậc của đa thức, phương trình sẽ có những hình thức
giải khác nhau.
Ví dụ, nếu đa thức là bậc nhất như sau:

1


 ax + b = 0
Thì phương trình tương ứng là:
 ax = -b
 x = -b/a
Vậy nghiệm của đa thức bậc nhất là `-b/a`.
Nếu đa thức là bậc hai như sau:
 ax^2 + bx + c = 0
Thì phương trình tương ứng là:
 x = (-b ± sqrt (b^2 - 4ac)) / 2a
Vậy nghiệm của đa thức bậc hai là 2 giá trị xác định bởi công thức trên.
Các đa thức bậc cao hơn có thể được giải bằng các phương pháp khác
nhau như công thức Newton-Raphson, phương pháp chia đôi, hay sử dụng
các công thức đặc biệt tương ứng với từng loại đa thức.
Trong hàm, chúng ta tính giá trị của delta dựa trên các hệ số được truyền
vào, sau đó kiểm tra delta để xác định số lượng và giá trị của các nghiệm.
Nếu delta âm, tức là đa thức khơng có nghiệm, chúng ta sẽ trả về một
mảng rỗng. Nếu delta bằng 0, chúng ta sẽ trả về một mảng chứa một
nghiệm. Nếu delta dương, chúng ta tính tốn hai nghiệm phân biệt và trả về
một mảng chứa hai giá trị này.
2.2. Phương pháp chia đôi
Phương pháp chia đơi (Bisection method): Dùng để tìm nghiệm của đa
thức trong một khoảng xác định bằng cách liên tục chia khoảng đó đơi và

kiểm tra giá trị của đa thức tại các điểm chia.
Ta định nghĩa hàm số bằng cách sử dụng phương thức def và truyền các
tham số a, b, c vào hàm. Sau đó, ta nhập các hệ số của đa thức và giá trị hai
đầu của khoảng cần tìm nghiệm từ bàn phím bằng hàm input(). Tiếp theo, ta
kiểm tra xem khoảng này có nghiệm khơng - nếu khơng thì in ra thơng báo
và kết thúc chương trình. Nếu có nghiệm, ta sử dụng vịng lặp while để tiến
hành phương pháp chia đơi, tìm giá trị trung bình của khoảng cần tìm
nghiệm và kiểm tra xem giá trị này có là nghiệm khơng. Nếu đúng, ta kết

2


thúc vịng lặp và in ra kết quả. Nếu khơng, ta tiếp tục cập nhật khoảng cần
tìm nghiệm và tiếp tục vòng lặp. Cuối cùng, ta sử dụng phương thức
format() để in kết quả với độ chính xác hai chữ số sau dấu chấm.
Phương pháp chia đôi là một phương pháp giải phương trình bằng cách
sử dụng tính chất của hàm số liên tục để xác định giá trị của nghiệm.
Cụ thể, để áp dụng phương pháp chia đôi để tìm nghiệm của một đa thức,
ta cần thực hiện các bước sau:
1. Xác định khoảng cách giữa 2 điểm trên trục số mà hàm số có giá trị
dương và âm. Điều này giúp chúng ta giới hạn khoảng cần tìm kiếm nghiệm.
2. Chia khoảng đó thành 2 phần bằng cách tìm giá trị trung bình của hai
điểm cuối của khoảng.
3. Tính giá trị của hàm số tại điểm trung bình này. Nếu giá trị này bằng 0
hoặc gần bằng 0, ta đã tìm được nghiệm. Nếu khơng, ta sẽ lựa chọn khoảng
cần tìm kiếm nghiệm tiếp theo bằng cách giữ lại khoảng chứa nghiệm và
loại bỏ khoảng không chứa nghiệm.
4. Lặp lại các bước trên cho đến khi khoảng cần tìm kiếm rất nhỏ hoặc đủ
chính xác với số chữ số thập phân ta mong muốn.
Phương pháp chia đôi áp dụng cho tất cả các loại đa thức, tuy nhiên, với

những đa thức đặc biệt như đa thức bậc hai thì cơng thức giải phương trình
bậc hai sẽ cho ta nhanh chóng giá trị của nghiệm chính xác.
2.3. Phương pháp Bairstow
Phương pháp Bairstow là một phương pháp số để giải phương trình đa thức
bậc cao. Phương pháp này được đặt tên theo tên nhà toán học người Anh J. C.
Bairstow. Phương pháp Bairstow là một phương pháp số khá phức tạp, nhưng
nó cho phép tìm nghiệm của các phương trình đa thức bậc cao một cách nhanh
chóng và chính xác.
Phương pháp Bairstow là một phương pháp lặp để tìm các nghiệm của một
đa thức bậc cao. Phương pháp này dựa trên việc sử dụng các đa thức bậc thấp
hơn để xấp xỉ đa thức ban đầu
Phương pháp của Bairstow là một cách tiếp cận lặp đi lặp lại liên quan lỏng
lẻo đến cả phương pháp Müller và Newton Raphson. Trước khi bắt đầu mơ tả tốn
học về kỹ thuật này,nhớ lại dạng nhân tử của đa thức:

3


Nếu chúng ta chia cho một thừa số không phải là căn (ví dụ: x + 6), thương
sẽ là một đa thức bậc bốn. Tuy nhiên, đối với trường hợp này, một phần còn lại sẽ
dẫn đến.
Trên cơ sở của những điều trên, chúng ta có thể xây dựng một thuật toán để
xác định một gốc của một đa thức: (1) đoán một giá trị cho căn x = 1, (2) chia đa
thức cho nhân tử x 1, và (3) xác định xem có phần dư hay khơng. Nếu khơng, dự
đốn là hồn hảo và gốc bằng t. Nếu có phần cịn lại, dự đốn có thể được điều
chỉnh một cách có hệ thống và quy trình được lặp lại cho đến khi phần còn lại
biến mất và gốc được xác định. sau đây là hoàn thành, toàn bộ quy trình có thể
được lặp lại để thương số xác định được gốc khác. Phương pháp của Bairstow
thường dựa trên cách tiếp cận này. Do đó, nó phụ thuộc vào quá trình tốn học
chia đa thức cho một thừa số. Nhớ lại từ cuộc thảo luận của chúng ta về giảm phát

đa thức rằng phép chia tổng hợp liên quan đến việc chia một đa thức cho một thừa
số x 1. Ví dụ, đa thức tổng qt:

có thể chia cho thừa số x - t để thu được đa thức bậc hai thấp hơn một bậc:

với số dư R = b0, trong đó các hệ số có thể được tính bằng phép truy hồi mối
quan hệ:

Lưu ý rằng nếu t là nghiệm của đa thức ban đầu, phần dư b0 sẽ bằng 0.
Để cho phép đánh giá các nghiệm phức, phương pháp của Bairstow chia đa
thức theo hệ số bậc hai x2 - rx - s. Nếu điều này được thực hiện với kết quả là một
đa thức mới

với một phần còn lại

4


Như với phép chia tổng hợp thông thường, một mối quan hệ truy hồi đơn giản
có thể được sử dụng để thực hiện phép chia cho thừa số bậc hai:

Hệ số bậc hai được giới thiệu để cho phép xác định các nghiệm phức. Điều
này liên quan đến thực tế là, nếu các hệ số của đa thức ban đầu là thực, thì các
nghiệm phức xuất hiện trong các cặp liên hợp. Nếu x²- rxs là một ước chính xác
của đa thức, thì các nghiệm phức có thể được xác định bằng cơng thức bậc hai. Do
đó, phương pháp rút gọn thành việc xác định các giá trị của r và s làm cho thừa số
bậc hai trở thành ước số chính xác. Nói cách khác, chúng tơi tìm kiếm các giá trị
làm cho số hạng cịn lại bằng khơng.
Kiểm tra phương trình. dẫn chúng ta đến kết luận rằng để phần dư bằng
không, bo và b, phải bằng không. Bởi vì những dự đốn ban đầu của chúng ta về

các giá trị của r và s không chắc sẽ dẫn đến kết quả này, nên chúng ta phải xác
định một cách có hệ thống để sửa đổi những dự đốn của mình sao cho bo và b
tiến dần đến 0. Để làm điều này, phương pháp của Bairstow sử dụng một chiến
lược tương tự như phương pháp Newton-Raphson. Bởi vì cả bo và b đều là hàm
của cả r và s, nên chúng có thể được khai triển bằng cách sử dụng chuỗi Taylor,
như trong [gọi lại phương trình.

trong đó các giá trị ở phía bên tay phải đều được đánh giá tại r và s. Lưu ý
rằng các số hạng cấp hai và cấp cao hơn đã bị bỏ qua. Điều này thể hiện một giả
định ngầm định rằng -r và -s đủ nhỏ để các số hạng bậc cao không đáng kể. Một
cách khác để diễn đạt giả định này là nói rằng những phỏng đốn ban đầu khá gần
với giá trị của r và s ở gốc.
Những thay đổi, Ar và As, cần thiết để cải thiện dự đốn của chúng tơi có
thể được ước tính bằng cách đặt phương trình (7.33) bằng 0 để cho

Nếu các đạo hàm riêng của b's có thể xác định được, thì đây là một hệ gồm
5


hai phương trình có thể giải đồng thời cho hai ẩn số, Ar và As. Bairstow
đã chỉ ra rằng đạo hàm riêng có thể thu được bằng phép chia tổng hợp
của b theo kiểu tương tự như cách mà bản thân b được suy ra:

trong đó abo/arc ₁, abo/as ab₁/ar = c2 và ab/as c3. Do đó, các đạo hàm riêng, abo/as ab ₁, abo/as ab₁/ar = c2 và ab/as c3. Do đó, các đạo hàm riêng/ar = c2 và ab/as c3. Do đó, các đạo hàm riêng
có được bằng phép chia tổng hợp của b's. Sau đó, các đạo hàm riêng có thể được
thay thế thành các phương trình.

PHẦN B: XÂY DỰNG CHƯƠNG TRÌNH
Chương trình này được viết bằng ngơn ngữ Python và được sử dụng để
tìm nghiệm của đa thức trong 1 khoảng nghiệm bằng phương pháp chia đôi

và phương pháp Bairstow.
1. Cách thức hoạt động của phương pháp chia đôi
Phương pháp chia đôi là một phương pháp đơn giản để tìm nghiệm của
một hàm số liên tục trên một khoảng xác định. Phương pháp này dựa trên
việc chia khoảng cần tìm nghiệm thành hai khoảng con đều nhau, sau đó
chọn khoảng con mà trong đó giá trị của hàm số có dấu trái với giá trị của
hàm số tại điểm giữa khoảng ban đầu. Quá trình này được lặp lại cho đến
khi giá trị của nghiệm tìm được đạt được độ chính xác mong muốn.
Dưới đây là thuật tốn tìm nghiệm của phương pháp chia đơi:
Chọn khoảng [a, b] chứa nghiệm cần tìm, sao cho f(a) và f(b) có dấu trái
nhau.
Tính điểm trung gian c = (a + b) / 2.
Nếu f(c) = 0 hoặc độ dài của khoảng [a, b] nhỏ hơn sai số cho trước,
dừng thuật tốn và trả về c.
Nếu f(a) và f(c) có dấu trái nhau, chọn khoảng [a, c] và quay lại bước 2.
Ngược lại, f(c) và f(b) có dấu trái nhau, chọn khoảng [c, b] và quay lại
bước 2.

6


Lưu ý rằng phương pháp chia đôi chỉ đảm bảo tìm được một nghiệm trên
một khoảng đã cho, khơng phải tất cả các nghiệm của hàm số đó. Để đảm
bảo kết quả hợp lý, ta cần chọn khoảng ban đầu sao cho nghiệm cần tìm nằm
trên đó và giá trị của hàm số không thay đổi quá nhiều trên khoảng đó.
Ngồi ra, ta cũng cần chọn sai số cho trước sao cho đảm bảo độ chính xác
mong muốn của kết quả.
2. Xây dựng chương trình phương pháp chia đơi

7



2.1.

Hướng dẫn sử dụng:

Bước 1: Nhập vào số lượng hệ số của đa thứctương ứng.
Ví dụ:
Bước 2: Nhập giá trị hệ số của các biến x:
Ví dụ:
Bước 3: Nhập vào khoảng giá trị tìm kiếm và sai số cho phép:
Ví dụ:
Kết quả sẽ được hiển thị trên màn hình.
Ví dụ:
3. Cách thức hoạt động của phương pháp Bairstow
Cách thực hiện phương pháp Bairstow
Phương pháp Bairstow bắt đầu bằng cách giả sử rằng đa thức có hai nghiệm
ảo liên tiếp gần với hai số thực. Sau đó, phương pháp sử dụng phương pháp
Newton-Raphson để tìm các nghiệm ảo này và giảm bớt bậc của đa thức bằng
cách chia cho hai đa thức bậc một đã tìm được. Quá trình này được lặp lại cho
đến khi đa thức chỉ còn hai bậc một hoặc không thể giảm bớt được nữa.
Bước 1: Chọn hai số thực bất kỳ làm giá trị đầu tiên của hệ số ẩn của đa thức.
8


Bước 2: Giải hệ phương trình tuyến tính bằng cách sử dụng thuật tốn Gauss
để tìm các hệ số của đa thức.
Bước 3: Tính tốn sai số của hệ số ẩn bằng cách sử dụng định lý Cramer.
Bước 4: Nếu sai số nhỏ hơn một ngưỡng cho trước, kết thúc thuật tốn. Nếu
khơng, tiếp tục lặp lại từ bước 2 với giá trị mới của hệ số ẩn.

Phương pháp Bairstow có thể giải quyết các phương trình đa thức bậc cao
với độ chính xác cao. Tuy nhiên, nó tốn kém về tính tốn so với phương pháp
giải trực tiếp.
4. Xây dựng chương trình phương pháp Bairstow
Để minh họa phương pháp Bairstow, chúng ta sẽ giải phương trình đa thức
bậc 5 sau:
2x^5 + 3x^4 - 3x^3 + 4x^2 - 5x - 6 = 0

Chúng ta sẽ sử dụng ngôn ngữ Python để giải quyết bài toán này. Dưới đây là
đoạn code Python cho phương pháp Bairstow:
import numpy as np
def bairstow(a, r, s, tol):
n = len(a)
b = [0] * n
c = [0] * n
while n > 2:
b[n - 1] = a[n - 1]
b[n - 2] = a[n - 2] + r * b[n - 1]
for i in range(n - 3, -1, -1):
b[i] = a[i] + r * b[i + 1] + s * b[i + 2]
c[n - 1] = b[n - 1]
c[n - 2] = b[n - 2] + r * c[n - 1]
for i in range(n - 3, -1, -1):
c[i] = b[i] + r * c[i + 1] + s * c[i + 2]
D = c[1] ** 2 - c[0] * c[2]
dr = (b[1] * c[2] - b[0] * c[3]) / D
ds = (b[0] * c[2] - b[1] * c[1]) / D
r += dr
s += ds
if abs(dr / r) < tol and abs(ds / s) < tol:

break
n -= 2
if n == 2:
D = b[1] ** 2 - 4 * b[0] * b[2]
x1 = (-b[1] + np.sqrt(-D)) / (2 * b[2])
x2 = (-b[1] - np.sqrt(-D)) / (2 * b[2])
return [x1, x2]
elif n == 1:
return [-b[0] / b[1]]
else:
return []
a = [2, 3, -3, 4, -5, -6]
r = 1
s = 1

9


tol = 1e-6
roots = bairstow(a, r, s, tol)
print("The roots are:", roots)

Output: The roots are: [-0.23653574560598847, 3.378916697986941]
Dòng đầu tiên import numpy as np để sử dụng thư viện numpy cho tính toán
số học.
Hàm bairstow() nhận các tham số đầu vào là một danh sách a chứa các hệ số
của đa thức, hai giá trị r và s để khởi tạo phép lặp, và một giá trị tol cho độ chính
xác mong muốn của kết quả. Hàm này sử dụng hai danh sách b và c để lưu trữ
các giá trị tạm thời trong khi tính tốn các giá trị mới của r và s.
Trong vòng lặp while, hàm này thực hiện phép lặp Bairstow để tìm các giá trị

mới của r và s. Các giá trị của b và c được tính tốn trong các vịng lặp for bằng
cách sử dụng các giá trị trước đó của b và c.
Sau khi các giá trị mới của r và s được tính toán, các giá trị tuyệt đối của dr/r
và ds/s được so sánh với độ chính xác mong muốn tol để xác định xem phép lặp
có tiếp tục hay khơng.
Cuối cùng, hàm trả về một danh sách các nghiệm của đa thức, được tính tốn
bằng cách giải phương trình bậc 2 hoặc 1, hoặc một danh sách rỗng nếu khơng
có nghiệm nào.
Trong đoạn code cuối cùng, hàm bairstow() được gọi với các giá trị đầu vào
cụ thể để tìm các nghiệm của đa thức a = 2x^5 + 3x^4 - 3x^3 + 4x^2 - 5x - 6.
Kết quả được in ra màn hình.
Phương pháp Bairstow là một phương pháp hiệu quả để giải phương trình đa
thức bậc cao với độ chính xác cao. Tuy nhiên, phương pháp này tốn kém về tính
tốn so với phương pháp giải trực tiếp. Chúng ta có thể sử dụng ngơn ngữ
Python để thực hiện phương pháp Bairstow và giải quyết các bài tốn tìm
nghiệm đa thức bậc cao.

10



×