回 帖 发 新 帖 刷新版面

主题:有程序能获得LU分解的L和U吗?

使用过IMSL的库函数LFTCG,但是输出只有1个矩阵,并没有输出L和U。
我按照IMSL说明文档也没能从这1个矩阵凑出L和U,找不到L*U等于原来矩阵A的。
比如
A(1,1:3)=(/1,2,1/)
A(2,1:3)=(/2,2,3/)
A(3,1:3)=(/-1,-3,0/)
调用LFTCG进行LU分解后输出:
B(1,1:3)=(/2,2,3/)
B(2,1:3)=(/-0.5,-2,1.5/)
B(3,1:3)=(/0.5,0.5,0.25/)
从B里我怎么也找不到L和U的信息。
是什么原因呢?谢谢!


回复列表 (共8个回复)

沙发

看手册,觉得应该可以的。

板凳

找 徐士良编著的《FORTRAN常用算法程序集》这本书,里面有源代码。
若没找到给我发邮件annie16934@yahoo.com.cn

3 楼

这是QU分解

 请输入系数矩阵的行数、列数
3 3
 请输入系数矩阵(按行输入)
1 2 1
2 2 3
-1 -3 0
           3
   2.000000       2.000000       3.000000
  0.0000000E+00  -2.000000       1.500000
  0.0000000E+00  0.0000000E+00  0.2500000
 输出Q
   1.000000      0.0000000E+00  0.0000000E+00

  0.0000000E+00  -1.000000      0.0000000E+00

  0.0000000E+00  0.0000000E+00   1.000000

 输出U
   2.000000       2.000000       3.000000

  0.0000000E+00   2.000000      -1.500000

  0.0000000E+00  0.0000000E+00  0.2500000

Press any key to continue

4 楼

[quote]找 徐士良编著的《FORTRAN常用算法程序集》这本书,里面有源代码。
若没找到给我发邮件annie16934@yahoo.com.cn[/quote]
谢谢,我去找找看。

5 楼

[quote]这是QU分解

 请输入系数矩阵的行数、列数
3 3
 请输入系数矩阵(按行输入)
1 2 1
2 2 3
-1 -3 0
           3
   2.000000       2.000000       3.000000
  0.0000000E+00  -2.000000       1.500000
  0.0000000E+00  0.0000000E+00  0.2500000
 输出Q
   1.000000      0.0000000E+00  0.0000000E+00

  0.0000000E+00  -1.000000      0.0000000E+00

  0.0000000E+00  0.0000000E+00   1.000000

 输出U
   2.000000       2.000000       3.000000

  0.0000000E+00   2.000000      -1.500000

  0.0000000E+00  0.0000000E+00  0.2500000

Press any key to continue[/quote]
您好,QU是什么意思呢?
您的这个U正好是我程序输出矩阵的上三角,但是Q能拿来作L用么?

6 楼


这是一种满秩分解
我在网上搜了个C语言写的LU分解程序,自己未亲测,你试试看。

一个N阶矩阵的LU分解
键盘输入一个矩阵,对他进行LU分解。源程序可编译运行通过:
#define N  4
#include<stdio.h>
main()
{
 int i,j,r,k;
 float a[N][N],l[N][N],u[N][N];
 float de=0;
 printf("请输入%d*%d矩阵A:\n");
 for(i=1;i<N;i++)
 for(j=1;j<N;j++)
   scanf("%f",&a[i][j]);

 getchar();
 for(j=1;j<N;j++)
 {
  u[1][j]=a[1][j];
  l[j][1]=a[j][1]/u[1][1];
  printf("l[%d][1] is %f\n",j,l[j][1]);
 }

 getchar();

 for(r=2;r<N;r++)
 {
   for(j=r;j<N;j++)
   {
      for(k=1;k<r;k++)
      {
       de+=l[r][k]*u[k][j];
      }
      u[r][j]=a[r][j]-de;
      de=0;
      printf("u[%d][%d] is %f\n",r,j,u[r][j]);
    }
   getchar();
   for(i=r+1;i<N;i++)
   {
      for(k=1;k<r;k++)
      {
       de+=l[i][k]*u[k][r];
      }
      l[i][r]=a[i][r]-de;
      l[i][r]=l[i][r]/u[r][r];
      de=0;
      printf("l[%d][%d] is %f\n",i,r,l[i][r]);
   }
 }
 printf("The L matrix is:\n");
 for(i=1;i<N;i++)
   {
    l[i][i]=1;
   }
 for(i=1;i<N;i++)
   {
    for(j=1;j<N;j++)
    printf("%f  ",l[i][j]);
    printf("\n");
   }
 
 printf("The u matrix is:\n");
 for(i=1;i<N;i++)
   {
    for(j=1;j<N;j++)
     printf("%f  ",u[i][j]);
     printf("\n");
   }
 getchar();
}

