2016-07-09 4 views
1

Мне нужна реализация C# (исходный код) функции NormalDistribution в System.Web.DataVisualization.dll, я попробовал источник с использованием уже доступных функций из github для вычисления NORM.S.DIST, но они не точны и не соответствуют значениям excel ,C# NormalDistribution implementation

Ниже приведен код, который я использовал, и он дает мне 1.2664557440189636E-43 (почти нулевой) для ввода 13.803404798240017. С другой стороны, excel и функция NormalDistribution в DataVisualization извлекают 1 в результате.

public static double NS(double zValue) 
{ 
    const double b1 = 0.319381530; 
    const double b2 = -0.356563782; 
    const double b3 = 1.781477937; 
    const double b4 = -1.821255978; 
    const double b5 = 1.330274429; 
    const double p = 0.2316419; 
    const double c = 0.39894228; 

    if (zValue >= 0.0) 
    { 
     double t = 1.0/(1.0 + p * zValue); 
     return (1.0 - c * Math.Exp(-zValue * zValue/2.0) * t * (t * (t * (t * (t * b5 + b4) + b3) + b2) + b1)); 
    } 
    else 
    { 
     double t = 1.0/(1.0 - p * zValue); 
     return (c * Math.Exp(-zValue * zValue/2.0) * t * (t * (t * (t * (t * b5 + b4) + b3) + b2) + b1)); 
     } 
} 

Я попытался ILSpy увидеть код в DataVisualization.dll, но не повезло, пожалуйста, предложите, как мы получаем, что исходный код (если это возможно), я думал, что MS имеет открытый исходный код их .Net кодовую базу, но это не относится к все сборки. или есть ли лучший способ рассчитать NORM.S.DIST с хорошей точностью?

Спасибо!

ответ

0

Разница, которую вы упомянули между двумя вычислениями, может быть связана с различием между распределением плотности и кумулятивным распределением. Для значения z, равного 13,80, функция плотности будет фактически равна 0, тогда как кумулятивное распределение будет практически равно 1. Функция excel NORMAL.S.DISTR (z, кумулятивная) позволяет указать эту разницу в качестве аргумента. Я бы предложил посмотреть на обе реализации, чтобы убедиться, что они оба либо совокупны, либо плотны. Что касается альтернативных библиотек, я бы порекомендовал пакет NuGet: «MathNet.Numerics» Этот пакет содержит реализации нескольких статистических распределений.

0

После того, как вы проверили правовой аспект Поступая таким образом, и если не существует каких-либо ограничений от Ms (в отношении типа лицензии, например), то вы можете использовать dotPeek декомпилировать любой сборки в C#

+0

Я нашел проект с открытым исходным кодом для всех математических формул в C#, я думаю, что могу развить код, который мне нужен. – Deepak

+0

Несомненно, если он решает вашу проблему, используйте ее – alainlompo