首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于高斯_赛德尔迭代法不收敛有关问题?死小弟我了,请指点

2012-04-01 
关于高斯_赛德尔迭代法不收敛问题?急死我了,请指点!a0111101111011110b87.4000101.600099.2000115.7000

关于高斯_赛德尔迭代法不收敛问题?急死我了,请指点!
a   =     0           1           1           1
          1           0           1           1
          1           1           0           1
          1           1           1           0

b   =

      87.4000
    101.6000
      99.2000
    115.7000
求ax=b的解。
用高斯_赛德尔迭代不收敛,哪位高手有好的解决办法或算法?谢谢了!

[解决办法]
使用全选主元高斯消去法
程序:
消去法函数文件:

C/C++ code
  #include "stdlib.h"  #include "math.h"  #include "stdio.h"  int gaus(a,b,n)  int n;  double a[],b[];  { int *js,l,k,i,j,is,p,q;    double d,t;    js=malloc(n*sizeof(int));    l=1;    for (k=0;k<=n-2;k++)      { d=0.0;        for (i=k;i<=n-1;i++)          for (j=k;j<=n-1;j++)            { t=fabs(a[i*n+j]);              if (t>d) { d=t; js[k]=j; is=i;}            }        if (d+1.0==1.0) l=0;        else          { if (js[k]!=k)              for (i=0;i<=n-1;i++)                { p=i*n+k; q=i*n+js[k];                  t=a[p]; a[p]=a[q]; a[q]=t;                }            if (is!=k)              { for (j=k;j<=n-1;j++)                  { p=k*n+j; q=is*n+j;                    t=a[p]; a[p]=a[q]; a[q]=t;                  }                t=b[k]; b[k]=b[is]; b[is]=t;              }          }        if (l==0)          { free(js); printf("fail\n");            return(0);          }        d=a[k*n+k];        for (j=k+1;j<=n-1;j++)          { p=k*n+j; a[p]=a[p]/d;}        b[k]=b[k]/d;        for (i=k+1;i<=n-1;i++)          { for (j=k+1;j<=n-1;j++)              { p=i*n+j;                a[p]=a[p]-a[i*n+k]*a[k*n+j];              }            b[i]=b[i]-a[i*n+k]*b[k];          }      }    d=a[(n-1)*n+n-1];    if (fabs(d)+1.0==1.0)      { free(js); printf("fail\n");        return(0);      }    b[n-1]=b[n-1]/d;    for (i=n-2;i>=0;i--)      { t=0.0;        for (j=i+1;j<=n-1;j++)          t=t+a[i*n+j]*b[j];        b[i]=b[i]-t;      }    js[n-1]=n-1;    for (k=n-1;k>=0;k--)      if (js[k]!=k)        { t=b[k]; b[k]=b[js[k]]; b[js[k]]=t;}    free(js);    return(1);  } 

热点排行