C++实现线性方程组求解


用C/C++语言实现如下函数: 1. bool lu(double* a, int* pivot, int n);矩阵的LU分解。 假设数组anxn在内存中按行优先次序存放。此函数使用高斯列选主元消去法将其就地进行LU分解。pivot为输出参数,pivot[0,n) 中存放主元的位置排列。 函数成功时返回false,否则返回true。 2. bool guass(double const* lu, int const* p, double* b, int n);求线代数方程组的解 设矩阵Lunxn为某个矩阵anxn的LU分解,在内存中按行优先次序存放。p[0,n)为LU分解的主元排列。b为方程组Ax=b的右端向量。此函数计算方程组Ax=b的解,并将结果存放在数组b[0,n)中。 函数成功时返回false,否则返回true。 3. void qr(double* a, double* d, int n);矩阵的QR分解 假设数组anxn在内存中按行优先次序存放。此函数使用HouseHolder变换将其就地进行QR分解。 d为输出参数,d [0,n) 中存放QR分解的上三角对角线元素。 4. bool householder(double const*qr, double const*d, double*b, int n); 求线代数方程组的解 设矩阵qrnxn为某个矩阵anxn的QR分解,在内存中按行优先次序存放。d [0,n) 为QR分解的上三角对角线元素。b为方程组Ax=b的右端向量。 函数计算方程组Ax=b的解,并将结果存放在数组b[0,n)中。 函数成功时返回false,否则返回true。
资源截图
代码片段和文件信息
#include “stdafx.h“

bool lu(double* a int* pivot int n)
{
for(int i=0;i int pivotIndex=(n+1)*i;//当前主元位置
int maxCol=i;//当前主元所在行
for(int j=0;j int indexAdd=(j+1)*n;
if(fabs(*(a+maxCol*n+i)) maxCol=i+j+1;
}//选取列主元
}
if(*(a+pivotIndex)==0){
break;
return true;
}//主元为0,行列式为0,不可分解

if(maxCol!=i){
    for(int k=0;k     double doubleTemp;
    doubleTemp=*(a+i*n+k);
    *(a+i*n+k)=*(a+maxCol*n+k);
    *(a+maxCol*n+k)=doubleTemp;
    }//两行互换

//更新主元向量
    int intTemp=*(pivot+i);
    *(pivot+i)=*(pivot+maxCol);
    *(pivot+maxCol)=intTemp;
}

//消去
for(int j=0;j double multiple=*(a+pivotIndex+n*j+n)/(*(a+pivotIndex));
*(a+pivotIndex+n*j+n)=multiple;
for(int k=1;k     *(a+pivotIndex+n*j+n+k)-=(*(a+pivotIndex+k))*multiple;
}
}
}
return false;
}

void convert_b_lu(double const* ludouble* bint const* pivotint n){
//变换右端向量,根据消元过程刷新右端向量
for(int i=0;i for(int j=0;j *(b+(*(pivot+i+j+1)))-=(*(b+(*(pivot+i))))*(*(lu+(n+1)*i+n*(j+1)));
}
}

//根据主元选择过程变换右端向量元素位置
double* temp=new double[n];
for(int i=0;i *(temp+i)=*(b+i);
}
for(int i=0;i *(b+i)=*(temp+(*(pivot+i)));
}

delete[] temp;
}

bool guass(double const* lu int const* p double* b int n)
{
convert_b_lu(lubpn);
    *(b+n-1)=(*(b+n-1))/(*(lu+n*n-1));
//迭代
for(int i=5;i>0;i--){
for(int j=0;j *(b+i-1)=(*(b+i-1))-(*(b+n-j-1))*(*(lu+(n+1)*(i-1)+j+1));
}
*(b+i-1)=(*(b+i-1))/(*(lu+(n+1)*(i-1)));
}
return false;
}

void qr(double* a double* d int n)
{
double temp1temp2;
double* temp=new double[n];
for(int i=0;i    {
temp1=0;
        for(int j=i;j     temp1+=(*(a+j*n+i))*(*(a+j*n+i));

if(*(a+n*i+i)>0)
temp1=-sqrt(temp1);
    else 
        temp1=sqrt(temp1);


        *(d+i)=temp1;//存储主元
        *(a+i*n+i)-=temp1;

temp2=0;
for(int j=i; j<=n-1; j++)
            temp2+=(*(a+n*j+i))*(*(a+n*j+i));
temp2= sqrt(temp2);
for(int j=i; j<=n-1; j++)
    *(a+n*j+i)=(*(a+n*j+i))/temp2 ;

        for(int j=i+1;j  { 
      for(int k=i; k     {
     temp2=0 ;
     for(int l=i; l          temp2+=(*(a+n*k+i))*(*(a+n*l+i))*(*(a+n*l+j));
        *(temp+k)=(*(a+k*n+j))-2*temp2;
     }
     for(int k=i; k       *(a+k*n+j)=*(temp+k);
   }
     }
     *(d+n-1)=*(a+n*n-1); 
 delete[] temp;
}

bool householder(double const*qr double const*d double*b int n)
{
double doubleTemp;
double* temp=new double[n];

for(int i=0; i {
for(int j=i; j {
doubleTemp=0;
for(int k=i;k doubleTemp+=(*(qr+n*k+i))*(*(qr+n*j+i))*(*(b+k));
*(temp+j)=*(b+j)-2*doubleTemp;
}
for(int j=i; j *(b+j)=*(temp+

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      75776  2013-04-18 17:37  TaskDebugTask.exe

     文件     424560  2013-04-18 17:37  TaskDebugTask.ilk

     文件    1256448  2013-04-18 17:37  TaskDebugTask.pdb

     文件   36372480  2013-04-13 18:57  Taskipch ask-2269b20e ask-efa8f59f.ipch

     文件   36438016  2013-04-18 17:35  Taskipch ask-6e8e7c8e ask-efa8f59f.ipch

     文件       4006  2013-04-18 17:37  TaskTaskDebugcl.command.1.tlog

     文件      19726  2013-04-18 17:37  TaskTaskDebugCL.read.1.tlog

     文件       1318  2013-04-18 17:37  TaskTaskDebugCL.write.1.tlog

     文件     113893  2013-04-18 17:37  TaskTaskDebugfunctions.obj

     文件          2  2013-04-18 17:37  TaskTaskDebuglink-cvtres.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink-cvtres.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink-rc.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink-rc.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.13556-cvtres.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.13556-cvtres.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.13556-rc.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.13556-rc.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.13556.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.13556.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.14760-cvtres.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.14760-cvtres.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.14760-rc.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.14760-rc.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.14760.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.14760.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.1596-cvtres.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.1596-cvtres.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.1596-rc.read.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.1596-rc.write.1.tlog

     文件          2  2013-04-18 17:37  TaskTaskDebuglink.1596.read.1.tlog

............此处省略81个文件信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)