Tìm tất cả các gốc của hàm trong một khoảng nhất định


9

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 abvà tôi tìm thấy z = zero(]a,b[). Tôi kiểm tra nếu zthự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-ε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+ε)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 ab. Tôi làm ngược lại nếu f(a+ε)f(b-ε)là tiêu cực.

Bây giờ, từ điểm tôi tìm thấy ( zhoặ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[]z,b[. Khi, giữa hai điểm ab, đ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.


2
Có các phương pháp dựa trên số học khoảng.
lhf

Câu trả lời:


6

Nếu bạn đang sử dụng Matlab, bạn có thể muốn dùng thử hệ thống Chebfun (từ chối trách nhiệm: Tôi từng là một nhà phát triển tích cực của dự án này). Nó có thể tìm thấy tất cả các gốc của hàm một chiều trong khoảng thời gian đóng hoặc mở với độ chính xác của máy.

Ý tưởng chính đằng sau công cụ tìm gốc Chebfun là sử dụng kết hợp phép chia đệ quy và Ma trận đồng nghiệp, một dạng tương tự của Ma trận đồng hành , trên các hệ số của một hàm nội suy của hàm mục tiêu.

Tôi có một phiên bản đơn giản của mã ở đây . Hàm chebrootsnày lấy một hàm ẩn danh làm đầu vào đầu tiên của nó, khoảng hữu hạn làm đối số thứ hai và thứ ba và một mức độ Nlà đối số thứ tư và cuối cùng. Để có kết quả hợp lý, bạn có thể đặt Nthành 100.


0

Nói chung, đây là một nhiệm vụ vô vọng - không có một số thông tin về tính liên tục và / hoặc tính khác biệt của chức năng, bất cứ điều gì cũng có thể xảy ra. Ví dụ, hãy xem xét hàm MATLAB được xác định trong khoảng từ 0 đến 1:

hàm y = f (x)

y = 1,0;

nếu (x == 0,01)

y = 0,0;

kết thúc

nếu (x == 0,013)

y = 0,0;

kết thúc

nếu (x == 0,753124)

y = 0,0;

kết thúc

Coi chức năng này là một hộp khối, không có cách nào để thấy rằng nó có các số 0 tại ba điểm này và không có điểm nào khác trong khoảng từ 0 đến 1 mà không kiểm tra mọi số dấu phẩy động trong khoảng từ 0 đến 1.


1
Những loại số không rõ ràng là không thể tìm thấy, nhưng @Charles dường như quan tâm đến, tệ nhất là, các chức năng hộp đen với sự gián đoạn nhảy, nhưng không được gọi là gián đoạn có thể tháo rời.
Bill Barth

1
Ngay cả khi bạn giới hạn bản thân để không liên tục nhảy và thậm chí nếu bạn giới hạn bản thân ở các chức năng liên tục, nếu chức năng đó không phải là Môi trường liên tục trong các khoảng thời gian đã biết, thì việc tìm tất cả các số 0 từ các đánh giá tại một số điểm hữu hạn sẽ không đảm bảo rằng bạn lấy tất cả các rễ.
Brian Borchers

sin(1/x)[0,1]

ϵ
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.