雅克比迭代法

与世无争的帅哥 提交于 2019-12-22 16:44:18
#include<iostream>
#include"math.h"
using namespace std;
//n为方程的阶数
#define  n  6          
//方程组的系数矩阵、常数项向量、初值向量
double a[6][6]={{4,-1,0,-1,0,0},{-1,4,-1,0,-1,0},{0,-1,4,-1,0,-1},{-1,0,-1,4,-1,0},{0,-1,0,-1,4,-1},{0,0,-1,0,-1,4}},b[n]={0,5,-2,5,-2,6}, x[n]={0,5,-2,5,-2,6}, c[n];
//counter为最大迭代次数
int i=0,j,k=0,counter=100;                                                    
int main()
{
    int k=0,i=0;                     
    double num1,E;        
    float y[n];
    do
    {
       E=0;     
     for(j=0;j<n;j++)
       c[j]=x[j];   
        num1=0;
        for(j=0;j<n;j++)
            if(j!=i)
             num1=num1+a[i][j]*x[j];     
        for(j=0;j<n;j++)
            c[j]=x[j];
        y[i]=(b[i]-num1)/a[i][i];
        if(i<n)
        {   i++; }
        else
        {
             for(j=0;j<n;j++)
             {  x[j]=y[j]; }
            for(j=0;j<n;j++)
                if(E<(float)fabs(c[j]-y[j]))  E=(float)fabs(c[j]-y[j]);
            if(k>=0)
            {  printf("%2d:",k+1);
              for(j=0;j<n;j++)
                printf("x%d=%.5lf ",j+1,x[j]);  
                cout<<endl;
            }
              i=0;
              k++;
		  //精度
          if(E<0.0001)  break;
        }     
    }while(k<=counter);
    cout<<"总迭代次数 "<<k<<endl;
    cout<<"迭代终止精度 ";
    printf("x[%d]-x%doo<%.6lf\n",k,k-1,E);
    cout<<"\t\t---------最终结果-----------"<<endl;
    for(i=0;i<n;i++)
        printf("x%d=%.5lf ",i+1,x[i]);
	cout<<endl<<endl;
}

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!