数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
查看: 2917|回复: 3

数值计算程序大放送-数据处理与回归

[复制链接]
发表于 2005-1-19 23:08:47 | 显示全部楼层 |阅读模式
<>选自&lt;&lt;徐世良数值计算程序集(C)&gt;&gt;</P>
<>每个程序都加上了适当地注释,陆陆续续干了几个月才整理出来的啊。</P>
<>今天都给贴出来了</P>
<P>#include &lt;stdlib.h&gt;
#include &lt;math.h&gt;
//一元线性回归分析
//x-长度为n的数组,存放n个自变量x
//y-长度为n的数组,存放n个观测点y的值
//n-数据的个数
//a-返回值a[0],a[1]:a[0]*x+a[1]
//dt-长度为6的数组,
//   dt[0]-返回偏差平方和   q=sum[(y-a x-b)^2]
//   dt[1]-返回平均标准偏差 s=sqrt[q/n]
//   dt[2]-返回回归平方和   p=sum[(a x+b-mean[yi])^2]
//   dt[3]-返回最大偏差 umax
//   dt[4]-返回最小偏差 umin
//   dt[5]-返回偏差平均值 u=sum[y-(a x+b)]/n
void jbsqt(double x[],double y[],int n,double a[2],double dt[6])
{
int i;
    double xx,yy,e,f,q,u,p,umax,umin,s;
    xx=0.0; yy=0.0;
    for (i=0; i&lt;=n-1; i++)
{
  xx=xx+x/n;
  yy=yy+y/n;
}
    e=0.0; f=0.0;
    for (i=0; i&lt;=n-1; i++)
{
  q=x-xx;
  e=e+q*q;
        f=f+q*(y-yy);
}
    a[1]=f/e;
a[0]=yy-a[1]*xx;
    q=0.0; u=0.0; p=0.0;
    umax=0.0;
umin=1.0e+30;
    for (i=0; i&lt;=n-1; i++)
{
  s=a[1]*x+a[0];
        q=q+(y-s)*(y-s);
        p=p+(s-yy)*(s-yy);
        e=fabs(y-s);
        if (e&gt;umax)
  {
   umax=e;
  }
        if (e&lt;umin)
  {
   umin=e;
  }
        u=u+e/n;
}
    dt[1]=sqrt(q/n);
    dt[0]=q;
dt[2]=p;
    dt[3]=umax;
dt[4]=umin;
dt[5]=u;
    return;
}</P>
 楼主| 发表于 2005-1-19 23:09:03 | 显示全部楼层
