web-dev-qa-db-ja.com

cを使用して関数の導関数を見つける方法

Cプログラムを使用して関数の導関数を見つけることは可能ですか?関数の導関数を見つけるために使用できる組み込み関数diff()があるという点で、私はmatlabを使用しています。

f(x)=x^2

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

14
Eka

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

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科学ライブラリを使用できます。

ただし、特定の関数の導関数のを分析的に見つける必要がある場合は、次のことを行う必要があります。

  1. 入力式を抽象データ型(ASTなど)に解析します。
  2. アイデンティティと導出のルールを使用してそれを導出します(それらのいくつかだけがあり、この部分が最も簡単なはずです)、
  3. 導出処理の結果得られた抽象データ型を文字列にシリアライズし、結果として出力します。

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

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

17
user529758

単純な関数の場合、次の数値微分は非常にうまく機能します。

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.);
3
coproc

これを可能にするためにC言語に組み込まれているものはありません。オンラインで検索すれば、数値ライブラリーを見つけてそれを実行できるかもしれませんが、シンボリックな導関数を提供するものがあるとは思えません。前方、後方、および/または中央の差異を使用して、近似数値導関数を自分でコーディングすることを検討できます。

2

Cでは、大まかな数値微分を比較的簡単に行うことができますが、記号による微分には、サードパーティのフレームワークまたは独自のローリングが必要です。

Cは、数学計算に特化し、記号計算用の高度なツールを備えたMatlabとは異なり、汎用で低レベルのプログラミング言語です。

0
Dmytro Sirenko

F '(x)の背後にある数学が欲しい好奇心旺盛な覗き見のために、限界から得られた導関数の標準的な定義を使用します: 導関数の式を参照してください。

ここで、h-> 0(hは0になる傾向がある)は、hが非常に小さい数であることを意味します。ほとんどの計算では、この数値を10 ^ -5にすることができます。両方の方程式は完全にうまく機能しますが、実際には、2番目の方程式はより良い値を与えます。ただし、これらの計算は非常に高価であり、実際の関数を手動で導出できる場合は避ける必要があることにも注意してください。

0
Farhan Khan

私は遅れていることを知っていますが、それを正確に行うライブラリを作成しました。

関数を解析して、関数のツリーを生成できます。次に、それを解決したり、派生させたりすることもできます。

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

0
B3rn475