Tôi cần tìm tất cả các gốc của hàm vô hướng trong một khoảng nhất định. Các chức năng có thể có sự không liên tục. Thuật toán có thể có độ chính xác là (ví dụ: không sao nếu thuật toán không tìm thấy hai gốc khác biệt gần hơn ε).
Liệu thuật toán như vậy có tồn tại? Bạn có thể chỉ cho tôi giấy tờ về điều đó?
Trên thực tế, tôi có một hàm tìm số 0 trong một khoảng nhất định bằng thuật toán của Brent và một hàm để tìm mức tối thiểu trong một khoảng nhất định. Sử dụng hai hàm đó, tôi xây dựng thuật toán của riêng mình, nhưng tôi tự hỏi liệu có tồn tại thuật toán tốt hơn không. Thuật toán của tôi là như thế:
Tôi bắt đầu với một khoảng [a,b]
và một chức năng f
. Nếu sign(f(a+ε)) ≠ sign(f(b-ε))
, tôi biết có ít nhất một số không giữa a
và b
và tôi tìm thấy z = zero(]a,b[)
. Tôi kiểm tra nếu z
thực sự là một số không (nó có thể là một sự gián đoạn), bằng cách tìm giá trị của z-ε
và z+ε
. Nếu có, tôi thêm nó vào danh sách các số không tìm thấy. Nếu f(a+ε)
và f(b-ε)
cả hai đều tích cực, tôi tìm kiếm m = min(]a, b[)
. Nếu f(m)
vẫn tích cực, tôi tìm kiếm m = max(]a,b[)
vì có thể có sự gián đoạn giữa a
và b
. Tôi làm ngược lại nếu f(a+ε)
và f(b-ε)
là tiêu cực.
Bây giờ, từ điểm tôi tìm thấy ( z
hoặc m
) tôi xây dựng một ngăn xếp chứa các số không, các điểm không liên tục và các điểm uốn của hàm của tôi. Sau lần lặp đầu tiên, ngăn xếp bây giờ trông như thế [a, z, b]
. Tôi bắt đầu lại thuật toán từ các khoảng ]a,z[
và ]z,b[
. Khi, giữa hai điểm a
và b
, điểm cực trị có cùng dấu hiệu so với cả hai khoảng thời gian kết thúc và không có sự gián đoạn nào ở cả hai điểm cực trị, tôi loại bỏ khoảng cách khỏi ngăn xếp. Thuật toán kết thúc khi không còn khoảng thời gian nữa.