CSDN博客

img dcyu

我的算法头文件使用说明

发表于2002/9/29 10:49:00  1632人阅读

Mylib文件使用说明

所有库函数在Turbo C 3.0下编译成功,目前共72个函数,包含数学模型和数值分析中常用的一些算法,例如各种随机数的产生,矩阵类、复数类运算,积分变换,函数图形化,表的操作,各种组合问题,图论算法等等。

1.     函数名:Error

功能:捕捉错误,结束程序

用法:void   Error(char *message)

参数:message:错误信息

返回:无

2.     函数名:_Pause

功能:等待按键

用法:void   _Pause(void)

参数:无

返回:无

3.     函数名:_delay

功能:延时

用法:void   _delay(double delaytime)

参数:delaytime:秒数(精确到1微秒)

返回:无

4.     函数名:_time

功能:取得当前系统时间(当天经过的总秒数)

用法:double _time(void)

参数:无

返回:当天经过的总秒数(精确到1微秒)

5.     函数名:_dif

功能:计算两个时间差(可以用于计算程序的运行时间)

用法:double _dif(double start,double end)

参数:start:开始时间,end:结束时间

返回:时间差(精确到1微秒)

程序例:

#include "mylib.h"

 

void main()

{

  double start,end,dif;

 

  start=_time();

  _delay(5.00);

  end=_time();

  dif=_dif(start,end);

  printf("/n%lf,%lf,%lf/n",start,end,dif);

 

}

6.     函数名:_Alloc2

功能:分配一个二维动态数组

用法:double **_Alloc2(int r,int c)

参数:r:行数,c:列数

返回:一个二维动态数组

7.     函数名:_Alloc2_int

功能:分配一个二维动态数组(整型数组)

用法:int    **_Alloc2_int(int r,int c)

参数:r:行数,c:列数

返回:一个二维动态数组

8.     函数名:_Alloc2Free

功能:释放一个二维动态数组

用法:void   _Alloc2Free(double **x)

参数:一个二维动态数组

返回:无

9.     函数名:_dtoa

功能:将一个双精度型变量转换成字符串(保留三位有效的小数位数)

用法:void   _dtoa(double value, char *string)

参数:value:双精度型变量,string:字符串

返回:无

10.  函数名:_putstring

功能:在图形界面下,输出字符串

用法:void   _putstring(int x, int y, char *msg, int color)

参数:x:屏幕x坐标,y:屏幕y坐标,msg:字符串,color,字体颜色

返回:无

11.  函数名:_fac

功能:求一个数的阶乘(数不超过12)

用法:long _fac(int n)

参数:n:数

返回:阶乘

12.  函数名:_fac2

功能:求一个整型数的阶乘(数不超过32767)

用法:int _fac2(int n,int *a)

参数:n:数,a:一维数组(存放阶乘产生后的各个位上的数字)

返回:阶乘的位数

13.  函数名:_random

功能:产生一个在(0,1)内均匀分布的随机数,要用randomize初始化随机数发生器

用法:double _random(void)

参数:无

返回:随机数

14.  函数名:_rand

功能:产生一个在(0,seed)内均匀分布的随机整数

用法:int _rand(int seed)

参数:seed:上界

返回:随机整数

15.  函数名:_avg

功能:产生一个在(a,b)内均匀分布的随机数

用法:double _avg(double a,double b)

参数:a:下界,b:上界

返回:随机数

16.  函数名:_sta

功能:产生一个以mu为均值,sigma为方差的正态分布随机数

用法:double _sta(double mu,double sigma)

参数:mu:均值,sigma:方差

返回:正态分布随机数

17.  函数名:_sta2

功能:产生一个以mu为均值,sigma为方差的正态分布随机数(时间较快,但有bug)

用法:double _sta2(double mu,double sigma)

参数:mu:均值,sigma:方差

返回:正态分布随机数

18.  函数名:_kai

功能:产生一个以n为自由度的卡方分布

用法:double _kai(int n)

参数:n:自由度

返回:卡方分布随机数

19.  函数名:_tdis

功能:产生一个以n为自由度的t分布

用法:double _tdis(int n)

参数:n:自由度

返回:t分布随机数

20.  函数名:_F

功能:产生一个以n1和n2为自由度的F分布

用法:double _F(int n1,int n2)

参数:n1,n2:自由度

返回:F分布随机数

随机数部分程序实例:

#include "mylib.h"

 

void main()

