数模论坛

 找回密码
 注-册-帐-号
搜索
热搜: 活动 交友 discuz
12
返回列表 发新帖
楼主: dormouse_buaa

数值计算程序大放送-线性代数方程组

[复制链接]
 楼主| 发表于 2005-1-19 22:45:17 | 显示全部楼层
//Gauss-Seidel迭代法求解系数矩阵具有主对角线占绝对优势的线性代数方程组
//a n*n数组,存放方程组的系数矩阵
//b 长度为n 的一维数组,存放方程组右端的常数向量
//n 方程组的阶数
//x 长度为n 的一维数组,返回方程组的解
//eps 给定的精度要求
int ckgsdl(double a[],double b[],int n,double x[],double eps)
{
int i,j,u,v;
    double p,t,s,q;
    for (i=0; i<=n-1; i++)
{
  u=i*n+i; p=0.0; x=0.0;
        for (j=0; j<=n-1; j++)
  {
   if (i!=j)
            {
    v=i*n+j; p=p+fabs(a[v]);
   }
  }
        if (p>=fabs(a))
  {
   printf("fail\n"); return(-1);
  }
}
    p=eps+1.0;
    while (p>=eps)
{
  p=0.0;
        for (i=0; i<=n-1; i++)
  {
   t=x; s=0.0;
            for (j=0; j<=n-1; j++)
   {
    if (j!=i)
    {
     s=s+a[i*n+j]*x[j];
    }
   }
            x=(b-s)/a[i*n+i];
            q=fabs(x-t)/(1.0+fabs(x));
            if (q>p)
   {
    p=q;
   }
  }
}
    return(1);
}
 楼主| 发表于 2005-1-19 22:45:45 | 显示全部楼层
//求解线性最小二乘问题的Householder变换法
//a m*n 存放超定方程组的系数矩阵,返回时存放QR分解式中的R矩阵
//m 系数矩阵的行数 (m>=n)
//n 系数矩阵的列数 (m>=n)
//b 长度为m 的数组,存放方程组右端常数向量,返回时前n个元素存放方程组的最小二乘解
//q m*m 工作矩阵,返回时存放QR QR分解式中的Q矩阵
//返回值为0表示程序工作失败,不为0表示正常返回
//调用:dkqr()
int clgmqr(double a,int m,int n,double b,double q)
{
int i,j;
    double d,*c;
    extern int dkqr();
    c=malloc(n*sizeof(double));
    i=dkqr(a,m,n,q);
    if (i==0)
{
  free(c); return(0);
}
    for (i=0; i<=n-1; i++)
{
  d=0.0;
        for (j=0; j<=m-1; j++)
  {
   d=d+q[j*m+i]*b[j];
  }
        c=d;
}
    b[n-1]=c[n-1]/a[n*n-1];
    for (i=n-2; i>=0; i--)
{
  d=0.0;
        for (j=i+1; j<=n-1; j++)
  {
   d=d+a[i*n+j]*b[j];
  }
        b=(c-d)/a[i*n+i];
}
    free(c); return(1);
}
 楼主| 发表于 2005-1-19 22:46:06 | 显示全部楼层

//求解线性最小二乘问题的广义逆法
//a m*n 存放超定方程组的系数矩阵,返回时对角线依次给出奇异值o0,o1,o2...,op,其余元素为0
//m 系数矩阵的行数
//n 系数矩阵的列数
//b 长度为m 的数组,存放方程组右端常数向量
//x 长度为n 的数组,返回时存放方程组的最小二乘解
//aa n*m ,返回时存放系数矩阵的广义逆
//eps 奇异值分解函数中控制精度要求
//u m*m 工作矩阵,返回时存放系数矩阵的奇异值分解式中的左奇异向量
//v m*m 工作矩阵,返回时存放系数矩阵的奇异值分解式中的右奇异向量
//ka ka=max(m,n)+1
//返回值为0表示程序工作失败,不为0表示正常返回
//调用:dluav(),dginv()
int cmgm(double a[],int m,int n,double b[],double x[],double aa[],double eps,double u[],double v[],int ka)
{
int i,j;
    extern int dginv();
    i=dginv(a,m,n,aa,eps,u,v,ka);
    if (i<0)
    {
  return(-1);
}
    for (i=0; i<=n-1; i++)
{
  x=0.0;
        for (j=0; j<=m-1; j++)
  {
   x=x+aa[i*m+j]*b[j];
        }
}
    return(1);
}
 楼主| 发表于 2005-1-19 22:46:19 | 显示全部楼层
