xqinghua.h

来自「该程序是用vc开发的对动态数组进行管理的DLL」· C头文件 代码 · 共 1,591 行 · 第 1/5 页

H
1,591
字号
/*                                                               
  int aggje(a,n,b)
  int n;
  double a[],b[];

1.9求解大型稀疏方程组的全选主无高斯-约当消去法

a-双精度实型二维数组,体积为n*n。存放方程组的系数矩阵。此数组在本函数中要被破坏。
n-整型变量。方程组的阶数。
b-双精度实型一维数组,长度为n。存放方程组右端的常数向量;返回时存放方程组的解。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
*/
/*--  Example (函数实例) --*/
/*

  #include "stdio.h"
  #include "aggje.c"
  main()
  { int i;
    static double a[8][8]={ {0.0,0.0,-1.0,0.0,0.0,0.0,2.0,0.0},
                         {0.0,6.0,0.0,0.0,0.0,-6.0,0.0,0.0},
                         {0.0,0.0,0.0,2.0,0.0,0.0,0.0,-4.0},
                         {3.0,0.0,0.0,0.0,-2.0,0.0,1.0,0.0},
                         {0.0,0.0,6.0,0.0,0.0,0.0,5.0,0.0},
                         {1.0,0.0,0.0,0.0,-3.0,0.0,0.0,2.0},
                         {0.0,4.0,0.0,-1.0,0.0,0.0,0.0,0.0},
                         {0.0,0.0,1.0,0.0,-1.0,0.0,0.0,-2.0}};
    static double b[8]={4.0,6.0,-8.0,-2.0,27.0,-9.0,2.0,-4.0};
    if (aggje(a,8,b)!=0)
      for (i=0; i<=7; i++)
        printf("x(%d)=%13.7e\n",i,b[i]);
  }

*/
/*-- Result (运行结果) --*/
/*
x(0)= 1.000000e+00
x(1)= 0.000000e+00
x(2)= 2.000000e+00
x(3)=-2.000000e+00
x(4)= 4.000000e+00
x(5)=-1.000000e+00
x(6)= 3.000000e+00
x(7)= 1.000000e+00
*/


/*------------  define (函数原型定义)  ---------------------------*/                                                               
  int agjdn(double *a,double *b,int n,int m);  
/*                                                               
  int agjdn(a,b,n,m)
  int n,m;
  double a[],b[];

1.2全选高元高斯 - 约当消去法

函数语句
int agjdn(a,b,n,m)

本函数返回一个整型标志值。若返回的标志值为0,则表示系数矩阵为奇异,输出信息为"fail";若返回的标志值不为0,则表示正常返回。

形参说明
a-双精度实型二维数组,体积为n*n。存放方程组的系数矩阵,在本函数中要被破坏。
b-双精度实型二维数组,体积为n*m。存放方程组右边m组常数向量(一列为一组);返回时存放m组解向量(一列为一组)。
n-整型变量。方程组的阶数。
m-整型变量。方程组右端常数向量的个数。
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
*/
/*--  Example (函数实例) --*/
/*

  #include "stdio.h"
  #include "agjdn.c"
  main()
  { int i;
    static double a[4][4]={ {1.0,3.0,2.0,13.0},
                            {7.0,2.0,1.0,-2.0},
                            {9.0,15.0,3.0,-2.0},
                            {-2.0,-2.0,11.0,5.0}};
    static double b[4][2]={ {9.0,0.0},{6.0,4.0},
                            {11.0,7.0},{-2.0,-1.0}};
    if (agjdn(a,b,4,2)!=0)
      for (i=0;i<=3;i++)
        printf("x(%d)=%13.7e,  %13.7e\n",i,b[i][0],b[i][1]);
  }

*/
/*-- Result (运行结果) --*/
/*
x(0)= 9.807447e-01,   4.979313e-01
x(1)= 2.679822e-01,   1.444940e-01
x(2)=-2.226289e-01,   6.285805e-02
x(3)= 5.892743e-01,  -8.131763e-02
*/


/*------------  define (函数原型定义)  ---------------------------*/  
  int agmiv(double *a,int m,int n,double *b,double *x,double *aa,double eps,double *u,double *v,int ka);  