{

 double _kai(int n);

 long i;

 double r;

 double s,e,d;

 

 s=_time();

 randomize();

 for(i=1;i<=10000;i++)

r=_kai(12);

 

 e=_time();

 d=_dif(s,e);

 printf("%lf/n",d);

 

}

21.  函数名:_Poisson

功能:产生一个以lam为参数的泊松分布

用法:double _Poisson(int k,double lam)

参数:k,lam:参数

返回:泊松分布随机数

22.  函数名:_mean

功能:一个数组连续部分的平均值

用法:double _mean(double *a,int start,int end)

参数:a:数组,start:数组起始位置,end:数组终了位置

返回:平均值

23.  函数名:_variance

功能:一个数组连续部分的方差

用法:double _variance(double *a,int start,int end)

参数:a:数组,start:数组起始位置,end:数组终了位置

返回:方差

24.  函数名:_Linear

功能:线性拟合

用法:double _Linear(double *x, double *y, double *a, double *b, int n)

参数:x:拟合点的横坐标列表,y:纵坐标,a:截距,b:斜率,n:点的数目

返回:拟合点方差的无偏估计量

25.  函数名:_Adj_Form

功能:由线的连接表生成邻接矩阵

用法:double **_Adj_Form(double (*a)[3], int n, int m)

参数:a:连接表(表中的前两个元素是边的两个端点,第三个元素是边的权值),n:图的总结点数,m:边的个数

返回:邻接矩阵

26.  函数名:_Floyd

功能:Floyd算法求两点之间的最短路径

用法:double _Floyd(int i,int j,int k,double **d)

参数:i,j:两个点的标记,k:节点数减一

返回:最短路径

程序例:

#include "mylib.h"

 

#define MAX INT_MAX

#define N 7

 

double di[N][N]={

{ MAX,2.0,5.0,3.0,MAX,MAX,MAX },

{ 2.0,MAX,2.0,MAX,MAX,7.0,MAX },

{ 5.0,2.0,MAX,1.0,3.0,5.0,MAX },

{ 3.0,MAX,1.0,MAX,5,MAX,MAX   },

{ MAX,MAX,3.0,5.0,MAX,1.0,7.0 },

{ MAX,7.0,5.0,MAX,1.0,MAX,5.0 },

{ MAX,MAX,MAX,MAX,7.0,5.0,MAX }

} ;

 

void main(void)

{

 double temp, **G;

 int i,j;

 

 G=_Alloc2(N,N);

 for(i=0;i<N;i++)

  for(j=0;j<N;j++)

G[i][j]=di[i][j];

 temp=_Floyd(0,6,N-1,G);

 printf("/n%lf",temp);

 

}

27.  函数名:_Dijkstra

功能:Dijkstra算法求两点之间的最短路径

用法:double _Dijkstra(Graph **G,int n,int s,int t, int *path, int *count)

参数:G:邻接矩阵,n:节点数,s:开始节点,t:结束节点,path:最短路径表,count:路径数

返回:最短路径

程序例:

#include "mylib.h"

 

#define N 9

#define m 32767

 

void main()

{

Graph a[N][N]={

     m,4,m,m,m,m,m,8,m,

     4,m,8,m,m,m,m,11,m,

     m,8,m,7,m,4,m,m,2,

     m,m,7,m,9,14,m,m,m,

     m,m,m,9,m,10,m,m,m,

     m,m,4,14,10,m,2,m,m,

     m,m,m,m,m,2,m,1,6,

     8,11,m,m,m,m,1,m,7,

     m,m,2,m,m,m,6,7,m,

};

int *path,w,i,j,**G,count;

 

path=(int *)malloc(N*sizeof(int));

G=_Alloc2_int(N,N);

for(i=0;i<N;i++)

 for(j=0;j<N;j++)

  G[i][j]=a[i][j];

 

w=_Dijkstra(G,N,0,6,path,&count);

printf("/n%d/n",w);

for(i=0;i<count;i++)

{   printf("%d  ",*path);  path++;   }

 

}

28.  函数名:_0618

功能:0.618法求函数最小值

用法:double _0618(double (*f)(double x),double start,double end,double eps)

参数:f:函数名,start,end:左右区间,eps:精度

返回:最小值

程序例:

#include "mylib.h"

 

double f(double x)

{

 return x*x+x*16.0+3.0;

}

 

void main()

