• 大小: 14.97MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-07-31
  • 语言: C/C++
  • 标签: 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  Task\Debug\Task.exe

     文件     424560  2013-04-18 17:37  Task\Debug\Task.ilk

     文件    1256448  2013-04-18 17:37  Task\Debug\Task.pdb

     文件   36372480  2013-04-13 18:57  Task\ipch\task-2269b20e\task-efa8f59f.ipch

     文件   36438016  2013-04-18 17:35  Task\ipch\task-6e8e7c8e\task-efa8f59f.ipch

     文件       4006  2013-04-18 17:37  Task\Task\Debug\cl.command.1.tlog

     文件      19726  2013-04-18 17:37  Task\Task\Debug\CL.read.1.tlog

     文件       1318  2013-04-18 17:37  Task\Task\Debug\CL.write.1.tlog

     文件     113893  2013-04-18 17:37  Task\Task\Debug\functions.obj

     文件          2  2013-04-18 17:37  Task\Task\Debug\link-cvtres.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link-cvtres.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link-rc.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link-rc.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.13556-cvtres.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.13556-cvtres.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.13556-rc.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.13556-rc.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.13556.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.13556.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.14760-cvtres.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.14760-cvtres.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.14760-rc.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.14760-rc.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.14760.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.14760.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.1596-cvtres.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.1596-cvtres.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.1596-rc.read.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.1596-rc.write.1.tlog

     文件          2  2013-04-18 17:37  Task\Task\Debug\link.1596.read.1.tlog

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

评论

共有 条评论