2012-10-16 35 views
7

Có thể tìm nguồn gốc của hàm bằng chương trình c không. Tôi đang sử dụng MATLAB ở chỗ nó có một hàm diff() có sẵn có thể được sử dụng để tìm kiếm dẫn xuất của một hàm.Cách tìm đạo hàm của hàm bằng cách sử dụng c

f(x)=x^2 

Có thể tìm thấy đạo hàm của hàm trên bằng cách sử dụng c. Thuật toán cho điều đó là gì?

+0

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

+0

Tài liệu tham khảo chuẩn de facto: http://www.nr.com/ – alk

+0

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

Trả lời

13

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:

  1. 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;
  2. 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),
  3. 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 đó :)

+0

"Tôi không thể tìm thấy" - tốt, có Matlab (http://stackoverflow.com/questions/1513583/how-to-call-matlab-code-from-c) ;-) –

+0

@SteveJessop là nó mã nguồn mở để kiểm tra cách nó hoàn thành đạo hàm phân tích? –

+0

(@SteveJessop Tôi hy vọng bạn đã không nghiêm túc tin rằng tôi không biết về sự tồn tại của MatLab.) –

2

Không có gì được tích hợp vào ngôn ngữ C để bật tính năng này. Bạn có thể tìm thấy một thư viện số để làm điều đó mặc dù nếu bạn tìm kiếm trực tuyến, mặc dù tôi sẽ nghi ngờ rằng có bất cứ điều gì có sẵn mà sẽ cung cấp các dẫn xuất tượng trưng. Bạn có thể xem xét mã hóa các dẫn xuất số gần đúng bằng cách sử dụng các khác biệt về phía trước, phía sau và/hoặc trung tâm.

0

Trong C, bạn có thể làm sự khác biệt số thô tương đối dễ dàng, nhưng bất kỳ loại phân biệt biểu tượng nào cũng yêu cầu khung bên thứ ba hoặc tự tạo khung của riêng bạn.

C là ngôn ngữ lập trình có mục đích chung và cấp thấp, không giống như Matlab, chuyên về tính toán toán học và có các công cụ nâng cao để tính toán biểu tượng.

2

Đối với chức năng đơn giản phân biệt số sau hoạt động khá tốt:

typedef double (*TFunc)(double); 

// general approximation of derivative using central difference 
double diff(TFunc f, double x, double dx=1e-10) 
{ 
    double dy = f(x+dx)-f(x-dx); 
    return dy/(2.*dx); 
} 

// more or less arbitrary function from double to double: 
double f(double x) 
{ 
    return x*x; 
} 

// and here is how you get the derivative of f at specified location 
double fp = diff(f, 5.); 
1

Tôi biết tôi đến trễ, nhưng tôi đã viết một thư viện mà không chính xác điều đó.

Nó cho phép phân tích hàm, tạo ra một cây chức năng. Sau đó, bạn thậm chí có thể giải quyết nó hoặc dẫn xuất nó.

Bạn có thể tìm thấy nó tại. https://github.com/B3rn475/MathParseKit

Các vấn đề liên quan