1. Trang chủ
  2. » Luận Văn - Báo Cáo

Phần A: GIẢI THUẬT MÜLLERS METHOD

14 2 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Phương pháp Muller là một thuật toán tìm nghiệm cho việc tìm nghiệm của một phương trình dạng f(x) = 0. Nó được khám phá bởi David E. Muller vào năm 1956. Thuật toán bắt đầu bằng ba ước đoán ban đầu về nghiệm, sau đó xây dựng một đường parabol thông qua ba điểm này và lấy giao điểm của trục x với đường parabol làm ước tính tiếp theo. Quá trình này tiếp tục cho đến khi tìm thấy một nghiệm với độ chính xác mong muốn. Phương pháp Muller là một trong những phương pháp tìm nghiệm cùng với các phương pháp khác như Phương pháp Chia đôi, Phương pháp Regula Falsi, Phương pháp Tiếp tuyến và Phương pháp Newton Raphson. Nhưng nó cung cấp một số lợi ích so với các phương pháp này, như sau: Tốc độ hội tụ, tức là khoảng cách chúng ta di chuyển gần hơn đến nghiệm ở mỗi bước, là khoảng 1,84 ở Phương pháp Muller, trong khi nó là 1,62 cho phương pháp Tiếp tuyến và là tuyến tính, tức là 1 cho cả Phương pháp Regula falsi và Phương pháp Chia đôi. Do đó, Phương pháp Muller nhanh hơn so với Phương pháp Chia đôi, Regula Falsi và Phương pháp Tiếp tuyến.

TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP VIỆT - HUNG KHOA CÔNG NGHỆ THÔNG TIN … o0o… BÁO CÁO KẾT THÚC HỌC PHẦN LINUX VÀ PHẦN MỀM MÃ NGUỒN MỞ Giảng viên hướng dẫn : Ths.Hà Đăng Tồn Nhóm sinh viên thực : Nguyễn Khắc Mạnh : Phùng Quang Huy Lớp : K43CNT2 * Hà Nội - Năm 2023 MỤC LỤC Phần A: GIẢI THUẬT MÜLLER'S METHOD 1.1 Müller's method 1.2 Tài liệu Müller's method 1.3 Mã giả 1.4 Kết đạt .6 1.4.1 Mã nguồn chương trình .6 1.4.2 Chương trình chạy kiểm thử DANH MỤC TÀI LIỆU THAM KHẢO NHẬN XÉT KÍ HIỆU CÁC CỤM TỪ VIẾT TẮT OS Operating System Phần A: GIẢI THUẬT MÜLLER'S METHOD A.1 Müller's method Phương pháp Muller thuật tốn tìm nghiệm cho việc tìm nghiệm phương trình dạng f(x) = Nó khám phá David E Muller vào năm 1956 Thuật toán bắt đầu ba ước đốn ban đầu nghiệm, sau xây dựng đường parabol thông qua ba điểm lấy giao điểm trục x với đường parabol làm ước tính Q trình tiếp tục tìm thấy nghiệm với độ xác mong muốn Phương pháp Muller phương pháp tìm nghiệm với phương pháp khác Phương pháp Chia đôi, Phương pháp Regula - Falsi, Phương pháp Tiếp tuyến Phương pháp Newton - Raphson Nhưng cung cấp số lợi ích so với phương pháp này, sau: Tốc độ hội tụ, tức khoảng cách di chuyển gần đến nghiệm bước, khoảng 1,84 Phương pháp Muller, 1,62 cho phương pháp Tiếp tuyến tuyến tính, tức cho Phương pháp Regula - falsi Phương pháp Chia đôi Do đó, Phương pháp Muller nhanh so với Phương pháp Chia đôi, Regula - Falsi Phương pháp Tiếp tuyến Mặc dù vậy, chậm Phương pháp Newton - Raphson, có tốc độ hội tụ 2, vượt qua điểm hạn chế lớn Phương pháp NewtonRaphson, tính đạo hàm bước A.2 Tài liệu Müller's method Nhắc lại phương pháp secant (tangent tiếp tuyến) tìm ước lượng nghiệm cách vẽ đường thẳng nối hai giá trị hàm số hai điểm trục hồnh (Hình 7.3a) Phương pháp Müller tương tự thay dùng đường thẳng, sử dụng đường parabol qua ba điểm (Hình 7.3b) Phương pháp bao gồm việc tìm hệ số đường parabol qua ba điểm Sau đó, hệ số thay vào cơng thức bậc hai để tìm điểm mà đường parabol cắt trục hồnh - ước lượng nghiệm Phương pháp dễ dàng viết phương trình đường parabol dạng thuận tiện f ( x ) a ( x  x2 )  b( x  x2 )  c Chúng ta muốn đường parabol cắt qua ba điểm [x0, f(x0)], [x1, f(x1)], [x2, f(x2)] Hệ số phương trình (7.17) tính cách thay điểm số ba điểm để f ( x0 ) a ( x0  x2 )2  b ( x0  x2 )  c f ( x1 ) a ( x1  x2 )  b( x1  x2 )  c f ( x2 ) a ( x2  x2 )2  b ( x2  x2 )  c Lưu ý bỏ số “2” hàm số để gọn Vì có ba phương trình, nên giải cho ba hệ số khơng biết a, b, c Vì hai số thuật ngữ phương trình (7.20) khơng, giải để tìm c  f ( x2 ) Do đó, hệ số c đơn giản giá trị hàm số điểm thử thứ ba, x2 Kết sau thay vào phương trình (7.18) (7.19) để thu hai phương trình với hai hệ số khơng biết: f ( x0 )  f ( x2 ) a( x0  x2 )  b( x0  x2 ) f ( x1 )  f ( x2 ) a ( x1  x2 )  b( x1  x2 ) Sau đó, ta sử dụng phép biến đổi đại số để giải cho hệ số lại, a b Một cách để làm điều định nghĩa số hiệu khác nhau, h0 x1  x0 0  h1  x2  x1 f ( x1 )  f ( x0 ) x1  x0 1  f ( x2 )  f ( x1 ) x2  x1 Sau đó, thay hiệu vào phương trình (7.21) (7.22) để được:  h0  h1  b   h0  h1  h1b  h 21 a h11 a h0  h11 Từ đó, ta giải phương trình để tìm a b Kết tóm tắt sau: 1   h1  h0 b ah1  1 a c  f  x2  Để tìm nghiệm, áp dụng cơng thức bậc hai cho phương trình (7.17) Tuy nhiên, lỗi làm trịn xảy ra, thay sử dụng dạng thông thường, sử dụng công thức thay [phương trình (3.13)] để được: x3  x2   2c b  b  4ac Hoặc cô lập x3 khơng xác định phía trái dấu bằng, ta được: x3 x2   2c b  b  4ac Lưu ý việc sử dụng công thức bậc hai có nghĩa tìm nghiệm thực phức Điều lợi ích lớn phương pháp Ngồi ra, Phương trình (7.27a) cung cấp phương pháp gọn nhẹ để xác định sai số xấp xỉ Bởi phía trái đại diện cho khác biệt ước tính nghiệm (x 3) trước (x2), nên sai số tính tốn sau a  x3  x2 100% x3 Một vấn đề với Phương trình (7.27a) cho hai nghiệm, tương ứng với dấu mẫu số Trong phương pháp Müller, chọn dấu phù hợp với dấu b Lựa chọn dẫn đến mẫu số lớn đó, cho ước tính nghiệm gần với x Sau xác định x3, trình lặp lại Điều đưa vấn đề việc bỏ điểm Hai chiến lược chung thường sử dụng: Nếu tìm nghiệm thực, chọn hai điểm ban đầu gần với ước tính nghiệm mới, x3 Nếu nghiệm thực phức đánh giá, phương pháp tuần tự áp dụng Tức là, giống phương pháp tiếp tuyến, x 1, x2, x3 thay cho x0, x1, x2 A.3 Mã giả SUB Muller(xr, h, eps, maxit) x2 xr x1 xr h*xr x0 xr h*xr DO iter iter 1 h0 x1 x0 h1 x2 x1 d0 (f(x1) f(x0)) / h0 d1 (f(x2) f(x1)) / h1 a (d1 d0) / (h1 h0) b a*h1 d1 c f(x2) rad SQRT(b*b 4*a*c) If |b1rad| |b2rad| THEN den b rad ELSE den b rad END IF dxr 22*c y den xr x2 dxr PRINT iter, xr IF (|dxr| , eps*xr OR iter maxit) EXIT x0 x1 x1 x2 x2 xr END DO END Müller Đây đoạn mã (code) ngơn ngữ lập trình khơng rõ ràng ràng định dạng, nhiên hiểu thuật toán Muller's Method triển khai hàm `SUB Muller(xr, h, eps, maxit)`: Đầu vào: `xr` giá trị ban đầu, `h` khoảng cách `xr` `x1`, `eps` độ lỗi mong muốn, `maxit` giới hạn số lần lặp Ở đoạn lệnh tiếp theo, thuật toán lặp lại đạt độ xác mong muốn đạt giới hạn số lần lặp xác định trước: Trong trình lặp lại, thuật tốn lần lượt tính giá trị `h0, h1, d0, d1, a, b, c` để xác định hệ số đa thức bậc hai tương ứng Lặp lại đoạn lệnh đủ độ xác, thuật tốn tính tốn nghiệm gần in kết sau lần lặp Ngoài ra, giá trị `x0, x1, x2` cập nhật q trình lặp lại để tính toán giá trị Cuối cùng, thuật toán trả giá trị `xr` - nghiệm gần phương trình f(x) = A.4 Kết đạt A.4.1 Mã nguồn chương trình Đây đoạn mã Python triển khai thuật toán Muller's Method để giải phương trình phi tuyến Bên giải thích chi tiết phần đoạn code này: Dòng đầu tiên khai báo thư viện math kiểu trả Tuple import math from typing import Tuple Hàm `f(x)` định nghĩa để tính giá trị hàm số f(x) Trong đoạn code này, hàm `f(x)` lựa chọn `f(x)= x^3 - 13x - 12` def f(x): return (x**3 - 13 * x - 12) Hàm `muller(xr, h, eps, maxit)` triển khai theo thuật toán Muller's Method để giải phương trình phi tuyến Các tham số đầu vào cho hàm bao gồm:  `xr`: giá trị đầu vào để bắt đầu thuật toán  `h`: khoảng cách `x2` `x1`  `eps`: độ lỗi mong muốn  `maxit`: số lần lặp tối đa def muller(xr: float, h: float, eps: float, maxit: int) -> Tuple[float, int]: Các biến cần thiết khởi tạo: a `x0`, `x1`, `x2` giá trị `xr` ban đầu với khoảng cách `h` b `iter` biến đếm số vòng lặp x0 = xr - h * xr x1 = xr + h * xr x2 = xr iter = Lặp lại việc tính tốn giá trị `xr` đến đạt độ xác cần thiết đến số lần lặp vòng lặp đạt giới hạn tối đa print(iter, xr) while True: iter += # tính giá trị cần thiết h0 = x1 - x0 h1 = x2 - x1 d0 = (f(x1) - f(x0)) / h0 d1 = (f(x2) - f(x1)) / h1 a = (d1 - d0) / (h1 + h0) b = a * h1 + d1 c = f(x2) rad = math.sqrt(b ** - * a * c) if abs(b + rad) > abs(b - rad): den = b + rad else: den = b - rad dxr = -2 * c / den xr = x2 + dxr print(iter, xr) if abs(dxr) < eps * xr or iter >= maxit: break x0 = x1 x1 = x2 x2 = xr a Các biến `h0`, `h1`, `d0`, `d1`, `a`, `b`, `c` tính để xác định nghiệm gần cho `xr` b Giá trị `xr` đưa với công thức Muller's method c Kiểm tra điều kiện kết thúc thuật toán Nếu tốc độ hội tụ `xr` đủ xác số lần lặp vượt tối đa, thuật toán dừng d Biến `x0`, `x1`, `x2` cập nhật để chuẩn bị cho vòng lặp Cuối cùng, tham số cần thiết truyền vào hàm `muller()`, hàm gọi để thực thi thuật toán h=1 xr = eps = 0.0001 imax = 100 muller(xr, h, eps, imax) Khi thực thi, đoạn mã tính tốn in giá trị `xr` vòng lặp hội tụ với độ lỗi mong muốn đạt số lần lặp tối đa gần A.4.2 Chương trình chạy kiểm thử DANH MỤC TÀI LIỆU THAM KHẢO https://atozmath.com/example/CONM/Bisection.aspx?q=mu https://www.python.org/ Giáo trình Numerical Methods for Engineers NHẬN XÉT ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… ………………………………………………………………………………………… …………………………

Ngày đăng: 08/08/2023, 12:23

Xem thêm:

w