1. 程式人生 > >【計算方法】雅可比迭代法和高斯-賽德爾迭代法求線性方程根

【計算方法】雅可比迭代法和高斯-賽德爾迭代法求線性方程根

雅可比迭代法:

//雅可比迭代法
void jacobi(float *a,int n,float x[])
{
    int i,j,k=0;
    float epsilon,s;
    float *y=new float[n];
    for(i=0;i<n;i++)x[i]=0;
    while(1)
    {
        epsilon=0;
        k++;
        for(i=0;i<n;i++)
        {
            s=0;
            for(j=0;j<n;j++)
            {
                if
(j==i)continue; s+=*(a+i*(n+1)+j)*x[j]; } y[i]=(*(a+i*(n+1)+n)-s)/(*(a+i*(n+1)+i)); epsilon+=fabs(y[i]-x[i]); } for(i=0;i<n;i++)x[i]=y[i]; if(epsilon<eps) { printf("%d\n",k);return;} if(k>=max) {printf
("發散");return;} } delete y; }

高斯-賽德爾迭代法

//高斯塞德爾
void gauss(float *a,int n,float x[])
{
    int i,j,k=1;
    float d,dx,eps;
    for(i=0;i<=n-1;i++)x[i]=0.0;
    while(1)
    {
        eps=0;
        for(i=0;i<=n-1;i++)
        {
            d=0;
            for(j=0;j<=n-1;j++)
            {
                if
(j==i)continue; d+=*(a+i*(n+1)+j)*x[j]; } dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i)); eps+=fabs(dx-x[i]); x[i]=dx; } if(eps<1e-6) {printf("%d\n",k);return;} if(k>N) { printf("發散\n"); return; } k++; } }