//多元线性回归分析
//x-长度为m*n的数组,每列存放m个自变量的一组观测值
//y-长度为n的数组,存放n个观测点y的值
//m-自变量的个数
//n-观测数据的组数
//a-长度为m+1的数组,返回回归系数a[0],a[1],a[2]...a[m]
//dt-长度为6的数组,
//   dt[0]-返回偏差平方和   q=sum[(y-a x-b)^2]
//   dt[1]-返回平均标准偏差 s=sqrt[q/n]
//   dt[2]-返回复相关系数 r
//   dt[3]-返回回归平方和 u
int chchol(double a[],int n,int m,double d[]);
void jcsqt(double x[],double y[],int m,int n,double a[],double dt[],double v[])
{
int i,j,k,l,mm;
    double q,e,u,p,yy,s,r,pp,*b;
    b=(double *)malloc((m+1)*(m+1)*sizeof(double));
    mm=m+1;
    b[mm*mm-1]=n;
    for (j=0; j&lt;=m-1; j++)
{
  p=0.0;
        for (i=0; i&lt;=n-1; i++)
  {
   p=p+x[j*n+i];
  }
        b[m*mm+j]=p;
        b[j*mm+m]=p;
}
    for (i=0; i&lt;=m-1; i++)
{
  for (j=i; j&lt;=m-1; j++)
        {
   p=0.0;
   for (k=0; k&lt;=n-1; k++)
   {
    p=p+x[i*n+k]*x[j*n+k];
   }
   b[j*mm+i]=p;
   b[i*mm+j]=p;
        }
}
    a[m]=0.0;
    for (i=0; i&lt;=n-1; i++)
{
  a[m]=a[m]+y;
}
    for (i=0; i&lt;=m-1; i++)
{
  a=0.0;
        for (j=0; j&lt;=n-1; j++)
  {
   a=a+x[i*n+j]*y[j];
  }
}
    chchol(b,mm,1,a);
    yy=0.0;
    for (i=0; i&lt;=n-1; i++)
{
  yy=yy+y/n;
}
    q=0.0; e=0.0; u=0.0;
    for (i=0; i&lt;=n-1; i++)
{
  p=a[m];
        for (j=0; j&lt;=m-1; j++)
  {
   p=p+a[j]*x[j*n+i];
  }
        q=q+(y-p)*(y-p);
        e=e+(y-yy)*(y-yy);
        u=u+(yy-p)*(yy-p);
}
    s=sqrt(q/n);
    r=sqrt(1.0-q/e);
    for (j=0; j&lt;=m-1; j++)
{
  p=0.0;
        for (i=0; i&lt;=n-1; i++)
  {
   pp=a[m];
            for (k=0; k&lt;=m-1; k++)
   {
    if (k!=j)
    {
     pp=pp+a[k]*x[k*n+i];
    }
   }
            p=p+(y-pp)*(y-pp);
  }
        v[j]=sqrt(1.0-q/p);
}
    dt[0]=q;
dt[1]=s;
dt[2]=r;
dt[3]=u;
    free(b);
return;
}
int chchol(double a[],int n,int m,double d[])
{
int i,j,k,u,v;
    if ((a[0]+1.0==1.0)||(a[0]&lt;0.0))
{
  printf("fail\n");
  return(-2);
}
    a[0]=sqrt(a[0]);
    for (j=1; j&lt;=n-1; j++)
{
  a[j]=a[j]/a[0];
}
    for (i=1; i&lt;=n-1; i++)
{
  u=i*n+i;
        for (j=1; j&lt;=i; j++)
  {
   v=(j-1)*n+i;
            a=a-a[v]*a[v];
  }
        if ((a+1.0==1.0)||(a&lt;0.0))
  {
   printf("fail\n");
   return(-2);
  }
        a=sqrt(a);
        if (i!=(n-1))
  {
   for (j=i+1; j&lt;=n-1; j++)
   {
    v=i*n+j;
                for (k=1; k&lt;=i; k++)
    {
     a[v]=a[v]-a[(k-1)*n+i]*a[(k-1)*n+j];
    }
                a[v]=a[v]/a;
   }
  }
}
    for (j=0; j&lt;=m-1; j++)
{
  d[j]=d[j]/a[0];
        for (i=1; i&lt;=n-1; i++)
  {
   u=i*n+i; v=i*m+j;
            for (k=1; k&lt;=i; k++)
   {
    d[v]=d[v]-a[(k-1)*n+i]*d[(k-1)*m+j];
   }
            d[v]=d[v]/a;
  }
}
    for (j=0; j&lt;=m-1; j++)
{
  u=(n-1)*m+j;
        d=d/a[n*n-1];
        for (k=n-1; k&gt;=1; k--)
  {
   u=(k-1)*m+j;
            for (i=k; i&lt;=n-1; i++)
   {
    v=(k-1)*n+i;
                d=d-a[v]*d[i*m+j];
   }
            v=(k-1)*n+k-1;
            d=d/a[v];
  }
}
    return(2);
}
 楼主| 发表于 2005-1-19 23:09:27 | 显示全部楼层
