[数值算法]线性方程组求解算法---基于LU分解法的追赶法

[数值算法]线性方程组求解算法---基于LU分解法的追赶法

                                                                                                  By EmilMatthew

                                                                                                             05/9/08

       基于LU分解法的追赶法主要用于求解一类形式上特殊的线性方程组。

Ax=b,其中,|i-j|>1时,有aij=0.求解这类形式的线性方程组,在样条函数,常微分方程边值问题的数值解中都会有用.

       原理上仍是考虑将这个矩阵分成LU两个矩阵,不过,由于这个矩阵存大着大量的0值元素,所以,给最终的递推求解带来了相当大的便利.

       更加详细的内容请去参考相应的数值算法书籍.

/*This function :chasingMethod is coded by EmilMatthew,you can use and modify it as you wish,

But I do not pomise it can fit all your need .*/

void chasingMethod(Type** inMatrixArr,Type* bList,Type* xAnsList,int size)

{

      

       /*Core think of this algorithm,this algorithm is just a special version of the LUPationMethod:

       matrix_L*yAnsList=bList;

       matrix_U*xAnsList=yAnsList;

       */

       Type* listA,* listB,* listC;/*to crack the in matrix in three one demision list*/

       Type* listAlpha,* listBeta;/*The tween list for resolve the problem*/

       Type* yAnsList;

       int i,j;

      

       /*pointer data assertion*/

       assertF(inMatrixArr!=NULL,"in LUPationMethod,matrixArr is NULL/n");

       assertF(bList!=NULL,"in LUPationMethod,bList is NULL/n");

       assertF(xAnsList!=NULL,"in LUPationMethod,xAnsList is NULL/n");      

      

       /*The Assertion of the pass in matrix's format.*/

       for(i=0;i<size;i++)

              for(j=i;j<size;j++)

                     if(j-i>1)

                            assertF(inMatrixArr[i][j]==0,"In chasingMethod,the pass in matrix format is not correct/n");

 

       /*Mem Apply*/            

       listArrMemApply(&listA,size);

       listArrMemApply(&listB,size);            

       listArrMemApply(&listC,size);

       listArrMemApply(&listAlpha,size);

       listArrMemApply(&listBeta,size);

       listArrMemApply(&yAnsList,size);             

                    

       /*locate the inMatrixArr data into correct position*/

       listB[0]=inMatrixArr[0][0];

       listC[0]=inMatrixArr[0][1];

       for(i=1;i<size-1;i++)

       {

              listA[i]=inMatrixArr[i][i-1];

              listB[i]=inMatrixArr[i][i];

              listC[i]=inMatrixArr[i][i+1];

       }

      

       listA[size-1]=inMatrixArr[size-1][size-2];

       listB[size-1]=inMatrixArr[size-1][size-1];

      

       /*main program of the chasingMethod*/            

       listAlpha[0]=listB[0];

       listBeta[0]=listC[0]/listAlpha[0];

       for(i=1;i<size-1;i++)

       {

              listAlpha[i]=listB[i]-listA[i]*listBeta[i-1];

              listBeta[i]=listC[i]/listAlpha[i];

       }

       listAlpha[i]=listB[i]-listA[i]*listBeta[i-1];      

 

       /*To get the yAnsList*/

       yAnsList[0]=bList[0]/listAlpha[0];

      

       for(i=1;i<size;i++)

              yAnsList[i]=(bList[i]-listA[i]*yAnsList[i-1])/listAlpha[i];

       showArrListFloat(yAnsList,0,size);

 

       /*To get the xAnsList*/

       xAnsList[size-1]=yAnsList[size-1];

       for(i=size-2;i>=0;i--)

              xAnsList[i]=yAnsList[i]-listBeta[i]*xAnsList[i+1];

      

       /*Mem Free*/

       free(listA);

       free(listB);

       free(listC);

       free(listAlpha);

       free(listBeta);

       free(yAnsList);             

}

 

/*算法简单测试*/

//inputData

3;

2,1,0,3;

1,3,1,5;

0,1,2,3;

 

//ouputData:

after the chasingMethod:the ans x rows is:(from x0 to xn-1)

1.00000    1.00000    1.00000

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值