/*  
  int agmiv(a,m,n,b,x,aa,eps,u,v,ka)
  int m,n,ka;
  double a[],b[],x[],aa[],u[],v[],eps;

1.14  求解线性最小二乘问题的广义逆法

a--双精度实型二维数组,体积为m x n。存放超定方程组的系数矩阵A;返回时其
对角线依次给出奇异值。o小l,.-,6p,其余元素均为零o
m--整型变量。系数矩阵A的行数。
n--整型变量。系数矩阵A的列数。
b--双精度实型一维数组,长度为m。存放超定方程组右端常数向量。
x--双精度实型一维数组,长度为n。返回时存放超定方程组的最小二乘解。
aa--双精度实型二维数组,体积为n*m。返回时存放系数矩阵A的广义逆A+。
eps--双精度实型变量。奇异值分解函数中的控制精度要求。
u--双精度实型二维数组,体积为m x m。返回时存放系数矩阵A的奇异值分解式
   中的左奇异向量U。
v--双精度实型二维数组,体积为n x n。返回时存放系数矩阵A的奇异值分解式中
   的右奇异向量vT。
ka--整型变量。ka=max(m,n)+1
                                                                                                                                                                                                                                                           
*/
/*--  Example (函数实例) --*/
/*

  #include "stdio.h"
  #include "agmiv.c"
  #include "bginv.c"
  #include "bmuav.c"
  main()
  { int i,m,n,ka;
    static double x[3],aa[3][4],u[4][4],v[3][3];
    static double a[4][3]={ {1.0,1.0,-1.0},{2.0,1.0,0.0},
                            {1.0,-1.0,0.0},{-1.0,2.0,1.0}};
    static double b[4]={2.0,-3.0,1.0,4.0};
    double eps;
    m=4; n=3; ka=5; eps=0.000001;
    i=agmiv(a,m,n,b,x,aa,eps,u,v,ka);
    if (i>0)
      { for (i=0; i<=2; i++)
          printf("x(%d)=%13.7e\n",i,x[i]);
        printf("\n");
        printf("MAT A+ :\n");
        for (i=0; i<=2; i++)
          printf("%13.7e %13.7e %13.7e %13.7e\n",
                  aa[i][0],aa[i][1],aa[i][2],aa[i][3]);
        printf("\n");
      }
  }

*/
/*-- Result (运行结果) --*/
/*
x(0)=-1.190476e+00
x(1)= 9.523810e-01
x(2)=-6.666667e-01

MAT A+ :
-4.761905e-02  3.809524e-01  2.380952e-01 -4.761905e-02
 2.380952e-01  9.523810e-02 -1.904762e-01  2.380952e-01
-6.666667e-01  3.333333e-01  3.333333e-01  3.333333e-01

*/


/*------------  define (函数原型定义)  ---------------------------*/                      
  int agmqr(double *a,int m,int n,double *b,double *q);  
