Tính


13

Hàm có số ít gần . Điểm kỳ dị đó có thể được nâng lên, mặc dù: với , người ta nên có , vì Và do đó Tuy nhiên, hình thức không chỉ không được xác định tại , nó cũng không ổn định về số lượng trong vùng lân cận của điểm đó; để đánh giá cho số lượng rất nhỏ , người ta có thể sử dụng khai triển Taylor, tức là cắt ngắn chuỗi lũy thừa đã đề cập ở trên.x = 0 x = 1 f ( x ) = 1 e x = k = 0 x kf:x(ex-1)/xx= =0x= =1f(x)= =1(ex-1)/x=k=1x k - 1

ex= =Σk= =0xkk!
(ex-1)/xx=0f(x)x
(ex-1)/x= =Σk= =1xk-1k!
(ex-1)/xx= =0f(x)x

Q : Hàm có tên không? Nói cách khác, đây có phải là một vấn đề phổ biến?f

Hỏi : Có ai biết thư viện C / C ++ xử lý tình huống này một cách độc đáo không, tức là sử dụng khai triển Taylor ở mức độ thích hợp gần 0 và đại diện khác cách xa 0?

Câu trả lời:


19

Có thể người ta có thể bắt đầu với hàm , một phần của tiêu chuẩn C99 và tính toán chính xác e x - 1 gần x = 0 .expm1ex-1x= =0


17

Đây là một ví dụ về lỗi hủy bỏ. Thư viện chuẩn C (kể từ C99) bao gồm một hàm được gọi là expm1tránh vấn đề này. Nếu bạn sử dụng expm1(x) / xthay vì (exp(x) - 1.0) / x, bạn sẽ không gặp phải vấn đề này (xem biểu đồ bên dưới). <code> fabs (expm1 (x) / x - (exp (x) - 1.0) / x) </ code>

Các chi tiết và giải pháp của vấn đề cụ thể này được thảo luận rất dài trong Phần 1.14.1 về Độ chính xác và Tính ổn định của Thuật toán Số . Giải pháp tương tự cũng được giải thích trong trang 19 của bài viết của W. Kahan có tiêu đề Đánh giá vô ích về tính tròn trịa trong tính toán điểm nổi như thế nào? . Việc triển khai thực tế expm1trong thư viện GNU C khác với cách tiếp cận được mô tả trong các tài liệu tham khảo ở trên và được ghi lại kỹ lưỡng trong mã nguồn .


1
Cảm ơn bạn, đó chỉ là những gì tôi cần! Thật không may, tôi chỉ có thể chấp nhận một câu trả lời ...
nặc danh

Tất nhiên! Không có vấn đề gì :-)
Juan M. Bello-Rivas

3

Để trả lời câu hỏi đầu tiên của bạn, không, hàm không có tên (ít nhất không phải là tên được biết đến rộng rãi).

Như những người khác đã đề cập, cách tốt nhất để tính toán hàm là xử lý một số trường hợp đặc biệt. Đây là cách bất kỳ thư viện sẽ tính toán hàm.

  1. Trường hợp 0: x = 0, trả về 1.
  2. |x|<δ1+x/2δdouble2e-85e-4
  3. Trường hợp khác: trả lại expm1(x)/x.

Bạn có thể tinh vi hơn và trường hợp đặc biệt nhiều thứ hơn với loạt Taylor bị cắt cụt, nhưng có lẽ nó không đáng. Trên thực tế, không hoàn toàn rõ ràng rằng trường hợp 1 cần phải được xử lý riêng, vì như k20 đã chỉ ra, việc hủy bỏ là an toàn. Tuy nhiên, xử lý nó một cách riêng biệt sẽ cho tôi cảm thấy tự tin hơn về nó.


2

Tôi nhớ câu hỏi này đã được hỏi trước đó trên trang web này, và đáng ngạc nhiên là câu trả lời là bạn chỉ cần bình đẳng chính xác trong trường hợp đặc biệt bằng không. Các lỗi hủy bỏ gần bằng không. Tôi không có liên kết.

Vâng câu trả lời này là hoàn toàn sai. Tôi không chắc tại sao nó lại được nâng cấp nhiều như vậy, có lẽ bởi vì nó được tuyên bố rất có thẩm quyền. Tôi tìm thấy liên kết tôi có trong tâm trí. Đó là trên stackexchange toán học ở đây , không phải trên stackexchange scicomp. Công expm1thức loại bỏ lỗi miễn phí được đưa ra trong câu trả lời của JM và sử dụng một u = exp(x)phép biến đổi.


xdx(edx-1)/dx(1+dx-1)/dx1

1
dx1+dx= =1

0

Để trả lời câu hỏi đầu tiên và cung cấp phương thức (có thể là không hiệu quả về số) cho câu hỏi thứ hai, lưu ý rằng đây là nghịch đảo của hàm tạo số Bernoulli .


Đó là một kết nối thú vị, cảm ơn vì đã chỉ ra điều đó. Thật không may, tôi tin rằng số tiền gấp ba sẽ khiến điều này trở nên đắt đỏ. Ngoài ra, không rõ ngay lập tức cắt ngắn từng khoản tiền để đạt được độ chính xác mong muốn.
ẩn danh

@anonymous: Ý bạn là gì? Bạn không cần các đa thức Bernoulli, chỉ các số Bernoulli và bạn có thể liệt kê trước các số đó. Nhưng vâng, nó vẫn không tốt hơn loạt Taylor.
Nikolaj-K

Tuy nhiên, bạn có thể tính toán những thứ đó nếu rõ ràng rằng bạn chỉ cần một số hữu hạn cố định cho bất kỳ đầu vào nào.
ẩn danh

@anonymous: Vâng vâng, giống như bạn liệt kê các hệ số Taylor trước.
Nikolaj-K
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.