F# では、一般的な数学ステップ関数をどのように記述しますか?
(Oliver) Heaviside ステップ関数は、x が負の場合は 0 を返し、そうでない場合は 1 を返す関数です。
これまでの私の試みの要約は次のとおりです。
// attempt 1:
let inline stepFct1< ^T when ^T : (static member op_GreaterThan: ^T * float -> bool)
> (x:^T) : ^T =
//if (^T : (static member op_GreaterThan) (x 0.0) ) then x //ouch fails also
if (>) x 0.0 then x
else 0.0
コンパイラのメッセージ: エラー FS0001: 型パラメーターに制約がありません 'when ^T : comparison'
// attempt 2:
let inline stepFct2<^T when ^T : (static member (>): ^T * ^T -> bool) > (x:^T) : ^T =
match x with
| x when x > 0.0 -> 1.0
| 0.0
FSC は次のように述べています: エラー FS0010: パターンに予期しない中置演算子があります
動機:
Ian の Cumulative-Normal 関数と Black-Scholes 関数をここで書き換えて、自動微分 (DiffSharp) を使用しようとしています。Ian の Cumulative Normal は float で動作します。AutoDiff.DualG を含む任意の数値型で動作する汎用バージョンが欲しいです。累積正規関数に「より大きい」ステートメントが含まれています。
編集:グスタボ、ありがとう、私はあなたの答えを受け入れました-単純なステップ関数がコンパイルされるようになりました。
しかし、累積法線のケースでは役に立たないようです。このコードを考えると:
// Cumulative Normal Distribution Function - attempt to write a generic version
let inline CDF(x:^T) : ^T =
let (b1,b2,b3) = (0.319381530, -0.356563782, 1.781477937)
let (b4,b5) = (-1.821255978, 1.330274429)
let (p , c ) = (0.2316419 , 0.39894228)
let (zero, one) = (LanguagePrimitives.GenericZero, LanguagePrimitives.GenericOne)
if x > zero then
let t = one / (one + p * x)
(one - c * exp( -x * x / 2.0)* t * (t*(t*(t*(t*b5+b4)+b3)+b2)+b1))
else
let t = 1.0 / (one - p * x)
(c * exp( -x * x / 2.0)* t * (t*(t*(t*(t*b5+b4)+b3)+b2)+b1))
FSI は次のように述べています。
C:\stdin(116,32): warning FS0064: This construct causes code to be less generic
than indicated by the type annotations.
The type variable 'T has been constrained to be type 'float'.
val inline CDF : x:float -> float
> CDF 0.1M;;
CDF 0.1M;;
----^^^^
C:\stdin(122,5): error FS0001: This expression was expected to have type
float
but here has type
decimal
>
CDFをジェネリックにする方法を知っている人はいますか?