0

特定の関数の定積分を計算する 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。これは一般的なものでなければならないので、integralfloat->float結果は になりfloatます。

問題は、同じ順序の 2 つの関数を減算する必要があるf(a) -. f(b)ことfloat->float->floatです。float->floatfloat->float->float

関数の順序を減らすには、次のような署名が必要です(float->'a->float) -> ('a->float)

これは可能ですか?特にOCamlでは?

連鎖可能な積分を計算する関数が1 つあるというこの問題について考えれば考えるほど、それを行うのは不可能なタスク/愚かな方法のように思えます。

実際、私はこれを実装しましたが、独自のデータ型 ( 、、、と呼ばfunction_typeれる) を使用しています。しかし、ポリモーフィズムのおかげで、 function に積分を 3 回適用しようとしても、コンパイラは警告を表示できません。Scalar3rdOrderFunctionScalar2ndOrderFunctionScalar1stOrderFunctionScalar0thOrderFunctionfloat->float->float

4

0 に答える 0