在C++上实现高斯赛德尔迭代方法



我正在尝试在C++中实现高斯赛德尔迭代方法。 我有一个非常混乱的代码,因为我仍在学习。 由于某种原因,我的 while 循环似乎根本没有实现循环而运行。我也不能在工作时做。 im 使用的测试矩阵是

number of equations=2
x[0][0]=4
x[0][1]=2
x[1][0]=1
x[1][1]=3
b[0][0]=1
b[1][0]=-1
accuracy=0.2

循环应继续,直到 K 变得低于精度。 结果应该是;

x1=0.4583 
x2= 0.4681
(i printed the F matrix just to make sure that part was working correct)
k=0.136
iterations performed=2

再次为混乱的代码感到抱歉,就像我说的我仍在学习一样。 此外,我还在单独的代码上测试了数学,它运行良好。

int main()
{
int n,i,j,p=0,l=0;
cout<<"Enter number of Equations = ";
cin>>n;
double a[n][n],b[n-1][1],F[n-1][1],x[n-1][1],T[n-1][1],e,k,B,C;
cout<<"[a].[x]=[b]"<<endl;
cout<<"Enter Matrix a:"<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cout<<"a["<<i<<","<<j<<"] = ";
cin>>a[i][j];
}
cout<<"Enter Matrix b:"<<endl;
for(j=0;j<n;j++)
{
cout<<"b[0,"<<j<<"] = ";
cin>>b[0][j];
}
cout<<"Enter the Accuracy = ";
cin>>e;
for (i=0;i<n;i++){
T[i][0]=0;
}
for(i=0;i<n;i++){
x[i][0]=0;
}
for(i=0;i<n;i++){
F[i][0]=0;
}
while (k>=e){
C=0;
p=p+1;
k=0;
for(i=0;i<n;i++){
B=0;
T[i][0]=(b[i][0]/a[i][i]);
C=a[i][i];
for (j = 0; j < n; j++) {
if (j!=i)
B=B+(a[i][j])*(x[j][0]);
}
x[i][0]=T[i][0]-(B/C);
}
cout<<x[0][0]<<endl;
cout<<x[1][0]<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++){
F[i][0]=F[i][0]+(a[i][j]*x[j][0]);
}
}
for(i=0;i<n;i++){
F[i][0]=(F[i][0]-b[i][0]);
}
for(i=0;i<n;i++){
k=k+((F[i][0])*F[i][0]);
}
k=sqrt(k);
}
for (i=0;i<n;i++){
cout<<"x"<<i+1<<"="<<x[i][0]<<endl;}
cout<<"number of iterations used: "<<p<<endl;
for (i=0;i<n;i++){
cout<<"F"<<i+1<<"="<<F[i][0]<<endl;}
cout<<"k="<<k<<endl;
return 0;
}

编辑:我尝试给k一个初始值,该值无限进行,程序崩溃。 这是个总结。 3个重要的矩阵是a,x和b。 ax=b 每一行都变成一个方程,并求解 x(i(,矩阵 x 中所有位置的初始值为 0。 在为矩阵 X 中的所有值完成此操作后,通过函数检查精度"k":ax-b=矩阵 F,然后将 F 的所有值平方、相加并在根下得到 k,然后根据 e 进行检查。

结果是:

x1=0                                                                                                                            
x2=0                                                                                                                            
number of iterations used: 0                                                                                                    
F1=0                                                                                                                            
F2=0                                                                                                                            
k=2.96439e-323

首先请注意,您实现的方法是雅可比迭代方法,而不是高斯-塞德尔方法。

代码中存在几个问题:

  • k没有初始化:它必须在while循环之前设置为一个大值,并在此循环内的计算之前设置为 0
  • 有些向量没有以合适的大小初始化:n-1而不是n
  • F[.]向量应在每次迭代时重置为 0,而不仅仅是在程序开始时

此外,我做了一些其他修改

  • 我用std::vector替换了可变长度数组(不是C++
  • (
  • 我用[n]向量替换[n][1]数组
  • 我试图避免一些ij全局变量

这是一个工作代码:

#include <iostream>
#include <cmath>
#include <vector>
using std::cin, std::cout;
int main() {
int n, p = 0;
cout << "Enter number of equations = ";
cin >> n;
double e , k, C;
std::vector<double> b(n), F(n, 0), x(n, 0), T(n, 0);
std::vector<std::vector<double>> a(n, std::vector<double> (n));
cout << "[a].[x]=[b]" << "n";
cout << "Enter Matrix a:" << "n";
for (int i = 0;i < n; i++) {
for(int j = 0; j < n; j++) {
cout << "a[" << i << ","<< j << "] = ";
cin >> a[i][j];
}
}
cout << "Enter Vector b:" << "n";
for(int j = 0; j < n; j++)
{
cout << "b[" << j << "] = ";
cin >> b[j];
}
cout << "Enter the Accuracy = ";
cin >> e;
k = 1e10;
while (k >= e){
p = p + 1;
for (int i = 0; i < n; i++) {
double B = 0;
T[i] = b[i]/a[i][i];
C = a[i][i];
for (int j = 0; j < n; j++) {
if (j!=i)
B += a[i][j] * x[j];
}
x[i] = T[i]-B/C;
}
cout << x[0] << "n";
cout << x[1] << "n";
for (int i = 0; i < n; i++)
{
F[i] = 0.0;
for (int j = 0; j < n; j++){
F[i] = F[i] + a[i][j]*x[j];
}
}
for (int i = 0; i < n; i++){
F[i] = F[i]-b[i];
}
k = 0.0;
for (int i = 0;i < n;i++) {
k += F[i] * F[i];
}
k = std::sqrt(k);
}
cout << "Solution :n";
for (int i = 0; i < n; i++){
cout << "x" << i << "=" << x[i] << "n";
}
cout << "number of iterations used: " << p <<"n";
for (int i = 0; i< n; i++){
cout <<"F" << i << "=" << F[i] << "n";
}
cout << "Final error = " << k << "n";
return 0;
}

最新更新