男人 发表于 2004-4-14 20:56:00

大家帮我看看这段程序有没有错,谢谢!

程序如下,是用来解线性方程的,用的是高斯赛德乐迭代法做的
在算三个未知量的时是和答案一致的,四个未知量就有出入,做六个未知量就出错了.
谁能告诉我错在哪里了,是题错还是程序错了.
刚开始学,不足之处请指教。
#include<iomanip.h>
#include<math.h>
#define NN 50        
        void main()
        {
          cout.setf(ios::fixed,ios::floatfield);
                cout<<setprecision(8)<<1.23456789*2.34512344;
                int i,j,k;
                double e,c,T,r;
                //double x,A,B;
                //题目如下:任选一个
                //double x={0,0,0,0},A={{0,0,0,0},{0,10,-2,-1},{0,-2,10,-1},{0,-1,-2,5}},B={0,3,15,10};
          double x={0,0,0,0},A={{0,0,0,0},{0,10,-1,-2},{0,-1,10,-2},{0,-1,-1,5}},B={0,7.2,8.3,4.2};
      //double x={0,0,0,0,0},A={{0,0,0,0,0},{0,-5,1,1,2},{0,2,8,1,3},{0,1,-2,-4,-1},{0,-1,3,2,7}},B={0,-2,-6,6,12};
                //double x={0,0,0,0,0,0,0},A={{0,0,0,0,0,0,0},{0,1,-1,0,-1,0,0},{0,2,4,-1,0,-1,0},{0,4,-1,4,-1,0,-1},{0,8,0,-1,4,-1,0},{0,12,-1,0,-1,4,-1},{0,16,0,-1,0,-1,4}},B={0,0,5,-2,5,-2,6};
                //double x={0,0,0,0,0},A={{0,0,0,0,0},{0,1,0.333,1.5,-0.333},{0,-2.01,1.45,0.50,2.95},{0,4.32,-1.95,0.007,2.08},{0,5.11,-4.00,3.33,-1.11}},B={0,3.00,2.62,0.130,3.77};
                //double x={0,0,0,0},A={{0,0,0,0},{0,10,3,1},{0,2,-10,3},{0,1,3,10}},B={0,14,-5,14};
                int N;
          cout<<"请输入N值:";
          cin>>N;
                cout<<endl<<"请输入e值:";
                cin>>e;
                /*cout<<endl<<"请输入按行系数矩阵值:";
                for(i=1;i<=N;i++)
                        for(j=1;j<=N;j++)
                        {
                                cin>>A;
                        }
                        cout<<endl;
                for(i=1;i<=N;i++)
                {
                        for(j=1;j<=N;j++)
                        {
                                cout<<A<<' ';
                               
                        }
                        cout<<endl;
                }
                cout<<endl<<"请输入方程值:";
                for(i=1;i<=N;i++)cin>>B;
                for(i=1;i<=N;i++)cout<<endl<<B<<' ';
                cout<<endl<<"x的初始值:";
                for(i=1;i<=N;i++)cin>>x;*/

      //cout<<"k"<<setw(9);
          //for(i=1;i<=N;i++)cout<<"x["<<i<<"]"<<setw(9);
                r=e;
                for(k=1;r>=e;k++)
                {       
                        r=0;
                  i=1;
                  for(i=1;i<=N;i++)
                        {
                                T=x;
                        c=0;
                        for(j=1;j<=N;j++)
                                {
                                        if(j!=i)c+=(A*x);
                                                cout<<"第"<<i<<"_"<<j<<"次的C值:"<<c<<endl;
                                }
                       //c1=0;
                                //for(j=1;j<=i-1;j++)c1+=(A*x);
                                x=(B-c)/A;
                                        cout<<"第"<<i<<"次的x值:"<<x<<endl;
                        if((fabs(x-T))>r)r=fabs(x-T);
                                       cout<<"第"<<i<<"次的R值:"<<r<<endl;
                        }
                        cout<<endl;
            //cout<<"k="<<k<<":"<<setw(9);
                       
                        //cout.setf(ios::fixed,ios::floatfield);
                        for(i=1;i<=N;i++)cout<<"k="<<k<<":"<<x<<' ';//<<setw(10);
               
                }cout<<endl;
               
}

摇摆 发表于 2004-4-14 22:24:00

高斯赛德乐迭代法
把这个算法弄上来看看

浩子 发表于 2004-4-18 10:17:00

放屁啊 这么长的程序还是把我杀了好拉.

geforce20 发表于 2004-8-30 17:04:00

<P>楼主这个问题提的真有建设性啊!!!!</P><P>(要想知道自己的程序是否有错,你编译一下,然后运行一下不就行了吗?!!!)</P>

geforce20 发表于 2004-10-30 17:27:00

不要这样说楼主,其实楼主没有电脑,自己大脑编译速度太慢,所以就想把这个程序放到我们的大脑里编译一下,而已!

yzhlinux 发表于 2004-10-30 19:57:00

<P>太混乱了,没有能力看下去</P><P>不过如果说4个就不能算了,首先你要弄清楚是否一定有解,不是所有方程用G-S都能算出来的,要先判断是否收敛先,对于发散的数据自然无法迭代出解来了,所以首先算其普半径确定有解先。</P>
页: [1]
查看完整版本: 大家帮我看看这段程序有没有错,谢谢!