特定の関数の定積分を計算する OCaml の関数を書きたいと思います。問題は、次の構文を目指していることです。
let sphere r phi theta = r *. sin phi *. cos theta in
let dphi = 10 in (* number of parts *)
let dtheta = 10 in (* number of parts *)
let zero = 0.0 in
let two_pi = 2.0 *. 3.14159
in
integral zero two_pi (integral zero two_pi (sphere 3.0) dphi) dtheta
問題は、台形規則のような規則を使用して、次のように記述する必要があることです。
0.5 *. (f a +. f b) *. d
f a
と が部分的に適用される機能でf b
はないことが期待されます。
最後のintegral
関数呼び出しの結果が浮動小数点数を返すとは思っていません。機能的にはまったく問題ありません。
質問が非常に具体的でないことに気づきました。より一般的な方法で言い直します。
私は関数float->float->float
を適用した後にintegral
私に与えるべき関数を持っていますfloat->float
。これは一般的なものでなければならないので、integral
のfloat->float
結果は になりfloat
ます。
問題は、同じ順序の 2 つの関数を減算する必要があるf(a) -. f(b)
ことfloat->float->float
です。float->float
float->float->float
関数の順序を減らすには、次のような署名が必要です(float->'a->float) -> ('a->float)
。
これは可能ですか?特にOCamlでは?
連鎖可能な積分を計算する関数が1 つあるというこの問題について考えれば考えるほど、それを行うのは不可能なタスク/愚かな方法のように思えます。
実際、私はこれを実装しましたが、独自のデータ型 ( 、、、と呼ばfunction_type
れる) を使用しています。しかし、ポリモーフィズムのおかげで、 function に積分を 3 回適用しようとしても、コンパイラは警告を表示できません。Scalar3rdOrderFunction
Scalar2ndOrderFunction
Scalar1stOrderFunction
Scalar0thOrderFunction
float->float->float