//////////////////////////////////////////////////////////////
// 全选主元高斯消去法
//a-n*n 存放方程组的系数矩阵,返回时将被破坏
//b-常数向量
//x-返回方程组的解向量
//n-存放方程组的阶数
//返回0表示原方程组的系数矩阵奇异
int cagaus(double a[],double b[],int n,double x[]);
//////////////////////////////////////////////////////////////
//复系数方程组的全选主元高斯消去法
//ar-n*n存放复系数矩阵的实部,要被破坏
//ai-n*n存放复系数矩阵的虚部,要被破坏
//n-方程组的阶数
//br-存放方程组右端复常数向量的实部,返回时存放解向量的实部
//bi-存放方程组右端复常数向量的虚部,返回时存放解向量的虚部
//返回值0表示系数矩阵奇异
int cbcgaus(double ar[],double ai[],int n,double br[],double bi[]);
//////////////////////////////////////////////////////////////
//全选主元高斯-约当消去法
//a-n*n 存放方程组的系数矩阵,返回时将被破坏
//b-n*m常数向量,每列为一组,返回时存放m组解向量
//n-方程组的阶数
//m-方程组右端常数向量的个数
//返回0表示原方程组的系数矩阵奇异
int ccgj(double a[],double b[],int n,int m);
//////////////////////////////////////////////////////////////
//复系数全选主元高斯-约当消去法
//ar-n*n 存放方程组的系数矩阵的实部,返回时将被破坏
//ai-n*n 存放方程组的系数矩阵的虚部,返回时将被破坏
//br-n*m常数向量的实部,每列为一组,返回时存放m组解向量的实部
//bi-n*m常数向量的虚部,每列为一组,返回时存放m组解向量的虚部
//n-方程组的阶数
//m-方程组右端常数向量的个数
//返回0表示原方程组的系数矩阵奇异
int cdcgj(double ar[],double ai[],double br[],double bi[],int n,int m);
//////////////////////////////////////////////////////////////
//求解三对角线方程组的追赶法
//存放三对角线矩阵中三对角线上的元素
//存放顺序为a00,a01,a10,a11,a12,a21,a22,a23,...,an-1,n-2,an-1,n-1
//就是按行依次存储
//n-方程组的阶数
//m-b的长度,应为m=3n-2,本函数中用来做检验
//d-存放方程组右端常数向量,返回时存放解向量
int cetrd(double b[],int n,int m,double d[]);
//////////////////////////////////////////////////////////////
//一般带型方程组的求解
//n-方程组的阶数
//l-系数矩阵的半带宽
//il-系数矩阵的带宽,应为il=2l+1
//m-方程组右端的常数
int cfband(double b[],double d[],int n,int l,int il,int m);
//////////////////////////////////////////////////////////////
//求解对称方程组的分解法
//a n*n数组,存放方程组的系数矩阵(应为对称矩阵)
//n 方程组的阶数
//m 方程组右端常数向量的个数
//c n*m 存放方程组右端的m组常数向量;返回时存放方程组的m组解向量
//返回值小于0表示程序工作失败,大于0表示正常返回
int cgldl(double a[],int n,int m,double c[]);
//////////////////////////////////////////////////////////////
//求解对称正定方程组的平方根法
//用Cholesky分解法(即平方根法)
//a n*n 存放系数矩阵(应为对称正定矩阵),返回时其上三角部分存放分解后的U矩阵
//n 方程的阶数
//m 方程组有短的常数向量的个数
//d n*m 存放方程组右端m组常数向量;返回时,存放方程组的m组解向量
//返回值小于0,表示程序工作失败
int chchol(double a[],int n,int m,double d[]);
//////////////////////////////////////////////////////////////
//求解大型稀疏方程组的全选主元高斯-约当消去法
//只是在消去过程中避免了对零元素的运算,从而可以大大减少运算次数
//本函数不考虑系数矩阵的压缩存储问题
//a n*n数组,存放方程组的系数矩阵,返回时要被破坏
//n 方程组的阶数
//d-存放方程组右端常数向量,返回时存放解向量
//返回值为0表示系数矩阵奇异
int ciggj(double a[],int n,double b[]);
//////////////////////////////////////////////////////////////
//求解Toeplitz型方程组的Levinson递推算法
//t 长度为n 的一维数组,存放对称T型矩阵中的元素t0,t1,...tn-1
//n 方程组的阶数
//b 长度为n 的一维数组,存放方程组右端的常数向量
//x 长度为n 的一维数组,返回方程组的解
//返回值小于0表示程序工作失败
int cjtlvs(double t[],int n,double b[],double x[]);
//////////////////////////////////////////////////////////////
//Gauss-Seidel迭代法求解系数矩阵具有主对角线占绝对优势的线性代数方程组
//a n*n数组,存放方程组的系数矩阵
//b 长度为n 的一维数组,存放方程组右端的常数向量
//n 方程组的阶数
//x 长度为n 的一维数组,返回方程组的解
//eps 给定的精度要求
int ckgsdl(double a[],double b[],int n,double x[],double eps);
//////////////////////////////////////////////////////////////
//求解线性最小二乘问题的Householder变换法
//a m*n 存放超定方程组的系数矩阵,返回时存放QR分解式中的R矩阵
//m 系数矩阵的行数 (m>=n)
//n 系数矩阵的列数 (m>=n)
//b 长度为m 的数组,存放方程组右端常数向量,返回时前n个元素存放方程组的最小二乘解
//q m*m 工作矩阵,返回时存放QR QR分解式中的Q矩阵
//返回值为0表示程序工作失败,不为0表示正常返回
//调用:dkqr()
int clgmqr(double a,int m,int n,double b,double q);
//////////////////////////////////////////////////////////////
//求解线性最小二乘问题的广义逆法
//a m*n 存放超定方程组的系数矩阵,返回时对角线依次给出奇异值o0,o1,o2...,op,其余元素为0
//m 系数矩阵的行数
//n 系数矩阵的列数
//b 长度为m 的数组,存放方程组右端常数向量
//x 长度为n 的数组,返回时存放方程组的最小二乘解
//aa n*m ,返回时存放系数矩阵的广义逆
//eps 奇异值分解函数中控制精度要求
//u m*m 工作矩阵,返回时存放系数矩阵的奇异值分解式中的左奇异向量
//v m*m 工作矩阵,返回时存放系数矩阵的奇异值分解式中的右奇异向量
//ka ka=max(m,n)+1
//返回值为0表示程序工作失败,不为0表示正常返回
//调用:dluav(),dginv()
int cmgm(double a[],int m,int n,double b[],double x[],double aa[],double eps,double u[],double v[],int ka);
您需要登录后才可以回帖 登录 | 注-册-帐-号

本版积分规则

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

GMT+8, 2024-11-27 22:41 , Processed in 0.045396 second(s), 12 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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