Làm thế nào để tránh sự hủy diệt thảm khốc trong chức năng python?


13

Tôi gặp khó khăn khi thực hiện một chức năng số. Thực tế là ở các giá trị đầu vào lớn, kết quả là một số rất lớn nhân với một số rất nhỏ. Tôi không chắc chắn nếu hủy bỏ thảm khốc là thuật ngữ chính xác vì vậy xin vui lòng sửa cho tôi nếu nó là. Bằng chứng về một cái gì đó sẽ đi lạc:

nhập mô tả hình ảnh ở đây

Làm thế nào tôi có thể tránh các dao động và phân tích 0,0 cho đầu vào lớn hơn 6?

Đây là chức năng của tôi:

import numpy as np

def func(x):
    t = np.exp(-np.pi*x)
    return 1/t*(1-np.sqrt(1-t**2))

Câu trả lời:


31

Điều này thực sự được gọi là hủy bỏ thảm khốc. Trong thực tế, trường hợp cụ thể này rất dễ dàng: viết lại hàm bằng cách sử dụng biểu thức tương đương, ổn định về số

t1+1-t2.
1-1-t21+1-t2

nhập mô tả hình ảnh ở đây


Tuyệt diệu! Bạn có thể giới thiệu một cuốn sách như vậy là những kỹ thuật này đã được phác thảo?
Lưỡng cực

2
@Jack "Độ chính xác và ổn định của thuật toán số" là một cuốn sách cấp cao tốt. Bất kỳ sách giáo khoa giới thiệu cũng sẽ thảo luận về điều này.
Kirill

Tôi muốn biết liệu bạn có sử dụng Wolfram Mathematica để vẽ biểu đồ này không.THX :)
xyz

Bạn có biết bất kỳ tài liệu tham khảo nào thu thập và / hoặc thảo luận về các thủ thuật tương tự để viết lại các biểu thức toán học theo các cách tương đương toán học làm giảm mất ý nghĩa không? Tôi đã đọc cuốn sách của Higham, nhưng cuộc thảo luận là chung chung và tất cả các chương sau là về đại số tuyến tính (hiện tại không phải là chủ đề của tôi).
vẫy gọi

@becko Đó là một quảng cáo đẹp trong kinh nghiệm của tôi. Sẽ dễ dàng hơn nhiều nếu bạn có cách kiểm tra công thức của mình bằng các câu trả lời đúng (ngay cả khi bạn chỉ tạo chúng với số học chính xác hơn), do đó bạn không tìm kiếm sự bất ổn định số mà không gặp phải trường hợp kiểm tra trước. Và nếu nó hoạt động cho tất cả các đầu vào đã biết, sẽ không có vấn đề thực sự nào cho dù sự bất ổn định số có ở bất cứ đâu hay không.
Kirill
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.