2012-10-16 10 views
7

cプログラムを使用して関数の派生を見つけることは可能ですか?私は関数の派生を見つけるために使用することができるinbuilt関数diff()を持っているという点でmatlabを使用しています。cを使用して関数の派生を見つける方法

cを使用して上記の関数の派生を見つけることは可能ですか?そのアルゴリズムは何ですか?

+0

ロケールの派生が必要な場合は、制限を使用してよい近似を得ることができます。 – elyashiv

+0

デファクトスタンダードリファレンス:http://www.nr.com/ – alk

+0

シンボリックまたは分析ソリューションをお探しですか? H 2 CO 3による解は、分析溶液(すなわち、離散微分)を提供する。記号的な答え(すなわち:f '(x)= 2x)が必要な場合は、パーサーを書く必要があります。これはより複雑です。 – DevNull

答えて

13

はい、可能です。ただし、ソリューションはユーザーのニーズに応じて異なります。あなたは、単純な数値解が必要な場合は、次のように(いくつかの制約で、ある程度 - 素朴な実装)を行います。より高度な数値計算に

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 

、あなたはGNU Scientific Library.

を使用することができます

  1. がに入力式を解析します。あなたはanalitically与えられた関数の導関数のを見つける必要がある場合は、あなたがしなければなりませんASTなどの抽象データ型。
  2. 派生のアイデンティティーとルールを使用してそれを導出します(その一部のみが最も簡単です)
  3. 派生プロセスの結果として得られた抽象データ型を文字列にシリアル化して出力しますその結果として。

ただし、このすべてを行う必要はありません。そのような機能を提供するC言語の数学ライブラリがあります。

編集:一部のグーグルの後、私は1つを見つけることができませんでした。あなたが始めようとする最も近い解決策は、​​を見ていると思うことができると思います - それはJavaで書かれていますが、Cのような言語で十分に流暢な人のために読むのはかなり簡単です。そうでない場合は、そのままアルゴリズムを実装してください。

+0

「私は見つけられませんでした」 - まあ、Matlab(http://stackoverflow.com/questions/1513583/how-to-call-matlab-code-from-c);-) –

+0

@SteveJessopはそれですそれがどのように分析的な導出を達成するかを調べるためにopensourceを使用しますか? –

+0

(@SteveJessop Matlabの存在を知らなかったことを真剣に信じていないことを願っています) –

2

これを有効にするためのC言語には何も組み込まれていません。あなたがオンラインで検索しても数値ライブラリーを見つけることは可能かもしれませんが、シンボリックな派生物を提供するものは何かありますか?前進、後退、および/または中央の差を使って近似数値導関数をコード化することを検討できます。

0

Cでは、比較的簡単な数値微分を行うことができますが、任意の種類のシンボリックな微分にはサードパーティのフレームワークが必要です。

CはMatlabとは異なり、数学的計算に特化しており、シンボリック計算のための高度なツールを備えています。

2

簡単な関数については、以下の数値微分はかなりうまく機能:

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

私は遅刻を知っているが、私はまさにそのライブラリを書いています。

これは、関数の構文解析を可能にし、関数ツリーを生成します。 それを解決したり派生させたりすることさえできます。

あなたはで見つけることができます。 https://github.com/B3rn475/MathParseKit

関連する問題