/*                      
  int agmqr(a,m,n,b,q)
  int m,n;
  double a[],b[],q[];

1.13求解线性最小二乘问题的豪斯荷尔德变换法

a--双精度实型二维数组,体积为m*n。存放超定方程组的系数矩阵A;返回时存放
QR分解式中的只短阵。
m--整型变量。系数矩阵A的行数。m>=n。
n--整型变量。系数控阵A的列数。m<=n。
b--双精度实型一维数组,长度为m。存放方程组右端常数向量;返回时存放前n个
素(即b(0),b(1),…,b(n-1))存放方程组的最小二乘解。
q--双精度实型二维数组;体积为m*m。返回时存放QR分解式中的正交矩阵Q 。
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
*/
/*--  Example (函数实例) --*/
/*

  #include "bmaqr.c"
  #include "stdio.h"
  #include "agmqr.c"
  main()
  { int i,m,n;
    static double a[4][3]={ {1.0,1.0,-1.0},{2.0,1.0,0.0},
                            {1.0,-1.0,0.0},{-1.0,2.0,1.0}};
    static double b[4]={2.0,-3.0,1.0,4.0};
    static double q[4][4];
    m=4; n=3;
    i=agmqr(a,m,n,b,q);
    if (i!=0)
      { for (i=0; i<=2; i++)
          printf("x(%d)=%13.7e\n",i,b[i]);
        printf("\n");
        printf("MAT Q IS:\n");
        for (i=0; i<=3; i++)
          printf("%13.7e %13.7e %13.7e %13.7e\n",
                 q[i][0],q[i][1],q[i][2],q[i][3]);
        printf("\n");
        printf("MAT R IS:\n");
        for (i=0; i<=3; i++)
          printf("%13.7e %13.7e %13.7e\n",
                 a[i][0],a[i][1],a[i][2]);
      }
  }

*/
/*-- Result (运行结果) --*/
/*
x(0)=-1.190476e+00
x(1)= 9.523810e-01
x(2)=-6.666667e-01

MAT Q IS:
-3.779645e-01 -3.779645e-01  7.559289e-01  3.779645e-01
-7.559289e-01 -3.779645e-01 -3.779645e-01 -3.779645e-01
-3.779645e-01  3.779645e-01 -3.779645e-01  7.559289e-01
 3.779645e-01 -7.559289e-01 -3.779645e-01  3.779645e-01

MAT R IS:
-2.645751e+00 -1.955901e-16  7.559289e-01
 0.000000e+00 -2.645751e+00 -3.779645e-01
 0.000000e+00  0.000000e+00 -1.133893e+00
 0.000000e+00  0.000000e+00  0.000000e+00
*/


/*------------  define (函数原型定义)  ---------------------------*/                                                               
  void agrad(double *a,int n,double *b,double eps,double *x);  
/*                                                               
  void agrad(a,n,b,eps,x)
  int n;
  double a[],b[],x[],eps;

1.12求解对称正定方程组的共轭梯度法

a-双精度实型二维数组,体积为n*n。存放对称正定矩阵A。
n-整型变量。方程组的阶数。
b-双精度实型一维数组,长度为n。存放方程组右端的常数向量。
Eps-双精度实型变量。控制精度要求。
x-双精度实型一维数组,长度为n。返回方程组的解向量。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
*/
/*--  Example (函数实例) --*/
/*

  #include "stdio.h"
  #include "agrad.c"
  #include "brmul.c"
  main()
  { int i;
    double eps,x[4];
    static double a[4][4]={{5.0,7.0,6.0,5.0},
                           {7.0,10.0,8.0,7.0},
                           {6.0,8.0,10.0,9.0},
                           {5.0,7.0,9.0,10.0}};
    static double b[4]={23.0,32.0,33.0,31.0};
    eps=0.000001;
    agrad(a,4,b,eps,x);
    printf("\n");
    for (i=0; i<=3; i++)
       printf("x[%d]=%e\n",i,x[i]);
    printf("\n");
  }

*/
/*-- Result (运行结果) --*/
/*

x[0]=1.00000e+00
x[1]=1.00000e+00
x[2]=1.00000e+00
x[3]=1.00000e+00

*/


/*------------  define (函数原型定义)  ---------------------------*/                                         
  int agsdl(double *a,double *b,int n,double *x,double eps);  
/*                                         
  int agsdl(a,b,n,x,eps)
  int n;
  double a[],b[],x[],eps;

1.11高斯-赛德尔迭代法

a-双精度实型二维数组,体积为n*n。存放方程组的系数矩阵。
b-双精度实型一维数组,长度为n。存放方程组右端的常数向量。
n-整型变量。方程组的阶数。
x-双精度实型一维数组,长度为n。返回方程组的解。
Eps-双精度实型变量。给定的精度要求。

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
*/
/*--  Example (函数实例) --*/
/*

  #include "stdio.h"
  #include "agsdl.c"
  main()
  { int i;
    double eps;
    static double a[4][4]={ {7.0,2.0,1.0,-2.0},{9.0,15.0,3.0,-2.0},
                          {-2.0,-2.0,11.0,5.0},{1.0,3.0,2.0,13.0}};
    static double x[5],b[4]={4.0,7.0,-1.0,0.0};
    eps=0.000001;
    if (agsdl(a,b,4,x,eps)>0)
      for (i=0;i<=3; i++)
        printf("x(%d)=%13.7e\n",i,x[i]);
  }

*/

⌨️ 快捷键说明

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