//多元逐步回归分析
//n-自变量的个数
//m-观测点数
//x-长度为k*(n+1)的数组,前n列存放自变量因子xi的k次观测值,
//   最后一列存放应变量y的k次观测值
//f1-选入因子时的显著性检验的F-值
//f2-剔除因子时的显著性检验的F-值
//eps-防止系数相关矩阵退化的判据
//xx-长度为n+1的数组,前n个分量返回xi的平均值,xx[n]返回y的平均值
//b-长度为n+1的数组,返回回归方程中各因子的回归系数及常数项
//v-长度为n+1的数组,返回回归方程中各因子的偏回归平方和,v[n]返回残差平方和
//s-长度为n+1的数组,返回回归方程中各因子回归系数的标准偏差,s[n]返回估计的标准偏差
//a-长度为m+1的数组,返回回归系数a[0],a[1],a[2]...a[m]
//dt-长度为2的数组,
//   dt[0]-返回复相关系数
//   dt[1]-返回F-检验值
//ye-长度为k的数组,返回因变量条件期望的k个估计值
//yr-长度为k的数组,返回因变量的k个观测值的残差
//r-长度为(n+1)*(n+1)的数组,返回系数相关矩阵
void jdsqt(int n,int k,double x[],double f1,double f2,double eps,double xx[],double b[],double v[],double s[],double dt[],double ye[],double yr[],double r[])
{
int i,j,ii,m,imi,imx,l,it;
    double z,phi,sd,vmi,vmx,q,fmi,fmx;
    m=n+1;
q=0.0;
    for (j=0; j&lt;=n; j++)
{
  z=0.0;
        for (i=0; i&lt;=k-1; i++)
  {
   z=z+x[i*m+j]/k;
  }
        xx[j]=z;
}
    for (i=0; i&lt;=n; i++)
{
  for (j=0; j&lt;=i; j++)
        {
   z=0.0;
   for (ii=0; ii&lt;=k-1; ii++)
   {
    z=z+(x[ii*m+i]-xx)*(x[ii*m+j]-xx[j]);
   }
   r[i*m+j]=z;
        }
}
    for (i=0; i&lt;=n; i++)
{
  ye=sqrt(r[i*m+i]);
}
    for (i=0; i&lt;=n; i++)
{
  for (j=0; j&lt;=i; j++)
        {
   r[i*m+j]=r[i*m+j]/(ye*ye[j]);
   r[j*m+i]=r[i*m+j];
        }
}
    phi=k-1.0;
    sd=ye[n]/sqrt(k-1.0);
    it=1;
    while (it==1)
{
  it=0;
        vmi=1.0e+35;
  vmx=0.0;
        imi=-1; imx=-1;
        for (i=0; i&lt;=n; i++)
  {
   v=0.0;
   b=0.0;
   s=0.0;
  }
        for (i=0; i&lt;=n-1; i++)
   if (r[i*m+i]&gt;=eps)
            {
    v=r[i*m+n]*r[n*m+i]/r[i*m+i];
    if (v&gt;=0.0)
                {
     if (v&gt;vmx)
                    {
      vmx=v;
      imx=i;
     }
                }
    else
                {
     b=r[i*m+n]*ye[n]/ye;
     s=sqrt(r[i*m+i])*sd/ye;
     if (fabs(v)&lt;vmi)
                    {
      vmi=fabs(v);
      imi=i;
     }
                }
            }
   if (phi!=n-1.0)
   {
    z=0.0;
    for (i=0; i&lt;=n-1; i++)
    {
     z=z+b*xx;
    }
    b[n]=xx[n]-z;
    s[n]=sd;
    v[n]=q;
   }
   else
   {
    b[n]=xx[n];
    s[n]=sd;
   }
   fmi=vmi*phi/r[n*m+n];
   fmx=(phi-1.0)*vmx/(r[n*m+n]-vmx);
   if ((fmi&lt;f2)||(fmx&gt;=f1))
   {
    if (fmi&lt;f2)
    {
     phi=phi+1.0;
     l=imi;
    }
    else
    {
     phi=phi-1.0;
     l=imx;
    }
    for (i=0; i&lt;=n; i++)
    {
     if (i!=l)
     {
      for (j=0; j&lt;=n; j++)
      {
       if (j!=l)
       {
        r[i*m+j]=r[i*m+j]-(r[l*m+j]/r[l*m+l])*r[i*m+l];
       }
      }
     }
    }
    for (j=0; j&lt;=n; j++)
    {
     if (j!=l)
     {
      r[l*m+j]=r[l*m+j]/r[l*m+l];
     }
    }
    for (i=0; i&lt;=n; i++)
    {
     if (i!=l)
     {
      r[i*m+l]=-r[i*m+l]/r[l*m+l];
     }
    }
    r[l*m+l]=1.0/r[l*m+l];
    q=r[n*m+n]*ye[n]*ye[n];
    sd=sqrt(r[n*m+n]/phi)*ye[n];
    dt[0]=sqrt(1.0-r[n*m+n]);
    dt[1]=(phi*(1.0-r[n*m+n]))/((k-phi-1.0)*r[n*m+n]);
    it=1;
   }
}
    for (i=0; i&lt;=k-1; i++)
{
  z=0.0;
        for (j=0; j&lt;=n-1; j++)
  {
   z=z+b[j]*x[i*m+j];
  }
        ye=b[n]+z;
  yr=x[i*m+n]-ye;
}
    return;
}
 楼主| 发表于 2005-1-19 23:09:44 | 显示全部楼层