{

 double f(double x);

 

 double a,b,r,eps;

 a=-10.0;b=8.0;eps=0.001;

 r=_0618(f,a,b,eps);

 printf("%lf/n",r);

 

}

29.  函数名:_2div

功能:用二分法求方程的所有单实根

用法:int _2div(double (*f)(double x), double a, double b, double h, double eps,

          double *x, int n, int *m)

参数:f:函数名,a,b:左右区间,h:步长,eps:精度,x:输出参数,存放所有单实根,n:方程根个数的预估值,m:实际求得的方程根的个数

返回:函数执行状况

程序例:

#include "mylib.h"

 

double f(double x)

{

 return sin(x);

}

void main()

{

 int i,n,m;

 double a,b,h,eps,*x;

 

 n=3;

 x=(double *)calloc(n,sizeof(double));

 if(x==NULL) exit(1);

 a=-2;

 b=7;

 h=0.1;

 eps=1e-10;

 _2div(f,a,b,h,eps,x,n,&m);

 printf("m=%d/n",m);

 for(i=0;i<n;i++)

  printf("%e/n",x[i]);

 free(x);

}

30.  函数名:_integral

功能:类抛物线法求曲线积分

用法:double _integral(double (*f)(double x),double start,double end,int n)

参数:f:函数名,start,end:左右区间,n:等分区间的数目(偶数)

返回:积分值

31.  函数名:_integral2

功能:梯形法求曲线积分

用法:double _integral2(double (*f)(double x),double start,double end,int div)

参数:f:函数名,start,end:左右区间,div:等分区间的数目

返回:积分值

32.  函数名:_comb

功能:组合

用法:long _comb(int n,int m)

参数:n, m

返回:组合

33.  函数名:_rank

功能:排列

用法:long _rank(int n,int m)

参数:n, m

返回:排列

34.  函数名:_allcomb_dg

功能:递归求所有组合情况(为_allcomb所调用)

用法:void _allcomb_dg(int* ps, int* pe, int elems, int buf[], int bufsz, int **comb, int* iCount)

参数:

返回:无

35.  函数名:_allcomb

功能:求所有组合情况

用法:void _allcomb(int *list, int n, int elems, int **comb)

参数:list:组合表,n:表的个数,elems:所取的组合个数,comb:所有组合表

返回:无

程序例:(包括_comb和_rank函数)

#include "mylib.h"

 

void main()

{

 long c,d;

 int i, j;

 int elem=3, n=6, m;

 int list[] = {1, 2, 3, 4, 5, 6};

 int **comb;

 clrscr();

 comb=_Alloc2_int(_comb(n,elem),elem);

 _allcomb(list,n,elem,comb);

 for(i=0;i<_comb(n,elem);i++)

 {

for(j=0;j<elem;j++)

 printf("%d ",comb[i][j]);

printf("/n");

 }

 printf("Total : %d/n",_comb(n,elem));

 n=12;m=7;

 c=_rank(n,m);

 d=_comb(n,m);

 printf("%ld   %ld/n",c,d);

 

}

36.  函数名:_allrank_dg

功能:递归求m个元素的全排列问题(为_allrank所调用)

用法:void _allrank_dg(int m, int k, int s, int *a, int *flag, int *iCount, int **rank)

参数:

返回:无

37.  函数名:_allrank

功能:求m个元素的全排列问题

用法:void _allrank(int m, int **rank)

参数:m:元素个数,rank:所有排列表

返回:无

程序例:

#include "mylib.h"

 

void main()

{

 int **rank, i, j;

 clrscr();

 rank=_Alloc2_int(120,5);

 _allrank(5,rank);

 for(i=0;i<120;i++)

 {

  for(j=0;j<5;j++)

printf("%d ",rank[i][j]);

  printf("/n");

  if(i%20==0) getch();

 }

}

38.  函数名:_bolziman

功能:退火算法Bolziman函数或Bolziman机学习规则函数

用法:int _bolziman(double de,double t)

参数:de:能量差,t:当前温度

返回:是否接受

39.  函数名:_isprime

功能:判断一个数是否是质数

用法:int _isprime(long p)

参数:p:要判断的数

返回:是否是质数

40.  函数名:_prime

功能:第n个质数的值

用法:long _prime(int n)

参数:n

返回:第n个质数

程序例:

#include "mylib.h"

 

void main()

{

 long p=65537;

 int prime=1,n=12000;

 long pp;

 prime=_isprime(p);

 printf("%d/n",prime);

 pp=_prime(n);

 printf("%ld/n",pp);

}

