此代码应该
然后通过 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.5
和x2=-0.5
。但此代码的输出为x1=0.35
和x2=-0.45
。
问题是什么?
此致
答案 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);