#include stdlib.h
#include math.h
/*楼竞网站
拥有该程序的版权,转载请保留该版权.
谢谢合作!*/
double* allocMem(int ); //分配内存空间函数
void GaussLineMain(double*,double*,double*,int );//采用高斯列主元素消去法求解x的初始向量值
void Jacobi(double*,double*,double*,double*,int,int);//利用雅可比迭代公式求解x的值
void main()
{
short matrixNum; //矩阵的行数(列数)
double *matrixA; //矩阵Ac语言解线性方程组函数,初始系数矩阵
double *matrixD; //矩阵D为A中的主对角阵
double *matrixL; //矩阵L为A中的下三角阵
double *matrixU; //矩阵U为A中的上三角阵
double *B;//矩阵B为雅可比方法迭代矩阵
double *f;//矩阵f为中间的过渡的矩阵
double *x;//x为一维数组c语言解线性方程组函数,存放结果
double *xk;//xk为一维数组,用来在迭代中使用
double *b;//b为一维数组 , 存放方程组右边系数
int i,j,k;
cout"请输入矩阵的行数(列数与行数一致)c语言解线性方程组函数:";
cinmatrixNum;
//分别为A、D、L、U、B、f、x、b分配内存空间
matrixA=allocMem(matrixNum*matrixNum);
matrixD=allocMem(matrixNum*matrixNum);
matrixL=allocMem(matrixNum*matrixNum);
matrixU=allocMem(matrixNum*matrixNum);
B=allocMem(matrixNum*matrixNum);
f=allocMem(matrixNum);
x=allocMem(matrixNum);
xk=allocMem(matrixNum);
b=allocMem(matrixNum);
//输入系数矩阵各元素值
coutendlendlendl"请输入矩阵中各元素值(为 "matrixNum"*"matrixNum",共计 "matrixNum*matrixNum" 个元素)"":"endlendl;
for(i=0;imatrixNum;i++)
{
cout"请输入矩阵中第 "i+1" 行的 "matrixNum" 个元素:";
for(j=0;jmatrixNum;j++)
cin*(matrixA+i*matrixNum+j);
}
//输入方程组右边系数b的各元素值
coutendlendlendl"请输入方程组右边系数各元素值,共计 "matrixNum" 个"":"endlendl;
for(i=0;imatrixNum;i++)
cin*(b+i);
/*下面将A分裂为A=D-L-U */
//首先将D、L、U做初始化工作
for(i=0;imatrixNum;i++)
for(j=0;jmatrixNum;j++)
*(matrixD+i*matrixNum+j)=*(matrixL+i*matrixNum+j)=*(matrixU+i*matrixNum+j)=0;
//D、L、U分别得到A的主对角线、下三角和上三角c语言解线性方程组函数;其中D取逆矩阵、L和U各元素取相反数
for(i=0;imatrixNum;i++)
for(j=0;jmatrixNum;j++)
if(i==j*(matrixA+i*matrixNum+j)) *(matrixD+i*matrixNum+j)=1/(*(matrixA+i*matrixNum+j));
else if(ij) *(matrixL+i*matrixNum+j)=-*(matrixA+i*matrixNum+j);
else *(matrixU+i*matrixNum+j)=-*(matrixA+i*matrixNum+j);
//求B矩阵中的元素
for(i=0;imatrixNum;i++)
for(j=0;jmatrixNum;j++)
{
double temp=0;
for(k=0;kmatrixNum;k++)
temp+=*(matrixD+i*matrixNum+k)*(*(matrixL+k*matrixNum+j)+*(matrixU+k*matrixNum+j));
*(B+i*matrixNum+j)=temp;
}
//求f中的元素
for(i=0;imatrixNum;i++)
{
double temp=0;
for(j=0;jmatrixNum;j++)
temp+=*(matrixD+i*matrixNum+j)*(*(b+j));
*(f+i)=temp;
}
/*计算x的初始向量值 */
GaussLineMain(matrixA,x,b,matrixNum);
/* 利用雅可比迭代公式求解xk的值 */
int JacobiTime;
coutendlendlendl"雅可比迭代开始,请输入希望迭代的次数:";
cinJacobiTime;
while(JacobiTime=0)
{
cout"迭代次数必须大于0 , 请重新输入:";
cinJacobiTime;
}
Jacobi(x,xk,B,f,matrixNum,JacobiTime);
//输出线性方程组的解 */
coutendlendlendl"方程组运算结果如下"endl;
cout.precision(20); //设置输出精度,以此比较不同迭代次数的结果
for(i=0;imatrixNum;i++)
cout"x"i+1" = "*(xk+i)endl;
推荐阅读
- stem建筑经营游戏,建筑经营类游戏排行
- gis如何多选属性,gis属性表选择多个要素
- 别墅酒店拍照软件免费ios,酒店别墅设计图
- 快手直播伴侣模板怎么没有,快手直播伴侣直播为什么没有声音
- vb.net调用一个按键 vb单击窗体代码
- 老年手机静音怎么找到,老年手机静音怎么恢复
- 小学课间桌面小游戏大全,小学课间桌面小游戏大全简单
- 微信视频号是啥东西呀,微信视频号是什么鬼
- go语言和php哪个难 go和php性能比较