Có, điều đó là hoàn toàn có thể. Tuy nhiên, giải pháp phụ thuộc vào nhu cầu của bạn. Nếu bạn cần một giải pháp số đơn giản, sau đây sẽ làm gì (đến một mức độ nhất định, với một số hạn chế - thực hiện ngây thơ):
double derive(double (*f)(double), double x0)
{
const double delta = 1.0e-6; // or similar
double x1 = x0 - delta;
double x2 = x0 + delta;
double y1 = f(x1);
double y2 = f(x2);
return (y2 - y1)/(x2 - x1);
}
// call it as follows:
#include <math.h>
double der = derive(sin, 0.0);
printf("%lf\n", der); // should be around 1.0
Để biết thêm tiên tiến số tính toán, bạn có thể sử dụng GNU Scientific Library.
Tuy nhiên, nếu bạn cần phải tìm ra analitically thức của đạo hàm của một hàm nào đó, sau đó bạn phải:
- Phân tích các công thức đầu vào một số kiểu dữ liệu trừu tượng, ví dụ như một AST;
- Tạo nguồn gốc bằng cách sử dụng danh tính và quy tắc phái sinh (chỉ có một vài trong số đó, phần này là dễ nhất),
- Nối tiếp loại dữ liệu trừu tượng mà bạn nhận được là kết quả của quá trình phái sinh thành chuỗi và đầu ra đó là kết quả.
Tuy nhiên, bạn sẽ không cần thực hiện tất cả điều này; có rất nhiều thư viện toán học C cung cấp chức năng như vậy.
Chỉnh sửa: sau một số Googling, tôi không thể tìm thấy. Giải pháp gần nhất cho bạn bắt đầu tôi có thể nghĩ là có một cái nhìn tại GeoGebra's source code - mặc dù nó được viết bằng Java, nó khá dễ đọc cho bất kỳ ai đủ thông thạo ngôn ngữ giống như C. Nếu không, chỉ cần tiếp tục và tự thực hiện thuật toán đó :)
Nguồn
2012-10-16 13:11:44
nếu bạn muốn một dẫn xuất ngôn ngữ, bạn có thể sử dụng giới hạn và nhận được xấp xỉ tốt. – elyashiv
Tài liệu tham khảo chuẩn de facto: http://www.nr.com/ – alk
Bạn có muốn một giải pháp mang tính biểu tượng hay phân tích? Các giải pháp của @ H2CO3 sẽ cung cấp một giải pháp phân tích (ví dụ: phân biệt rời rạc). Nếu bạn muốn có một câu trả lời tượng trưng (ví dụ: f '(x) = 2x) thì bạn sẽ cần phải viết một trình phân tích cú pháp, phức tạp hơn. – DevNull