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变换
返回:无