41.  函数名:_swapi

功能:交换两个整型数据

用法:void _swapi(int *a,int *b)

参数:a,b:两个整型数据

返回:无

42.  函数名:_swapl

功能:交换两个长整型数据

用法:void _swapl(long *a,long *b)

参数:a,b:两个长整型数据

返回:无

43.  函数名:_swapd

功能:交换两个双精度型数据

用法:void _swapd(double *a,double *b)

参数:a,b:两个双精度型数据

返回:无

44.  函数名:_inv

功能:一个一维数组的转置

用法:void _inv(int *x,int n)

参数:x:一维数组,n:数组元素个数

返回:无

45.  函数名:_sort

功能:冒泡排序

用法:void _sort(double *x,int n)

参数:x:一维数组,n:数组元素个数

返回:无

46.  函数名:_max2

功能:求两个数的较大值

用法:long _max2(long n,long m)

参数:n,m:长整型数

返回:较大值

47.  函数名:_min2

功能:求两个数的较小值

用法:long _min2(long n,long m)

参数:n,m:长整型数

返回:较小值

48.  函数名:_max

功能:求一组数的最大值,并返回这个数的所在位置

用法:double _max(double *array,int n,int *id)

参数:array:一维数组,n:元素个数,id:返回的最大值的所在位置

返回:最大值

49.  函数名:_min

功能:求一组数的最大值,并返回这个数的所在位置

用法:double _min(double *array,int n,int *id)

参数:array:一维数组,n:元素个数,id:返回的最小值的所在位置

返回:最小值

50.  函数名:_GCD

功能:求两个数的最大公约数

用法:long _GCD(long m,long n)

参数:m,n

返回:最大公约数

51.  函数名:_LCM

功能:求两个数的最小公倍数

用法:long _LCM(long m,long n)

参数:m,n

返回:最小公倍数

52.  函数名:_initgraph

功能:初始化图形界面

用法:void _initgraph(void)

参数:无

返回:无

53.  函数名:_setPlotdefault

功能:设置缺省画图界面

用法:void _setPlotdefault(void)

参数:无

返回:无

54.  函数名:_Plot

功能:画一条函数曲线

用法:void _Plot(double (*f)(double x),double start,double end)

参数:f:函数方程,start,end:左右区间

返回:无

程序例:

#include "mylib.h"

 

double f(double x)

{

 return -x*x+8*x+10;

}

 

void main()

 {

_initgraph();

 _Plot(f,2,10);

 while(bioskey(1)==0) ;

 closegraph();

}

55.  函数名:_Line_equation

功能:线性方程

用法:double _Line_equation(double x, double a, double b)

参数:x:横坐标,a:截距,b:斜率

返回:纵坐标

56.  函数名:_Fit

功能:图形化进行的线性拟合

用法:void _Fit(double *x, double *y, int n)

参数:x:拟合点的横坐标表,y:拟合点的纵坐标表,n:拟合点的数目

返回:无

程序例:

#include "mylib.h"

 

void main()

 {

 double x[]={2.0, 3.0, 4.0, 4.5, 5.0, 6.0, 7.2, 8.3, 8.9,10.0,14.2},

       y[]={4.2, 5.5, 7.3, 9.6, 10.1,12.3,14.6,16.9,19.0,21.0,24.9};

 

 _initgraph();

 _Fit(x,y,11);

 while(bioskey(1)==0) ;

 closegraph();

}

57.  函数名:_Cplus

功能:复数的加法运算

用法:Complex _Cplus(Complex z1,Complex z2)

参数:z1,z2:两个复数

返回:运算后的复数

58.  函数名:_Cminus

功能:复数的减法运算

用法:Complex _Cminus(Complex z1,Complex z2)

参数:z1,z2:两个复数

返回:运算后的复数

59.  函数名:_Cmul

功能:复数的乘法运算

用法:Complex _Cmul(Complex z1,Complex z2)

参数:z1,z2:两个复数

返回:运算后的复数

60.  函数名:_Cdiv

功能:复数的除法运算

用法:Complex _Cdiv(Complex z1,Complex z2)

参数:z1,z2:两个复数

返回:运算后的复数

61.  函数名:_Cabs

功能:复数的模运算

用法:double _Cabs(Complex z)

参数:z:复数

返回:模

62.  函数名:_Croot

功能:复数的根运算

用法:void _Croot(Complex z1, int n, Complex *z)

