如何用C ++的Jacobi方法求解n方程?

时间:2015-06-04 13:45:53

标签: c++ matrix

此代码应该

  • 等式数(n)
  • 矩阵a
  • 矩阵b
  • 答案(e)的准确性作为输入

然后通过 Jacobi 方法找到 n 方程的答案。

我的代码:

     #include <cstdlib>
     #include <iostream>
     #include <conio.h>
     #include <math.h>

using namespace std; // DEV software code for using 'cin' instead 'scanf' 
int main()
{
    int n,i,j,l=0;
    cout<<"Enter number of Equations = ";
    cin>>n;
    double a[n-1][n-1],b[n-1][1],x[n-1][1],T[n-1][1],e,k;
    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;
    while (l!=n)
    {
        l=0;
        for (i=0;i<n;i++)
        {
            x[i][0]=(1/a[i][i])*(b[i][0]);
            for (j=0;j<n;j++)
            {
                if (j!=i)
                x[i][0]=x[i][0]-(1/a[i][i])*(a[i][j]*T[j][0]);
            }
        }
        for(i=0;i<n;i++)
        {
            k=fabs(x[i][0]-T[i][0]);
            if (k<=e)
            {
                l=l+1;
            }
        }
    for (i=0;i<n;i++)
        T[i][0]=x[i][0];
    }
    for (i=0;i<n;i++)
        cout<<"x"<<i+1<<"="<<x[i][0]<<endl;
    getch();
    return 0;
}

例如:(例如)

     // Initializing variables
n=2
e=0.001
a[0,0]=4
a[0,1]=2
a[1,0]=1
a[1,1]=3
b[0,0]=1
b[1,0]=-1 

答案应为x1=0.5x2=-0.5。但此代码的输出为x1=0.35x2=-0.45

问题是什么?

此致

2 个答案:

答案 0 :(得分:1)

您的数组看起来像是一行一列。您向用户询问n公式,但只为n-1分配a, b, x, T行和列。你对那些matricies和vector的声明应该是double a[n][n]等。你当前正在写数组的边界之外,可能会覆盖另一个矩阵中的数据。

顺便说一下,当我应用我的修复时,我得到了正确答案(0.5,-0.5)。

答案 1 :(得分:1)

首先,必须定义所有数组[n],而不是[n-1]。(因为for循环中的条件是“我小于n”)。

第二,你不需要2D数组用于“X”和“b”以及T.(在很大的维度上浪费内存)。 第三,设置你的准确度= 0.00001。它适用于流动的主循环: 主循环可以是:

 do                            
{
    for (i=0;i<n;i++)                
    {
        y=x[i];
        x[i]=(1/a[i][i])*(b[i]);
        for (j=0;j<n;j++)
        {
            if (j!=i)
              x[i]=x[i]-(1/a[i][i])*(a[i][j]*T[j]);

        }
        if (abs(x[i]-y)<=e)            
            flag++;
        cout<< x[i] << "  ";
    }

for (k=0;k<n;k++)
    T[k]=x[k];

    cout<<"\n";
    count++;   
}while(flag<n);