【C/C++】求解线性方程组的雅克比迭代与高斯赛德尔迭代

雅克比迭代:

 /*
方程组求解的迭代法:
雅克比迭代
*/ #include<bits/stdc++.h>
using namespace std; double A[][];
double re[];
void swapA(int i,int j,int n){
//交换第i行与第j行
for(int x = ;x<=n;x++) {
double temp = A[i][x];
A[i][x] = A[j][x];
A[j][x] = temp;
}
} void getResult(int n,double e,int N){
//n个未知参数
for(int i = ;i<n;i++){
//初始化
re[i] = 0.0;
}
//先检验对角线元素是否为0,如果为0则交换某两列
//什么时候会交换失败?
for(int i = ;i<n;i++) {
if(fabs(A[i][i]-)<=1e-){
//如果第i行对角元素等于0
//找第i列不为0的一列与其交换
int j;
for(j = ;j<n;j++){
if(fabs(A[j][i]-)>1e-){
swapA(i,j,n);
break;
}
}
if(j>=n){
printf("系数矩阵不合法!\n");
}
i = ;//每次从头找
}
}
for(int i = ;i<n;i++) {
for(int j = ;j<n+;j++){
printf("%lf ",A[i][j]);
}
cout<<endl;
} //下面迭代
int k = ;
double x[];
//初始化x[i];
for(int i = ;i<n;i++){
x[i] = 0.0;
}
while(k<=N){
k++;
if(k>N) {
printf("迭代失败!\n");
exit();
}
for(int i = ;i<n;i++){
re[i] = A[i][n];
for(int j = ;j<n;j++){
if(j!=i){
re[i] = re[i] - A[i][j]*x[j];
}
}
re[i] = re[i] / A[i][i];
}
//当最大的x误差小于e则退出
double maxXerror = 0.0;
for(int i = ;i<n;i++){
if(fabs(x[i]-re[i]) >maxXerror){
maxXerror = fabs(x[i] - re[i]);
}
}
if(maxXerror < e){
return;
}
printf("第%d步迭代结果:",k);
for(int i = ;i<n;i++) {
printf("%lf ",re[i]);
}
cout<<endl;
//否则,继续
for(int i = ;i<n;i++){
x[i] = re[i];
}
}
} int main() {
printf("--------雅克比迭代--------\n\n");
int x,y;
cout<<"输入未知数个数与方程个数:";
cin>>x>>y;
if(x!=y) {
cout<<"超定或欠定!"<<endl;
return ;
}
//输入增广矩阵
printf("输入增广矩阵:\n");
for(int i = ;i<x;i++){
for(int j = ;j<x+;j++){
cin>>A[i][j];
}
}
//double re[10];
cout<<"输入精度e和最大迭代次数:" ;
double e;
int N;
cin>>e>>N;
getResult(x,e,N);
for(int i = ;i<x;i++){
cout<<re[i]<<" ";
}
}
/*
输入增广矩阵:
10 -1 -2 7.2
-1 10 -2 8.3
-1 -1 5 4.2
输入精度e和最大迭代次数:0.01 100
*/
/*
输入未知数个数与方程个数:4 4
输入增广矩阵:
10 0 1 -5 -7
1 8 -3 0 11
3 2 -8 1 23
1 -2 2 7 17
输入精度e和最大迭代次数:0.01 100
10.000000 0.000000 1.000000 -5.000000 -7.000000
1.000000 8.000000 -3.000000 0.000000 11.000000
3.000000 2.000000 -8.000000 1.000000 23.000000
1.000000 -2.000000 2.000000 7.000000 17.000000
0
1
2
3
4
5
6
7
8
0.998994 0.501136 -1.9985 2.99615
--------------------------------
*/
//当主对角有0
/*
输入未知数个数与方程个数:4 4
输入增广矩阵:
1 8 -3 0 11
10 0 1 -5 -7
3 2 -8 1 23
1 -2 2 7 17
输入精度e和最大迭代次数:0.01 100
10.000000 0.000000 1.000000 -5.000000 -7.000000
1.000000 8.000000 -3.000000 0.000000 11.000000
3.000000 2.000000 -8.000000 1.000000 23.000000
1.000000 -2.000000 2.000000 7.000000 17.000000
0
1
2
3
4
5
6
7
8
0.998994 0.501136 -1.9985 2.99615 */

