⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 概率密度或分布通用函数
💻
字号:
/*1、试编写求概率密度或分布律的通用函数,调用格式为Y=pdf(name,X,A);Y=pdf(name,X,A,B);Y=pdf(name,X,A,B,C)
返回参数为A,B,C的以name为分布的概率密度或分布律在X处的取值,name的值可为
bino--二项分布         poiss--泊松分布
unif--均匀分布         exp--指数分布
norm--正态分布调用例:
pdf('norm',0.7733,0,1)
结果:0.2958
注:即求标准正态分布密度函数在0.7733的值。

2、试编写求分布函数的通用函数,调用格式为
Y=cdf(name,X,A);Y=cdf(name,X,A,B);Y=cdf(name,X,A,B,C)
返回参数为A,B,C的以name为分布的分布函数在X处的取值,name的值可为
bino--二项分布         poiss--泊松分布
unif--均匀分布         exp--指数分布
norm--正态分布调用
例:
 cdf('norm',2,3,2)
结果:0.3085
注:设X~N(3,22),求P{X不超过2}
答案:*/

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
#define PI 3.14159
#define Min exp(-4)
/*******************************第一问***************************/
//求n的阶陈
double C(int n)
	{
		int i=n;
		double s=1.0;
		while(i>0)
			{
				s*=i;
				i--;
			}
		return(s);
	}
//求r的k次幂
double M(double r,int k)
	{
		double T=1.0;
		int i=1;

		while(i<=k)
		{
			T*=r;
			i++;
		}

		return(T);
	}
//求仅有一个参数的函数值
double pdf(char *s,double x,double A)
	{
		int k;
		k=(int)x;

		if(strcmp(s,"poiss")==1)
				return((M(A,k)*exp(-A))/C(k));

		else if(strcmp(s,"exp")==1)
				return((1/A)*exp(-x/A));

		else
		
			{
				printf("调用错误!\n");
		    		return(-1.0);
			}
			
	}
//求有两个参数的函数值
double pdf(char *s,double x,double A,double B)
	{
		int n,k;
		double t;
		n=(int)A;
		k=(int)x;

		if(strcmp(s,"bino")==1)
		{
				if(B>1)
				{
					printf("输入错误-->概率不能大于1\n");
				        	return(-1.0);
				}

				else
					{
					if(x>A)
						{
							printf("输入错误-->成功次数不会大于实验次数!\n");
								return(-1.0);
						}
					else
							return((C(n)/(C(k)*C(n-k)))*M(B,k)*M(1-B,n-k));
					}
		}
		else if(strcmp(s,"unif")==1)
			{
				if(x<A||x>B)
					return(0.0);

				else
					return(1/fabs(A-B));
			
			}

		else if(strcmp(s,"norm")==1)
			{
				t=-((x-A)*(x-A))/(2*B*B);
				      return(1/((sqrt(2*PI)*B))*exp(t));
			}

		else
		
			{
				printf("调用错误!\n");
		    		return(-1.0);
			}
		
	}
/*******************************第二问***************************/
//求一个函数的积分
double SubAdd(double(*f)(double t),double a,double b)
	{
		double x;//自变量
		double y=Min;//增量
		double sum=0.0;//累积和
		x=a;
		while(fabs(x-b)>Min)
			{
				sum+=f(x)*y;
				x+=y;
			}
		return(sum);
	}
void output()
	{
		printf("*****************************************************************************\n");
		printf("\n\t\tbino-->二项分布\t\tpoiss--泊松分布\n\n\t\tunif--均匀分布\t\texp--指数分布\n\n\t\tnorm--正态分布调用\n");
		printf("\n****************************************************************************\n");

	}
//函数归类
void main()
{

	output();
	//double (*f)(double t);
	//printf("积分为:\n");
	//printf("%lf",SubAdd(f,PI/2,PI));
	char* s;
	double x,A,B;
	printf("请输入函数名:\n");
	s=(char*)malloc(6*sizeof(char));
	gets(s);
	if(strcmp(s,"norm")==1)
	{
		printf("输入三个参数:x(自便量),u(数学期望),r(标准差)\n");
		scanf("%lf%lf%lf",&x,&A,&B);
		printf("The result is : %lf\n",pdf(s,x,A,B));
		
	}
	else if(strcmp(s,"poiss")==1)
	{
		printf("输入两个参数:k(点值),r( ranmita)\n");
		scanf("%lf%lf",&x,&A);
		printf("The result is :%lf\n",pdf(s,x,A));
	}
    else if(strcmp(s,"unif")==1)
	{
		printf("输入三个参数:x(点),A(下界),B(上界)\n");
		scanf("%lf%lf%lf",&x,&A,&B);
		printf("The result is : %lf\n",pdf(s,x,A,B));
	}
    else if(strcmp(s,"bino")==1)
	{
		printf("输入三个参数:,k(事件A发生次数),n(实验次数),p(事件A发生的概率)\n");
		scanf("%lf%lf%lf",&x,&A,&B);
		printf("The result is : %lf\n",pdf(s,x,A,B));
	}
    else if(strcmp(s,"exp")==1)
	{
		printf("输入两个参数:x(点),O(sinta)\n");
		scanf("%lf%lf",&x,&A);
		printf("The result is :%lf\n",pdf(s,x,A));
	}
	free(s);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -