33,008
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
using namespace std;
bool Converge(int A[4][4],double x[4],int b[4],int n);
void Show(int M[4][4],int b[4],double x[4],int n);
void Jacob(int A[4][4], double x[4],int b[4],int n)
{
int i,j,iterative_count=0;
double *newx=new double[n+1];
double sigma;
double delta;
//while(!Converge(A,x,b,n))
while(1)
{
for(i=1;i<=n;i++)
{
sigma=0;
for(j=1;j<=n;j++)
{
if(i!=j)
{
sigma+=A[i][j]*x[j];
}
}
newx[i]=double(double(b[i])-sigma)/A[i][i];
}
//max|x[i]-newx[i]|最大值作为误差分析
delta=abs(x[1]-newx[1]);
for(i=2;i<=n;i++)
{
if(delta<abs(x[i]-newx[i]))
delta=abs(x[i]-newx[i]);
}
if(delta<1e-7)
break;
for(i=1;i<=n;i++)
x[i]=newx[i];
iterative_count++;
if(iterative_count==6||iterative_count==100)
{
cout<<endl<<iterative_count<<endl;
Show(A,b,x,n);
}
}
delete []newx;
}
bool Converge(int A[4][4],double x[4],int b[4],int n)
{
int i,j;
double delta=0,tmp;
for(i=1;i<=n;i++)
{
tmp=0;
for(j=1;j<=n;j++)
{
tmp+=double(A[i][j]*x[j]);
}
//delta+=(tmp-b[i])*(tmp-b[i]);
delta+=abs(tmp-b[i]);
}
//delta=sqrt(delta);
if(delta<1e-4)
return true;
else
return false;
}
void initial(int M[4][4],double x[4],int b[4],int n)
{
int i,j;
for(i=1;i<=n;i++)
{
x[i]=0;
/*b[i]=rand()%10;
for(j=1;j<=n;j++)
M[i][j]=rand()%10;*/
}
}
void Show(int M[][4],int b[4],double x[4],int n)
{
int i,j;
cout<<"M:"<<endl;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cout<<M[i][j]<<" ";
cout<<endl;
}
cout<<"b:"<<endl;
for(i=1;i<=n;i++)
cout<<b[i]<<endl;
cout<<"x:"<<endl;
for(i=1;i<=n;i++)
cout<<x[i]<<endl;
}
int main()
{
const int n=3;
int M[n+1][n+1]={{0,0,0,0},{0,16,4,78},{0,4,5,-4},{0,8,-4,22},/*{0,3,-7,2},{0,9,12,4,7,8}*/},b[n+1]={0,-4,3,10};
double x[n+1];
int i;
/*for(i=0;i<=n;i++)
M[i]=new int[n+1];*/
//initila M and b,x;
initial(M,x,b,n);
Show(M,b,x,n);
Jacob(M,x,b,n);
cout<<"x:"<<endl;
for(i=1;i<=n;i++)
cout<<x[i]<<endl;
//delete []x;
system("pause");
}