参数:z1:复数,n:n次根,z:存放n个根

返回:无

63.  函数名:_Cpow

功能:复数的幂运算

用法:Complex _Cpow(Complex z1, double w)

参数:z1:复数,w:幂

返回:复数的幂

64.  函数名:_LAG

功能:Lagrange插值计算

用法:double _LAG(double *x, double *y, double t, int n)

参数:x:插值点的横坐标表,y:插值点的纵坐标表,t:待求的插值点,n:插值点数

返回:插值点的函数值

程序例:

#include "mylib.h"

 

void main()

{

 int n;

 double *x,*y,t,sum;

 t=0.15;

 n=6;

 x=(double *)calloc(n,sizeof(double));

 if(x==NULL) exit(1);

 y=(double *)calloc(n,sizeof(double));

 if(y==NULL) exit(1);

 x[0]=0;       x[1]=0.1;     x[2]=0.195;   x[3]=0.3;     x[4]=0.401;   x[5]=0.5;

 y[0]=0.39894; y[1]=0.39695; y[2]=0.39142; y[3]=0.38138; y[4]=0.36812; y[5]=0.35206;

 sum=_LAG(x,y,t,n);

 printf("%lf/n",sum);

 free(x);

 free(y);

 

}

65.  函数名:_NEWT

功能:Newton插值计算

用法:double _NEWT(double *x, double *y, int n, double t)

参数:x:插值点的横坐标表,y:插值点的纵坐标表,n:插值点数,t:待求的插值点

返回:插值点的函数值

66.  函数名:_Mgauss

功能:Gauss消元法求解线性方程组

用法:int _Mgauss(double **a, double *b, int n, double ep)

参数:a:系数矩阵,b:方程值,n:方程个数,ep:精度

返回:是否有解

程序例:

#include "mylib.h"

 

void main()

{

 int i,n;

 double **a,*b,ep;

 

 n=3;

 a=_Alloc2(n,n);

 b=(double *)calloc(n,sizeof(double));

 if(b==NULL) exit(1);

 ep=1e-12;

 a[0][0]=1; a[0][1]=-1; a[0][2]=1;

 a[1][0]=5; a[1][1]=-4; a[1][2]=3;

 a[2][0]=2; a[2][1]=1;  a[2][2]=1;

 b[0]=-4; b[1]=-12; b[2]=11;

 if(!_Mgauss(a,b,n,ep))

 {

  printf("failed!/n");

  exit(1);

 }

 for(i=0;i<=2;i++)

  printf("x[%d] = %f/n",i+1,b[i]);

 _Alloc2Free(a);

 free(b);

 

}

67.  函数名:_Mgauss2

功能:求解矩阵相乘的逆运算(AX=B)

用法:int _Mgauss2(double **a, double **b, int n, int m, double ep)

参数:a:矩阵A,b:矩阵B,n:方程的阶数,m:右端列向量个数,ep:精度

返回:是否有解

68.  函数名:_Mdjn

功能:线性对称方程组解的分解法

用法:int _Mdjn(double **a, double **c, int n, int m)

参数:a:矩阵A,c:矩阵C,n:方程的阶数,m:右端列向量个数

返回:是否有解

69.  函数名:_NOR

功能:正态分布函数(|x|<=3.5时用级数逼近,|x|>3.5时用连分式逼近)

用法:double _NOR(double x,int l)

参数:x:变量,l:l=1计算负无穷到x的积分,l=-1计算x到正无穷的积分

返回:积分值

程序例:

#include "mylib.h"

 

void main()

{

 double x;

 for(x=0;x<=5;x+=0.5)

  printf("%e/t%e/t%e/n",x,_NOR(x,1),_NOR(x,-1));

 

}

70.  函数名:_Mdet

功能:求矩阵的行列式的值

用法:double _Mdet(double **a, int n)

参数:a:一个n*n的矩阵,n:行数

返回:行列式的值

71.  函数名:_Minv

功能:求矩阵的逆

用法:int _Minv(double t0, double *t, double *tt, int n, int m, double **b)

参数:

返回:

72.  函数名:_FFT

功能:FFT变换

用法:void _FFT(double *fr, double *fi, int n, int flag)

参数:fr:采样点的实数表,fi:采样点的虚数表,n:采样点个数,flag:flag=0表示求Fourier变换,flag=1表示求逆Fourier变换

返回:无

0 0

相关博文

我的热门文章

img
取 消
img