码迷,mamicode.com
首页 > 其他好文 > 详细

2-2 LU crout 分解

时间:2015-05-04 23:58:34      阅读:263      评论:0      收藏:0      [点我收藏+]

标签:

#include <math.h>
#include "..\CommonFiles\nrutil.h"
#define TINY 1.0e-20;

/* Crout算法
** indx为输出向量,保存部分主元法而改变了行的行排列顺序
** 输出向量d为±1,表示行交换次数为偶数还是为奇数
*/
void ludcmp(float **a, int n, int *indx, float *d) {
    int i,imax,j,k;
    float big,dum,sum,temp;
    float *vv;              /* 用于保存每行的内含比例因子*/

    vv=vector(1,n);

    *d=1.0;
    for (i=1; i<=n; i++) {  /* 按行循环,求内含比例因子(每一行最大元素的倒数)*/
        big=0.0;
        for (j=1; j<=n; j++)
            if ((temp=fabs(a[i][j])) > big) big=temp;
        if (big == 0.0) nrerror("Singular matrix in routine ludcmp");
        vv[i]=1.0/big;
    }

    for (j=1; j<=n; j++) {            /* 外层列循环*/
        for (i=1; i<j; i++) {        /* 上三角部分*/
            sum=a[i][j];
            for (k=1; k<i; k++) 
                sum -= a[i][k]*a[k][j];
            a[i][j]=sum;
        }
        big=0.0;                       /* 初始化最大主元*/
        for (i=j; i<=n; i++) {      /* i >= j 下三角部分*/
            sum=a[i][j];
            for (k=1; k<j; k++)
                sum -= a[i][k]*a[k][j];
            a[i][j]=sum;
            if ( (dum=vv[i]*fabs(sum)) >= big) {
                big=dum;
                imax=i;
            }
        }
        if (j != imax) {            /* 是否进行交换?*/
            for (k=1; k<=n; k++) {
                dum=a[imax][k];
                a[imax][k]=a[j][k];
                a[j][k]=dum;
            }
            *d = -(*d);             /* 改变d的奇偶性*/
            vv[imax]=vv[j];
        }
        indx[j]=imax;
        if (a[j][j] == 0.0) a[j][j]=TINY;
        if (j != n) {
            dum=1.0/(a[j][j]);
            for (i=j+1; i<=n; i++) a[i][j] *= dum;
        }
    }

    free_vector(vv,1,n);
}
#undef TINY

 

2-2 LU crout 分解

标签:

原文地址:http://www.cnblogs.com/dLong/p/4477945.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!