Định lí Taylor cho ta một đa thức xấp xỉ một hàm khả vi tại một điểm cho trước (gọi là đa thức Taylor của hàm đó) có hệ số chỉ phụ thuộc vào các giá trị của đạo hàm tại điểm đó. Định lí còn cho ta một đánh giá chính xác sai số của xấp x.
Trong bài này, chúng ta sẽ tính giá trị của e và ex theo khai triển Taylor-Maclaurin. Trước hết, ta xem khai triển của e và ex:
Rõ ràng, công thức thứ nhất chính là công thức thứ 2 trong trường hợp x = 1. Đối với 2 bài toán này, ta sẽ thực hiện tính giá trị xấp xỉ trong trường hợp
Rõ ràng, công thức thứ nhất chính là công thức thứ 2 trong trường hợp x = 1. Đối với 2 bài toán này, ta sẽ thực hiện tính giá trị xấp xỉ trong trường hợp
- Cho trường n và tính giá trị xấp xỉ.
- Cho trước sai số ε và tính giá trị của biểu thức với sai số trên.
Nào, ta đi giải quyết bài toán nhé.
Tìm giá trị xấp xỉ của e
Phân tích bài toán
Công thức tính giá trị xấp xỉ của e trông có vẻ rất đơn giản. Từ số hạng thứ hai trở đi, các số hạng luôn có dạng là 1/k! (! là ký hiệu giai thừa nhé (n! = 1*2*3*...*n)). Như vậy, suy nghĩ rất đơn giản đặt ra là ta có thể viết một hàm để tính giai thừa rồi lấy 1 chia cho giá trị của hàm đó. Nghe có vẻ hợp lý, nhưng từ công thức tính giai thừa ta thấy giá trị của biểu thức giai thừa tăng rất nhanh, chẳng mấy mà máy tính bị tràn số, hơn nữa, mẫu số của biểu thức được tính bằng mẫu số của biểu thức trước nhân với một số nguyên (chỉ số). Do đó, nếu sử dụng hàm giai thừa ta sẽ phải tính đi tính lại rất nhiều lân.
Quan sát kỹ hơn, ta thấy, trừ hai số hạng đầu tiên, các số hạng còn lại thì số hạng sau luôn có mẫu số bằng mẫu số của số hạng trước nhân thêm một chỉ số. Ta thấy, số hạng trước là 1/k! thì số hạng ngay phía sau sẽ là 1/(k+1)!. Tức là số hàng trước là 1/(1*2*3*...*k) thì số hạng sau sẽ là 1/(1*2*3*...*k*(k+1)). Như thế, nếu ta đặt biểu thức trước là t = 1 / (1*2*3*..*k) thì biểu thức sau sẽ có giá trị là t/(k+1). Như vậy, để tính được biểu thức phía sau ta chỉ cần thực hiện duy nhất một phép chia.
Nếu ta đặt tổng của khai triển là s ta sẽ khởi tạo s = 1 (đối với công thức tổng quát ta thường gán s = x0). Ta tạo một biến tạm thời t để lần lượt tính các số hạng trong tổng (ta khởi tạo t=1).
Theo số vòng lặp n
Với số vòng lặp cho trước là n. Ta chỉ cần sử dụng một vòng lặp for với chỉ số i chạy từ 1 (Tại sao lại là từ 1 mà không phải là từ 0 hay giá trị khác? Tại vì, giá trị của biểu thức đầu tiên có dạng 1/i!, tuy ta biết rằng 0! = 1 nhưng đấy là toán học, còn máy tính không hiểu mà chỉ hiểu n! = 1*2*3*...*n như vậy n >= 1). Đoạn mã chương trình chỉ đơn giản như sau:
Rất đơn giản đúng không? Trong vòng lặp ta chỉ cần tính số hạng tiếp theo và cộng giá trị của số hạng đó vào trong tổng là được. Lưu ý, bạn nên nhập số lượng vòng lặp đủ lớn (≥10) để có kết quả chính xác.
Theo sai số ε
Với một sai số cho trước ε, ta chỉ cần tính các số hạng có giá trị lớn hơn hoặc bằng ε mà thôi. Rõ ràng, các số hạng càng ở bên phải biểu thức càng có giá trị nhỏ. Do vậy, ta chỉ cần tìm được một số hạng nhỏ hơn ε là kết thúc vòng lặp. Rõ ràng, chúng ta không biết cần phải tính bao nhiều vòng lặp nên ta sẽ sử dụng vòng lặp while ở đây. Với điều kiện chừng nào giá trị của số hạng (t) vẫn còn lớn hơn ε thì ta còn tiếp tục tính.
Lưu ý, vì vòng lặp while không có chỉ số như vòng lặp for vì vậy ta sẽ khởi tạo thêm một biến i nữa. Trong mỗi vòng lặp, ta sẽ tăng giá trị của biến i thêm một đơn vị (i = i + 1).
Đoạn code của chương trình như sau:
Như vậy, về căn bản vẫn không khác đối với cách tính theo số vòng lặp, chỉ có điều kiện lặp là thay đổi.
Tìm giá trị xấp xỉ của ex
Phân tích bài toán
So sánh công thức tính giá trị xấp xỉ của ex với công thức tính xấp xỉ của e. Ta thấy có khác biệt ở phần tử số của mỗi số hạn. Ở công thức, ta có thể viết lại số hạng thứ là là x = x0/1!. Và ta cũng thấy ngay quy luật là từ số hạng thứ ba trở đi, số hạng phía trước là t thì số hạng phía sau sẽ là t*x/i. Ví dụ, x3/3! = x2*x/(2!*3). Như vậy, với quy luật như trên, sau mỗi bước lặp thì thay vì chia cho i (hay nói cách khác là nhân với 1/i) thì ta sẽ nhân với x/i.
Theo số vòng lặp n
Tương tự như ví dụ trên, số vòng lặp là n bắt đầu từ 1. Vì biết trước số lần lặp nên ta sử dụng vòng lặp for. Và khởi tạo s = 1 và t = 1. Code của chương trình như sau:
Đọan code ở trên so với đoạn code ở phần tính giá trị của e với số lần lặp là n rõ ràng không khác nhau là mấy. Chỉ có một chi tiết khác nhau duy nhất là tính giá trị t cho bước lặp tiếp theo mà thôi.
Theo sai số ε
Tương tự như cách tính của ví dụ trước với sai số ε. Ta chỉ cần thay đổi cách tính giá trị của mỗi số hạng ở từng vòng lặp là sẽ giải quyết được vấn đề ngay lập tức. Code chi tiết như sau:
Kết luận
Trên đây là hai ví dụ (coi là 1 cũng được) đơn giản nhất. Bạn có thể xem code chi tiết tại đây. Tại đây có rất nhiều khai triển Taylor-Maclaurin để cho bạn làm bài tập ở nhà nhé. Lưu ý, một số khai triển chỉ áp dụng với x thuộc một khoảng nào đó thô. Và khi chạy chương trình, với số vòng lặp thì chọn đủ lớn còn với sai số thì chọn đủ nhỏ nhé.
1/(1*2*2*...*k*(k+1)) : một lỗi typo nhỏ.
Trả lờiXóaĐã sửa, thanks @vnese
Trả lờiXóa