所以我写了这段代码,计算不同样本和β值下alpha和beta的均方估计值,alpha的值是3,因为我们把三个指数分布加起来就得到了gamma变量。
但是,这段代码没有给出任何正确的输出。
# include <stdio.h>
# include <math.h>
# include <stdlib.h> // Don't forget to include this
main()
{
int n,N; // Sample size and number of simulations
long double alpha=3,beta,suma=0.0,sumb=0.0,msea,mseb;
int i,j,k;
printf("Enter the number of simulations");
scanf("%d", &N);
printf("Enter the sample size");
scanf("%d", &n);
printf("Enter the value of beta");
scanf("%Lf", &beta);
//Simulation starts to calculate MSE
for(i=0;i<N;i++)
{
float msea=0.0,mseb=0.0,sum=0.0,sumsq=0.0; //Vlaue is reset at every iteration, so declared inside i loop
for(j=0;j<n;j++)//each sample
{
float g;
for(k=0;k<alpha;k++)
g += (double)(-1/beta)*log(1-((double)rand()/RAND_MAX));//sum of exp is gamma
sum += g;
sumsq += g*g;
}
float xbar = sum/n;
float var = sumsq/n - xbar*xbar;
suma += pow ((xbar*xbar/var - alpha),2);
sumb += pow ((xbar/var - beta),2);
}
msea = suma/n;
mseb = sumb/n;
printf("MSE of alpha is = %Lf", msea);
printf("MSE of beta is = %Lf", mseb);
return 0;
}
你能帮我找出我的错误吗?
1条答案
按热度按时间xfb7svmp1#
代码至少存在以下问题:
未初始化的
g
一个月一个月
log(1-((double)rand()/RAND_MAX))
可能会提供log(0)
。我怀疑log(1 - (((double) rand() + 0.5)/ (RAND_MAX + 1u)))
会提供更好的分发。3个FP类型
float, double, long double
有很多上变频和下变频。始终使用
double
,直到确定需要其他宽度。未使用的对象
不使用
float msea=0.0,mseb=0.0
。提示:启用所有警告并保存时间。使用%g
"%g"
的信息量更大。OP报告“我做了更改,它仍然在输出“。
我怀疑OP还没有做出所有的改变。