7 楼

[quote]
这是一种满秩分解
我在网上搜了个C语言写的LU分解程序,自己未亲测,你试试看。

一个N阶矩阵的LU分解
键盘输入一个矩阵,对他进行LU分解。源程序可编译运行通过:
#define N  4
#include<stdio.h>
main()
{
 int i,j,r,k;
 float a[N][N],l[N][N],u[N][N];
 float de=0;
 printf("请输入%d*%d矩阵A:\n");
 for(i=1;i<N;i++)
 for(j=1;j<N;j++)
   scanf("%f",&a[i][j]);

 getchar();
 for(j=1;j<N;j++)
 {
  u[1][j]=a[1][j];
  l[j][1]=a[j][1]/u[1][1];
  printf("l[%d][1] is %f\n",j,l[j][1]);
 }

 getchar();

 for(r=2;r<N;r++)
 {
   for(j=r;j<N;j++)
   {
      for(k=1;k<r;k++)
      {
       de+=l[r][k]*u[k][j];
      }
      u[r][j]=a[r][j]-de;
      de=0;
      printf("u[%d][%d] is %f\n",r,j,u[r][j]);
    }
   getchar();
   for(i=r+1;i<N;i++)
   {
      for(k=1;k<r;k++)
      {
       de+=l[i][k]*u[k][r];
      }
      l[i][r]=a[i][r]-de;
      l[i][r]=l[i][r]/u[r][r];
      de=0;
      printf("l[%d][%d] is %f\n",i,r,l[i][r]);
   }
 }
 printf("The L matrix is:\n");
 for(i=1;i<N;i++)
   {
    l[i][i]=1;
   }
 for(i=1;i<N;i++)
   {
    for(j=1;j<N;j++)
    printf("%f  ",l[i][j]);
    printf("\n");
   }
 
 printf("The u matrix is:\n");
 for(i=1;i<N;i++)
   {
    for(j=1;j<N;j++)
     printf("%f  ",u[i][j]);
     printf("\n");
   }
 getchar();
}
[/quote]
谢谢您!我去试下~

8 楼

[quote][quote]这是QU分解

 请输入系数矩阵的行数、列数
3 3
 请输入系数矩阵(按行输入)
1 2 1
2 2 3
-1 -3 0
           3
   2.000000       2.000000       3.000000
  0.0000000E+00  -2.000000       1.500000
  0.0000000E+00  0.0000000E+00  0.2500000
 输出Q
   1.000000      0.0000000E+00  0.0000000E+00

  0.0000000E+00  -1.000000      0.0000000E+00

  0.0000000E+00  0.0000000E+00   1.000000

 输出U
   2.000000       2.000000       3.000000

  0.0000000E+00   2.000000      -1.500000

  0.0000000E+00  0.0000000E+00  0.2500000

Press any key to continue[/quote]
您好,QU是什么意思呢?
您的这个U正好是我程序输出矩阵的上三角,但是Q能拿来作L用么?
[/quote]
 不能,可惜, 
L U分解适用于所有满秩矩阵,Q U分解是对称正定矩阵的正交分解,不同的,还是
前面的建议,研究一下,徐世亮的那本书,学习不要偷懒。

我来回复

您尚未登录,请登录后再回复。点此登录或注册