//////////////////////////////////////////////////////////////
//一元线性回归分析
//x-长度为n的数组,存放n个自变量x
//y-长度为n的数组,存放n个观测点y的值
//n-数据的个数
//a-返回值a[0],a[1]:a[0]*x+a[1]
//dt-长度为6的数组,
//   dt[0]-返回偏差平方和   q=sum[(y-a x-b)^2]
//   dt[1]-返回平均标准偏差 s=sqrt[q/n]
//   dt[2]-返回回归平方和   p=sum[(a x+b-mean[yi])^2]
//   dt[3]-返回最大偏差 umax
//   dt[4]-返回最小偏差 umin
//   dt[5]-返回偏差平均值 u=sum[y-(a x+b)]/n
void jbsqt(double x[],double y[],int n,double a[2],double dt[6]);
//////////////////////////////////////////////////////////////
//多元线性回归分析
//x-长度为m*n的数组,每列存放m个自变量的一组观测值
//y-长度为n的数组,存放n个观测点y的值
//m-自变量的个数
//n-观测数据的组数
//a-长度为m+1的数组,返回回归系数a[0],a[1],a[2]...a[m]
//dt-长度为6的数组,
//   dt[0]-返回偏差平方和   q=sum[(y-a x-b)^2]
//   dt[1]-返回平均标准偏差 s=sqrt[q/n]
//   dt[2]-返回复相关系数 r
//   dt[3]-返回回归平方和 u
//调用函数chchol()
void jcsqt(double x[],double y[],int m,int n,double a[],double dt[],double v[]);
//////////////////////////////////////////////////////////////
//多元逐步回归分析
//n-自变量的个数
//m-观测点数
//x-长度为k*(n+1)的数组,前n列存放自变量因子xi的k次观测值,
//   最后一列存放应变量y的k次观测值
//f1-选入因子时的显著性检验的F-值
//f2-剔除因子时的显著性检验的F-值
//eps-防止系数相关矩阵退化的判据
//xx-长度为n+1的数组,前n个分量返回xi的平均值,xx[n]返回y的平均值
//b-长度为n+1的数组,返回回归方程中各因子的回归系数及常数项
//v-长度为n+1的数组,返回回归方程中各因子的偏回归平方和,v[n]返回残差平方和
//s-长度为n+1的数组,返回回归方程中各因子回归系数的标准偏差,s[n]返回估计的标准偏差
//a-长度为m+1的数组,返回回归系数a[0],a[1],a[2]...a[m]
//dt-长度为2的数组,
//   dt[0]-返回复相关系数
//   dt[1]-返回F-检验值
//ye-长度为k的数组,返回因变量条件期望的k个估计值
//yr-长度为k的数组,返回因变量的k个观测值的残差
//r-长度为(n+1)*(n+1)的数组,返回系数相关矩阵
void jdsqt(int n,int k,double x[],double f1,double f2,double eps,double xx[],double b[],double v[],double s[],double dt[],double ye[],double yr[],double r[]);
//////////////////////////////////////////////////////////////
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

小黑屋|手机版|Archiver|数学建模网 ( 湘ICP备11011602号 )

GMT+8, 2024-11-27 18:48 , Processed in 0.053585 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表