プログラムを数学関数として表現できると仮定しましょう。それは可能です。その関数の一次導関数のプログラム表現はどのようになりますか? プログラムをその「派生」形式に変換する方法はありますか?これはまったく意味がありますか?
7 に答える
Yes it does make sense, it's known as Automatic Differentiation. There are one or two experimental compilers which can do this, for example NAGware's Differentiation Enabled Fortran Compiler Technology. And there are a lot of research papers on the topic. I suggest you get Googling.
まず、純粋な関数 (外部状態に影響を与えず、すべての入力に対してまったく同じ出力を返す関数) の導関数を取得しようとすることだけが理にかなっています。第二に、多くのプログラミング言語の型システムには多くのステップ関数 (整数など) が含まれています。つまり、有効な一次導関数を取得するには、プログラムを連続関数で動作させる必要があります。第三に、任意の関数の導関数を取得するには、関数を分解して記号的に操作する必要があります。したがって、関数がどのような操作で構成されているかを知らずに関数の導関数を取得することはできません。これは、反射によって達成できます。
プログラミング言語がクロージャ (つまり、ネストされた関数と、関数を変数に入れて返す機能) をサポートしている場合は、微分近似関数を作成できます。http://en.wikipedia.org/wiki/Closure_%28computer_science%29から抜粋した JavaScript の例を次に示します。
function derivative(f, dx) {
return function(x) {
return (f(x + dx) - f(x)) / dx;
};
}
したがって、次のように言えます。
function f(x) { return x*x; }
f_prime = derivative(f, 0.0001);
ここで、f_prime
近似しますfunction(x) {return 2*x;}
プログラミング言語が高階関数と十分な代数を実装していれば、実際の微分関数を実装できます。それは本当にクールだろう。
データ型の導関数と分析、および正規表現の導関数に関する Lambda the Ultimate のディスカッションを参照してください。
プログラムは数学関数よりもはるかに抽象的で「ルールレス」であるため、これはあまり意味がありません。導関数は入力が変化したときの出力の変化の尺度であるため、これが適用できるプログラムがいくつかあります。 ただし、入力/出力の両方を数値で定量化できる必要があります。
入力/出力は両方とも数値であるため、プログラムが数学関数または一連の関数を表すか、同様に動作すると仮定するのが妥当です。したがって、導関数は簡単に表すことができますが、関数の数学的導関数をコンピューター プログラムに変換するのと同じです。
プログラムの数学関数をどのように定義しますか?
導関数は、関数の変化率を表します。関数が連続でない場合、その導関数はほとんどのドメインで未定義になります。
あなたが「導き出そうとしている」プログラムが何らかの形のヒューリスティックを使用しているとしたらどうでしょうか。では、どうやってそれを導き出すことができるのでしょうか?
冗談半分ですが、すべての実際のプログラムが少なくともrand()を使用していることは誰もが知っています。