#include<iostream>
#include<cmath>
using namespace std;
class Serdel{
private:
double* source;
double** iterater;
double* x;
int n;// 迭代矩阵行数/x个数 n+1为矩阵列数
public:
Serdel(double*, int);//原增广矩陣 行数
void buildIter();
double* iterat();
double* next();
void showIter(){
for(int i = 0; i < n; i++){
for(int j = 0; j < n + 1; j++){
cout<<iterater[i][j]<<"\t";
}
cout<<endl;
}
}
void showX(){
for(int i = 0; i < n; i++){
cout<<x[i]<<"\t";
}cout<<endl;
}
~Serdel(){
delete []x;
for(int i = 0; i < n; i++){
delete [](iterater[i]);
}
delete []iterater;
}
};
Serdel::Serdel(double *source, int n):source(source),n(n){
x = new double[n];
for(int i = 0 ; i < n; i++){
x[i] = 0;
}
}
void Serdel::buildIter(){
// 创建迭代矩阵空间 10-5
iterater = new double*[n];
for(int i = 0; i < n; i++){
iterater[i] = new double[n + 1];
}
// 计算迭代矩阵
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(i == j) continue;
// cout<<source[i*n + j];
iterater[i][j] = - source[i*(n+1) + j] / source[i*(n+1) + i];
}
iterater[i][n] = source[i*(n+1) + n] / source[i*(n+1) + i];
iterater[i][i] = 0;
}
}
double* Serdel::next(){
for(int i = 0; i < n; i++){
double temp = 0;
for(int j = 0; j < n; j++){
temp += iterater[i][j]*x[j];
}
temp += iterater[i][n];
x[i] = temp;
}
return x;
}
double* Serdel::iterat(){
double* ox = new double[n];
int out = 0;
do{
out = 0;
for(int i = 0; i < n; i++){
ox[i] = x[i];
}
next();showX();
for(int i = 0; i < n; i++){
if(fabs(ox[i] - x[i]) < 0.00001) out++;
}
}while(out < n);
return x;
}
// 主函数
int main(){
double sou[3][4] = {{10, -1, -2, 7.2},{-1, 10, -2, 8.3},{-1, -1, 5, 4.2}};
Serdel serdel((double*)sou, 3);
serdel.buildIter();
cout<<"迭代矩阵:"<<endl;
serdel.showIter();
cout<<endl<<"近似解:"<<endl;
serdel.iterat();
return 0;
}
【计算方法实验】实验4:赛德尔迭代法
最新推荐文章于 2022-04-24 21:35:03 发布