c语言解线性方程组函数 c++线性方程组求解( 四 )


coutendlendl"求解过程结束..."endlendl;
//释放掉所有动态分配的内存
delete [] matrixA;
delete [] matrixD;
delete [] matrixL;
delete [] matrixU;
delete [] B;
delete [] f;
delete [] x;
delete [] xk;
delete [] b;
}
/*--------------------
分配内存空间函数
--------------------*/
double* allocMem(int num)
{
double *head;
if((head=new double[num])==NULL)
{
cout"内存空间分配失败,程序终止运行!"endl;
exit(0);
}
return head;
}
/*---------------------------------------------
计算Ax=b中x的初始向量值 , 采用高斯列主元素消去法
---------------------------------------------*/
void GaussLineMain(double* A,double* x,double* b,int num)
{
int i,j,k;
//共处理num-1行
for(i=0;inum-1;i++)
{
//首先每列选主元,即最大的一个
double lineMax=fabs(*(A+i*num+i));
int lineI=i;
for(j=i;jnum;j++)
if(fabs(*(A+j*num+i))fabs(lineMax)) lineI=j;
//主元所在行和当前处理行做行交换,右系数b也随之交换
for(j=i;jnum;j++)
{
//A做交换
lineMax=*(A+i*num+j);
*(A+i*num+j)=*(A+lineI*num+j);
*(A+lineI*num+j)=lineMax;
//b中对应元素做交换
lineMax=*(b+i);
*(b+i)=*(b+lineI);
*(b+lineI)=lineMax;
}
if(*(A+i*num+i)==0) continue; //如果当前主元为0 , 本次循环结束
//将A变为上三角矩阵 , 同样b也随之变换
for(j=i+1;jnum;j++)
{
double temp=-*(A+j*num+i)/(*(A+i*num+i));
for(k=i;knum;k++)
{
*(A+j*num+k)+=temp*(*(A+i*num+k));
}
*(b+j)+=temp*(*(b+i));
}
}
/* 验证Ax=b是否有唯一解,就是验证A的行列式是否为0;
如果|A|!=0,说明有唯一解*/
double determinantA=1;
for(i=0;inum;i++)
determinantA*=*(A+i*num+i);
if(determinantA==0)
{
coutendlendl"通过计算,矩阵A的行列式为|A|=0,即A没有唯一解 。\n程序退出..."endlendl;
exit(0);
}
/* 从最后一行开始,回代求解x的初始向量值 */
for(i=num-1;i=0;i--)
{
for(j=num-1;ji;j--)
*(b+i)-=*(A+i*num+j)*(*(x+j));
*(x+i)=*(b+i)/(*(A+i*num+i));
}
}
/*------------------------------------
利用雅可比迭代公式求解x的精确值
迭代公式为:xk=Bx+f
------------------------------------*/
void Jacobi(double* x,double* xk,double* B,double* f,int num,int time)
{
int t=1,i,j;
while(t=time)
{
for(i=0;inum;i++)
{
double temp=0;
for(j=0;jnum;j++)
temp+=*(B+i*num+j)*(*(x+j));
*(xk+i)=temp+*(f+i);
}
//将xk赋值给x,准备下一次迭代
for(i=0;inum;i++)
*(x+i)=*(xk+i);
t++;
}
}
c语言解线性方程组的编程题【做的好会多给分】以下算法的适用条件:A的各阶主子式不为零
另外还可以采用
直接法:
消元法:Gauss-Jordan消元法c语言解线性方程组函数,
分解法:Dolittle分解 (我用的是Courant分解法)c语言解线性方程组函数 , 追赶法,对称正定矩阵的LDL‘分解
----------
迭代法:
Jacobi迭代
Gauss-Seidel迭代
松弛迭代
-----------------
你上网可以搜索一下,或者看看数值计算方面的书
OK, 你看看这个, 另外还加了注释 :
Courant分解算法:
aX = b, 作 A=LU, L是下三角矩阵,U是上三角矩阵
即L =
| L11
| L21 L22
| L31 L32 L33
| ..............
| Ln1 Ln2 ........Lnn
U =
| 1 U12 ..... U1n
| 空格 1 ..... U2n
| 空格 空格 ........

推荐阅读