Nếu chức năng của bạn được biết đến là hai lần khả vi, sử dụng
f'(x) = (f(x + h) - f(x - h))/2h
đó là trật tự thứ hai chính xác trong h. Nếu nó chỉ có thể khác biệt một lần, hãy sử dụng
f'(x) = (f(x + h) - f(x))/h (*)
là thứ tự đầu tiên trong h.
Đây là lý thuyết. Trong thực tế, mọi thứ khá phức tạp. Tôi sẽ lấy công thức thứ hai (thứ tự đầu tiên) khi phân tích đơn giản hơn. Làm thứ tự thứ hai như một bài tập.
Quan sát đầu tiên là bạn phải đảm bảo rằng (x + h) - x = h, nếu không bạn sẽ gặp phải các lỗi rất lớn. Thật vậy, f (x + h) và f (x) gần nhau (2.0456 và 2.0467), và khi bạn trừ chúng, bạn sẽ mất rất nhiều số liệu quan trọng (ở đây là 0,0011, có 3 số liệu quan trọng ít hơn hơn x). Vì vậy, bất kỳ lỗi nào trên h có thể có tác động rất lớn đến kết quả.
Vì vậy, bước đầu tiên, sửa chữa một ứng cử viên h (Tôi sẽ chỉ cho bạn trong một phút làm thế nào để chọn nó) và lấy h để tính toán số lượng h '= (x + h) - x. Nếu bạn đang sử dụng một ngôn ngữ như C, bạn phải cẩn thận để xác định h hoặc x là dễ bay hơi cho rằng tính toán không được tối ưu hóa đi.
Tiếp theo, lựa chọn h. Lỗi trong (*) có hai phần: lỗi cắt ngắn và lỗi vòng. Lỗi cắt ngắn là do công thức không chính xác:
(f(x + h) - f(x))/h = f'(x) + e1(h)
nơi e1(h) = h/2 * sup_{x in [0,h]} |f''(x)|
.
Lỗi vòng xuất phát từ thực tế là f (x + h) và f (x) gần nhau. Nó có thể được ước tính xấp xỉ như
e2(h) ~ epsilon_f |f(x)/h|
nơi epsilon_f
là độ chính xác tương đối trong tính toán của f (x) (hoặc f (x + h), đó là đóng). Điều này phải được đánh giá từ vấn đề của bạn. Đối với các chức năng đơn giản, epsilon_f
có thể được lấy làm máy epsilon. Đối với những người phức tạp hơn, nó có thể tồi tệ hơn so với các đơn đặt hàng của cường độ.
Vì vậy, bạn muốn h
giúp giảm thiểu e1(h) + e2(h)
. Cắm tất cả mọi thứ lại với nhau và tối ưu hóa trong h
mang
h ~ sqrt(2 * epsilon_f * f/f'')
mà phải được ước tính từ hàm của bạn. Bạn có thể ước tính sơ bộ. Khi nghi ngờ, hãy lấy h ~ sqrt (epsilon), nơi epsilon = độ chính xác của máy. Đối với sự lựa chọn tối ưu của h, độ chính xác tương đối mà đạo hàm được biết là sqrt (epsilon_f), tức là. một nửa số liệu quan trọng là chính xác.
Tóm lại: quá nhỏ a h => lỗi vòng, quá lớn h => lỗi cắt ngắn.
Đối với công thức bậc hai, sản lượng tính toán cùng
h ~ (6 * epsilon_f/f''')^(1/3)
và độ chính xác thập phân của (epsilon_f)^(2/3) cho đạo hàm (mà thường là một hoặc hai chữ số có nghĩa tốt hơn so với người đầu tiên công thức đặt hàng, giả sử độ chính xác gấp đôi).
Nếu điều này quá không chính xác, vui lòng hỏi thêm phương pháp, có rất nhiều thủ thuật để có được độ chính xác cao hơn. Richardson ngoại suy là một khởi đầu tốt cho các chức năng trơn tru. Nhưng những phương pháp đó thường tính toán khá nhiều lần, điều này có thể hoặc không phải là những gì bạn muốn nếu hàm của bạn phức tạp.
Nếu bạn định sử dụng các dẫn xuất bằng số nhiều lần tại các điểm khác nhau, sẽ trở nên thú vị khi xây dựng một xấp xỉ Chebyshev.
+1 cho câu trả lời gọn gàng :) – posdef
Tôi có nghĩ rằng tôi chọn dx nhỏ hơn, câu trả lời của tôi càng chính xác hơn. Nếu vậy có một hằng số MATLAB cho một số thực rất nhỏ? Một cái gì đó giống như pi cho 3,14 ... hoặc i cho sqrt (-1)? – lms
@codenoob: 'eps' cung cấp cho bạn một số lượng rất nhỏ. Tuy nhiên, đối với hầu hết các mục đích thực tế, 0,0001 là đủ. Ngoài ra, nếu bạn đang làm việc với đa thức và sử dụng 'polyder', bạn không phải lo lắng về kích thước của' dx'. – Jonas