| 
          
            □投稿者/ 魔界の仮面弁士 (1392回)-(2017/08/24(Thu) 11:23:59)
              | ■84928 / inTopicNo.3) | Re[1]: [c#]確率密度関数について |  
 
          
            
              
                |  | 2017/08/24(Thu) 19:07:21 編集(投稿者) 
 ■No84925 (ゆき さん) に返信
 > 正規分布の確率密度関数をc#で作成したいのですが、
 
 誤:c#
 正:C#
 というのはさておき。
 
 他者に日本語で説明できない処理を、
 コンピューターに C# 言語で伝えたいのですよね。
 
 「理解していないこと」をコーディングするのは無茶だと思うので、
 理解していない部分は他者作成のライブラリで補ってみては如何でしょう。
 
 
 
 > 確率密度関数の内容もよくわかっていないため作れません。
 このあたりを読んでみるとか。
 https://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E5%88%86%E5%B8%83
 
 まぁ、私にとっても初めて聞いた言葉だったりするのですが、
 wikipedia によれば、全ての確率分布が密度関数を持つとは限らないものの、
 標準正規分布の確率密度関数であれば、
 f(x) = e^(-(x^2)/2)/((2*Pi)^(1/2))
 で得られるそうなので、C# の構文で言えば、
 static double Wankuma84925_A(double x)
 {
 return Math.Exp(-Math.Pow(x, 2) / 2) / Math.Sqrt(2 * Math.PI);
 }
 と書けるでしょう。
 
 
 既存のライブラリ(というか Excel)に任せるなら、NORM.S.DIST に渡してこんな感じ。
 とりあえず 0.0〜1.0 の間の 0.1 刻みの値を渡してみたところ、上記と同じ結果が得られました。
 
 static double Wankuma84925_B(double x)
 {
 return Wankuma84925_B(new double[] { x }).First();
 }
 static IEnumerable<double> Wankuma84925_B(IEnumerable<double> values)
 {
 dynamic dXA = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
 var dWf = dXA.WorksheetFunction;
 foreach (var x in values)
 {
 // https://msdn.microsoft.com/VBA/Excel-VBA/articles/worksheetfunction-norm_s_dist-method-excel
 yield return dWf.Norm_S_Dist(x, false) as double? ?? Double.NaN;
 }
 System.Runtime.InteropServices.Marshal.ReleaseComObject(dWf);
 dXA.Quit();
 System.Runtime.InteropServices.Marshal.ReleaseComObject(dXA);
 }
 
 
 
 Excel のワークシート関数を使うパターンで言えば、上記の
 NORM.S.DIST は「標準正規分布の確率密度関数の値」を得るものでしたが、
 NORM.DIST なら「指定した平均と標準偏差に対する正規分布の確率密度関数の値」を
 得られるようです。
 
 
 /// <param name="x">計算対象の値</param>
 /// <param name="avg">対象となる分布の平均</param>
 /// <param name="s">対象となる分布の標準偏差</param>
 static double Wankuma84925_C(double x, double avg, double s)
 {
 dynamic dXA = Activator.CreateInstance(Type.GetTypeFromProgID("Excel.Application"));
 var dWf = dXA.WorksheetFunction;
 // https://msdn.microsoft.com/ja-jp/library/office/ff822197.aspx
 double r = dWf.Norm_Dist(x, avg, s, false) as double? ?? Double.NaN;
 System.Runtime.InteropServices.Marshal.ReleaseComObject(dWf);
 dXA.Quit();
 System.Runtime.InteropServices.Marshal.ReleaseComObject(dXA);
 return r;
 }
 
 |  |