2013-10-08 16 views
1

有沒有人知道Excel中是否存在兼容Excel FDIST和FINV的函數?如果沒有,任何人有任何想法如何建立?可能在C#中?用於Excel的兼容SQL函數FDist

謝謝。非常感謝您的幫助。

+0

應當具有標記'C#' –

回答

1

我已經設法通過使用.Net Framework 4.0及更高版本的庫(System.Windows.Forms.DataVisualization.Charting.StatisticFormula)來解決我的問題。

我能夠在C#中使用上面的庫開發一個函數用於我的計算過程。這是一個強大的圖書館,在那裏你可以在那裏找到大部分常用的統計公式(例如,平均值,中位數,t分佈,F分佈,以及它們的倒數。)

下面是我的代碼片段:

using System.Windows.Forms.DataVisualization.Charting; 

private Chart ch = new Chart(); // You will need to declare an object of Chart type, as Statistic Formula class does not have a public constructor 
double fDist = ch.DataManipulator.Statistics.FDistribution(fRatioVariance, degreeFreedom1, degreeFreedom2); 

希望這會幫助他人。謝謝。

0

FDIST FINV在Sql Server中不存在。

您可以編寫一個SQL Sever函數來實現兩個Excel功能。

Show here在MS SQL Server中創建功能

+0

我可以爲FDIST和FINV創建一個函數。但是有沒有一個地方或文件去理解FDIST和FINV中涉及的方程式。基本上我需要推導出這個公式。任何想法? –

1

儘管它太晚但是下面是SQL Server本身的一些統計功能的實現。

要獲得FDIST函數(相當於Excel中 - FDIST),我們也將需要完全和不完全β函數以及伽瑪功能:

--GAMMA Function 
CREATE FUNCTION [dbo].[udf_Gamma] 
(
@x Float=NULL 
) 
RETURNS Float 
AS 
BEGIN 

Declare @f Float = 10E99; 
Declare @g Float = 1; 
     if (@x > 0) 
     Begin 
      while (@x < 3) 
      Begin 
       SET @g = @g * @x; 
       SET @x = @x + 1; 
      End 
      SET @f = (1 - (2/(7*power(@x,2))) * (1 - 2/(3*power(@x,2))))/(30*power(@x,2)); 
      SET @f = ([email protected])/(12*@x) + @x*(log(@x)-1); 
      SET @f = (exp(@f)/@g)*power(2*PI()/@x,0.5); 
     End 
     else 
     Begin 
      SET @f = 10E99 
     End 
return @f; 

END 

--BETA Complete Function 
CREATE FUNCTION [dbo].[udf_BetaC] 
(
@x Float=NULL 
,@a Float=NULL 
,@b Float=NULL 
) 
RETURNS Float 
AS 
BEGIN 
--double betacf(double a,double b,double x){ 

Declare @maxIterations int = 50, @m int =1 
Declare @eps Float = 3E-5 
Declare @am Float = 1; 
Declare @bm Float = 1; 
Declare @az Float = 1; 
Declare @qab Float = @[email protected]; 
Declare @qap Float = @a+1; 
Declare @qam Float = @a-1; 
Declare @bz Float = 1 - @qab*@x/@qap; 
Declare @aold Float = 0; 
Declare @em Float, @tem Float, @d Float, @ap Float, @bp Float, @app Float, @bpp Float; 

while((@m<@maxIterations) AND (abs(@[email protected])>[email protected]*abs(@az))) 
Begin 
    SET @em = @m; 
    SET @tem = @[email protected]; 
    SET @d = @em*(@[email protected])*@x/((@qam + @tem)*(@[email protected])); 
    SET @ap = @[email protected]*@am; 
    SET @bp = @[email protected]*@bm; 
    SET @d = -(@[email protected])*(@[email protected])*@x/((@[email protected])*(@[email protected])); 
    SET @app = @[email protected]*@az; 
    SET @bpp = @[email protected]*@bz; 
    SET @aold = @az; 
    SET @am = @ap/@bpp; 
    SET @bm = @bp/@bpp; 
    SET @az = @app/@bpp; 
    SET @bz = 1; 
    SET @m = @m + 1; 
End 

return @az 

END 

--BETA INCOMPLETE Function 
CREATE FUNCTION [dbo].[udf_BetaI] 
(
@x Float=null 
,@a Float=null 
,@b Float=null 
) 
RETURNS Float 
AS 
BEGIN 

Declare @bt Float=0.0 
Declare @beta Float=0.0 

     if(@x=0 OR @x=1) 
     Begin 
      SET @bt = 0 
     End 
     else if((@x>0) AND (@x<1)) 
      Begin 
       SET @bt = (Select dbo.UDF_Gamma(@[email protected])* power(@x,@a)* power([email protected],@b)/(dbo.UDF_Gamma(@a)*dbo.UDF_Gamma(@b))) 
      End 
     if(@x<(@a+1)/(@[email protected]+2)) 
     Begin 
      SET @beta = (Select @bt*dbo.udf_betaC(@x,@a,@b)/@a) 
     End 
     else 
     Begin 
      SET @beta = (Select [email protected]*dbo.udf_betaC([email protected],@b,@a)/@b) 
     End 

Return @beta 

END 

--FDist Function 
CREATE FUNCTION [dbo].[udf_FDist] 
(
@x Float=NULL 
,@df1 Float=NULL 
,@df2 Float=NULL 
) 
RETURNS Float 
AS 
BEGIN 
    Declare @x1 Float=(@x*@df1)/((@x*@df1)[email protected]) 

    return (select 1 - dbo.udf_BetaI(@x1,(@df1/2),(@df2/2))) 

END 

入住在Excel = FDIST(0.5,1 ,1)= 0.608173448 和SQL編輯= SELECT udf_FDIST(0.5,1,1)= 0.608173457369209

問候, 阿維