Giúp chuyển bảng dữ liệu (x>0) thành bảng dữ liệu mới sau khi Loga nê pe các phần tử!

Liên hệ QC

Thư Sinh Áo Trắng

Thành viên hoạt động
Tham gia
26/3/21
Bài viết
160
Được thích
31
loganepe.jpg
Giúp em code VBA bài này với các bác!
 

File đính kèm

  • loganepe.xlsm
    10.4 KB · Đọc: 6
Theo tôi, là For lặp ít quá. Tôi cho
For k = 1 To 999999999 Step 2
và in k sau khi vòng For thì k=740457257
và KQ khác nhau không quá 10^-7
Với vòng lặp lớn tốc độ rất chậm, vấn đề quan trong hơn là không khống chế được sai số ví dụ sai số cho phép là 10^-8 thì tới lúc nào thỏa và dừng code?
 
Upvote 0
Các hàm triển khai Taylor là công thức gần đúng nên có sai số, nhiều khi khá lớn. Ví dụ
View attachment 260450
Đó là lý do có tới 3 công thức, dùng công thức nào phải hiểu nguồn gốc của nó
Theo tôi, là For lặp ít quá. Tôi cho
For k = 1 To 999999999 Step 2
và in k sau khi vòng For thì k=740457257
và KQ khác nhau không quá 10^-7
Nguồn gốc thì dễ hiểu thôi. Cái lỗi là phải tính sai số theo công thức chứ không phải theo một số hạng nào đó của khai triển. Cái lỗi này không chỉ ở bài #14 mà còn ở bài #12.

Công thức dùng trong bài đúng với mọi x > 0. Vấn đề nằm ở chỗ tính bao nhiêu số hạng thì dừng. Lỗi code là không tính sai số theo công thức mà lại dùng số hạng n làm sai số.

Thực ra sai số được tính theo công thức, và chỉ ngừng tính khi sai số nhỏ hơn cho phép. Không thể có số hạng nào đó nhỏ hơn sai số cho phép thì khẳng định rằng sai số được chứng minh bằng công thức cũng nhỏ hơn sai số cho phép.

Sai số R(n) = f(n)(c)*(x-x0)^n/n!

Trong đó f(n)(c) là giá trị đạo hàm bậc n tại điểm c, với c nằm trong khoảng [x0;x].

Nếu tính điểm dừng dựa vào công thức sai số thì điểm dừng sẽ nằm ở rất xa. Khi đó với k rất lớn như ở bài của bạn haog thì độ chính xác sẽ lớn.
 
Upvote 0
Vì ví dụ của HieuCD sai đến 8 đơn vị nên phải kiểm tra thuật toán. Vì dùng For nên chưa thỏa điều kiện số hạng tổng quát < số epxilon đã chọn (0.00.......0) đã lặp xong 1000 lần, nên tôi sửa để nó lặp thêm nhiều hơn. Thế thôi. CT chạy cũng nhanh lắm. Tất nhiên tôi phải thử thay 1000 bằng 10000, rồi 100000... đến khi in k thấy nó < cận cuối của For (là số sau To của For)

Còn đây không là chuỗi đan dấu, mà là chuỗi dương nên điều kiện kết thúc tính toán chính như Batman1 viết:
R(n) = f(n)(c)*(x-x0)^n/n!

Nhưng mà chúng ta đang xa rời chủ đề của mục này rồi. Cảm ơn mọi người.
 
Upvote 0
Nguồn gốc thì dễ hiểu thôi. Cái lỗi là phải tính sai số theo công thức chứ không phải theo một số hạng nào đó của khai triển. Cái lỗi này không chỉ ở bài #14 mà còn ở bài #12.

Công thức dùng trong bài đúng với mọi x > 0. Vấn đề nằm ở chỗ tính bao nhiêu số hạng thì dừng. Lỗi code là không tính sai số theo công thức mà lại dùng số hạng n làm sai số.

Thực ra sai số được tính theo công thức, và chỉ ngừng tính khi sai số nhỏ hơn cho phép. Không thể có số hạng nào đó nhỏ hơn sai số cho phép thì khẳng định rằng sai số được chứng minh bằng công thức cũng nhỏ hơn sai số cho phép.

Sai số R(n) = f(n)(c)*(x-x0)^n/n!

Trong đó f(n)(c) là giá trị đạo hàm bậc n tại điểm c, với c nằm trong khoảng [x0;x].

Nếu tính điểm dừng dựa vào công thức sai số thì điểm dừng sẽ nằm ở rất xa. Khi đó với k rất lớn như ở bài của bạn haog thì độ chính xác sẽ lớn.
Khi dùng dãy số rời rạc tính một hàm nào đó thường kèm theo công thức xác định sai số, dãy rời rạc khác nhau sẽ có công thức tính sai số khác nhau và công thức nầy phải tính được, chưa hình dung nguồn gốc và cách tính Sai số R(n) = f(n)(c)*(x-x0)^n/n! như thế nào
Nếu chỉ án chừng For k = 1 To 999999999 Step 2 như bạn haog cũng không chuẩn vì còn lệ thuộc vào giá trị cần tính log, với con số khá lớn như trong thiên văn học mình e rằng sai số sẽ tăng nhiều
Phương pháp nhị phân kiểm soát được sai số và số vòng lặp thấp hơn nhiều, lũy thừa chỉ là phép nhân nhiều lần
 
Upvote 0
hùi rài hay đọc các bài viết về số e , mình thấy nó là 1 con số rất là khó , không hiểu cách người ta xây dựng công thức để tính toán với nó thế nào nhỉ , hoặc bản thân số e đã có 1 quy luật tính toán sẵn rồi , trước đi học cứ ráp công thức là xong , mặc dù mình ko giỏi toán lém @@
 
Upvote 0
Sai số R(n) = f(n)(c)*(x-x0)^n/n! như thế nào
Khi học về định lý, công thức, khai triển Taylor thầy và sách có đưa ra mà. Tất nhiên người ta phải chứng minh được thì mới đưa ra.

Phương pháp nhị phân kiểm soát được sai số và số vòng lặp thấp hơn nhiều
Thực ra rỗi hơi thì làm tiêu khiển thôi. Nếu bạn muốn bạn có thể tự viết từ A đến Z rồi đưa lên cho những ai cần mà. Tôi không cần. Còn người khác có thể có người chưa chắc viết được code trên cơ sở vài từ chung chung của bạn. Muốn thì làm từ A đến Z rồi đưa lên thôi.
--------------
Chẳng qua là thử viết code cho khai triển Taylor mà bác VetMini đưa ra ở bài #8 thôi. Tôi không bàn về các thuật toán có thể có. Càng không phán thuật toán nào tối ưu.
 
Lần chỉnh sửa cuối:
Upvote 0
Các hàm triển khai Taylor là công thức gần đúng nên có sai số, nhiều khi khá lớn. Ví dụ
View attachment 260450
Đó là lý do có tới 3 công thức, dùng công thức nào phải hiểu nguồn gốc của nó
Theo bạn nghĩ thì chính máy tính (và/hoặc các ứng dụng) làm cách nào để tính các hàm như Log, hàm lượng giác?

Trả lời luôn: máy tính dùng CORDIC (COordinate Rotation DIgital Computer), hoặc đa thức Cherbyshev, hoặc máy xưa thì dùng chuỗi Taylor.
 
Upvote 0
Web KT
Back
Top Bottom