資源簡介
用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\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
?????文件??????????2??2013-04-18?17:37??Task\Task\Debug\li
............此處省略81個文件信息
評論
共有 條評論