G-S迭代:

 /*
G-S迭代:
*/
#include<bits/stdc++.h>
using namespace std; double A[][];
double re[];
void swapA(int i,int j,int n){
//交换第i行与第j行
for(int x = ;x<=n;x++) {
double temp = A[i][x];
A[i][x] = A[j][x];
A[j][x] = temp;
}
} void getResult(int n,double e,int N){
//n个未知参数
for(int i = ;i<n;i++){
//初始化
re[i] = 0.0;
}
//先检验对角线元素是否为0,如果为0则交换某两列
//什么时候会交换失败?
for(int i = ;i<n;i++) {
if(fabs(A[i][i]-)<=1e-){
//如果第i行对角元素等于0
//找第i列不为0的一列与其交换
int j;
for(j = ;j<n;j++){
if(fabs(A[j][i]-)>1e-){
swapA(i,j,n);
break;
}
}
if(j>=n){
printf("系数矩阵不合法!\n");
}
i = ;//每次从头找
}
}
for(int i = ;i<n;i++) {
for(int j = ;j<n+;j++){
printf("%lf ",A[i][j]);
}
cout<<endl;
} //下面迭代
int k = ;
double x[];
//初始化x[i];
for(int i = ;i<n;i++){
x[i] = 0.0;
}
while(k<=N){
// printf("%d\n",k);
k++;
if(k>N) {
printf("迭代失败!\n");
exit();
}
for(int i = ;i<n;i++){
re[i] = A[i][n];
for(int j = ;j<i;j++){
re[i] = re[i] - A[i][j]*re[j];
}
for(int j = i+;j<n;j++){
re[i] = re[i] - A[i][j]*x[j];
}
re[i] = re[i] / A[i][i];
}
//当最大的x误差小于e则退出
double maxXerror = 0.0;
for(int i = ;i<n;i++){
if(fabs(x[i]-re[i]) >maxXerror){
maxXerror = fabs(x[i] - re[i]);
}
}
if(maxXerror < e){
return;
}
printf("第%d步迭代结果:",k);
for(int i = ;i<n;i++) {
printf("%lf ",re[i]);
}
cout<<endl;
//否则,继续
for(int i = ;i<n;i++){
x[i] = re[i];
}
}
} int main() {
printf("--------G-S迭代--------\n\n");
int x,y;
cout<<"输入未知数个数与方程个数:";
cin>>x>>y;
if(x!=y) {
cout<<"超定或欠定!"<<endl;
return ;
}
//输入增广矩阵
printf("输入增广矩阵:\n");
for(int i = ;i<x;i++){
for(int j = ;j<x+;j++){
cin>>A[i][j];
}
}
//double re[10];
cout<<"输入精度e和最大迭代次数:" ;
double e;
int N;
cin>>e>>N;
getResult(x,e,N);
printf("解是:\n");
for(int i = ;i<x;i++){
cout<<re[i]<<" ";
}
}
//相同的精度,G-S需要6次,而雅克比需要9次
/*
输入未知数个数与方程个数:4 4
输入增广矩阵:
10 0 1 -5 -7
1 8 -3 0 11
3 2 -8 1 23
1 -2 2 7 17
输入精度e和最大迭代次数:0.01 100
10.000000 0.000000 1.000000 -5.000000 -7.000000
1.000000 8.000000 -3.000000 0.000000 11.000000
3.000000 2.000000 -8.000000 1.000000 23.000000
1.000000 -2.000000 2.000000 7.000000 17.000000
0
1
2
3
4
5
6
0.999337 0.500458 -2.00027 3.0003
--------------------------------
*/
上一篇:geohash基本原理


下一篇:374&375. Guess Number Higher or Lower 1&2