16

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

f(x)=x^2

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

4

5 に答える 5

22

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

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

より高度な数値計算については、 GNUScientificLibraryを使用できます。

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

  1. 入力式をASTなどの抽象データ型に解析します。
  2. アイデンティティと派生のルールを使用してそれを派生させます(それらの数はわずかですが、この部分が最も簡単なはずです)、
  3. 派生プロセスの結果として取得した抽象データ型を文字列にシリアル化し、その結果として出力します。

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

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

于 2012-10-16T13:11:44.783 に答える
3

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

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.);
于 2012-10-16T13:14:26.270 に答える
2

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

于 2012-10-16T13:02:40.280 に答える
0

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

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

于 2012-10-16T13:12:21.813 に答える
0

f'(x)の背後にある計算が必要な好奇心旺盛な覗き見については、極限から得られた導関数の標準的な定義を使用します。導関数の式を参照してください。

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

于 2019-12-01T17:42:50.613 に答える