111.绘制正态分布曲线

举报
C语言与CPP编程 发表于 2022/05/05 23:43:02 2022/05/05
【摘要】 #include "stdio.h"#include "math.h"#include "graphics.h" double lgam1(x) /*Gamma函数的计算*/double x;{ int i; double y,t,s,u; static double a[11]={ 0.0000677106,-0.000...

  
  1. #include "stdio.h"
  2. #include "math.h"
  3. #include "graphics.h"
  4. double lgam1(x) /*Gamma函数的计算*/
  5. double x;
  6. {
  7. int i;
  8. double y,t,s,u;
  9. static double a[11]={ 0.0000677106,-0.0003442342,
  10. 0.0015397681,-0.0024467480,0.0109736958,
  11. -0.0002109075,0.0742379071,0.0815782188,
  12. 0.4118402518,0.4227843370,1.0};
  13. if (x<=0.0)
  14. { printf("err**x<=0!\n"); return(-1.0);}
  15. y=x;
  16. if (y<=1.0)
  17. {
  18. t=1.0/(y*(y+1.0)); y=y+2.0;}
  19. else if (y<=2.0)
  20. {
  21. t=1.0/y; y=y+1.0;}
  22. else if (y<=3.0) t=1.0;
  23. else
  24. {
  25. t=1.0;
  26. while (y>3.0)
  27. { y=y-1.0; t=t*y;}
  28. }
  29. s=a[0]; u=y-2.0;
  30. for (i=1; i<=10; i++)
  31. s=s*u+a[i];
  32. s=s*t;
  33. return(s);
  34. }
  35. double lgam2(a,x) /*不完全Gamma函数*/
  36. double a,x;
  37. {
  38. int n;
  39. double p,q,d,s,s1,p0,q0,p1,q1,qq;
  40. if ((a<=0.0)||(x<0.0))
  41. { if (a<=0.0) printf("err**a<=0!\n");
  42. if (x<0.0) printf("err**x<0!\n");
  43. return(-1.0);
  44. }
  45. if (x+1.0==1.0) return(0.0);
  46. if (x>1.0e+35) return(1.0);
  47. q=log(x); q=a*q; qq=exp(q);
  48. if (x<1.0+a)
  49. {
  50. p=a; d=1.0/a; s=d;
  51. for (n=1; n<=100; n++)
  52. {
  53. p=1.0+p; d=d*x/p; s=s+d;
  54. if (fabs(d)<fabs(s)*1.0e-07)
  55. {
  56. s=s*exp(-x)*qq/lgam1(a);
  57. return(s);
  58. }
  59. }
  60. }
  61. else
  62. {
  63. s=1.0/x; p0=0.0; p1=1.0; q0=1.0; q1=x;
  64. for (n=1; n<=100; n++)
  65. {
  66. p0=p1+(n-a)*p0; q0=q1+(n-a)*q0;
  67. p=x*p0+n*p1; q=x*q0+n*q1;
  68. if (fabs(q)+1.0!=1.0)
  69. {
  70. s1=p/q; p1=p; q1=q;
  71. if (fabs((s1-s)/s1)<1.0e-07)
  72. {
  73. s=s1*exp(-x)*qq/lgam1(a);
  74. return(1.0-s);
  75. }
  76. s=s1;
  77. }
  78. p1=p; q1=q;
  79. }
  80. }
  81. printf("a too large !\n");
  82. s=1.0-s*exp(-x)*qq/lgam1(a);
  83. return(s);
  84. }
  85. double lerrf(x) /*误差函数*/
  86. double x;
  87. {
  88. double y;
  89. if (x>=0.0)
  90. y=lgam2(0.5,x*x);
  91. else
  92. y=-lgam2(0.5,x*x);
  93. return(y);
  94. }
  95. double lgass(a,d,x) /*正态分布函数*/
  96. double a,d,x;
  97. {
  98. double y;
  99. if (d<=0.0) d=1.0e-10;
  100. y=0.5+0.5*lerrf((x-a)/(sqrt(2.0)*d));
  101. return(y);
  102. }
  103. main()
  104. {
  105. int i;
  106. double j;
  107. double a, d;
  108. int gdriver = DETECT, gmode;
  109. clrscr();
  110. printf("This program will draw the Normal Distribution Graph.\n");
  111. printf("Please input the mathematical expectation (Alpha): ");
  112. scanf("%lf", &a );
  113. printf("Please input the variance (Sita >0): ");
  114. scanf("%lf", &d );
  115. /*registerbgidriver( EGAVGA_driver );*/
  116. initgraph( &gdriver, &gmode, "e:\\tc\\bgi" );
  117. setbkcolor( BLUE );
  118. moveto( 50, 430 );
  119. lineto( 590, 430 );
  120. outtextxy( 600, 425, "X");
  121. moveto( 200, 50 );
  122. lineto( 200, 450 );
  123. outtextxy( 200, 30, "Y" );
  124. outtextxy( 185, 435, "O");
  125. setcolor( RED );
  126. moveto( 51, 430 - 100 * lgass( a, d, -150.0 ) );
  127. for( i = 51; i <= 590; i++ )
  128. {
  129. j = 430 - 360 * lgass( a, d, (double)(i-200) );
  130. lineto( i, j );
  131. }
  132. getch();
  133. closegraph();
  134. }

文章来源: blog.csdn.net,作者:程序员编程指南,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_41055260/article/details/124576365

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。