zoukankan      html  css  js  c++  java
  • 迭代法

    时间函数有问题 ,当然代码也不是最好的。

    这几天学习了三种迭代法:雅克比迭代法,高斯-赛德尔迭代法,超松弛迭代法;对方程组求解。

    例如:试分别用雅克比迭代法,高斯-赛德尔迭代法,超松弛迭代法(取ω=1.15)解线性方程组

     

     当max ¦xi(k+1)-Xi(k)¦<10-5时迭代终止。方程组的精确解为X*=(1,-2,-1,3)T

    一.雅克比迭代法的公式:Xi(k+1)=Xi(k)+(bi-∑aijXj(k))/aii。1≤j≤n,n为X的列数,k为迭代次数,a[4][4],b[4],X[4],三个矩阵。

    二.高斯-赛德尔迭代法:1.X1(k+1)=(b1-a12X2(k)-a13X3(k)-......a1nXn(k))/a11

                                   2.X2(k+1)=(b2-a21X1(k+1)-a22X2(k)-a23X3(k)-......-a2nXn(k))/a22;

                                   .     .     .     .      .     .     .     .     .     .     .     .     .      . 

                                   n.Xn(k+1)=(bn-an1X1(k+1)-an2X2(k+1)-an3X3(k+1)-......-annXn(k+1))/ann

    三.超松弛迭代法:       Xi(k+1)=Xi+ω(bi-∑aijXj(k+1)-∑Xij(k))/aii

    下面看一下代码:

      1 #include"stdio.h"
      2 #include"iostream.h"
      3 #include"math.h"
      4 #include "time.h"
      5 double Jacobi(double a[][4],double b[])
      6 {
      7     int q=0,i;
      8     clock_t start,finish;
      9     
     10     double c[4]={0},x[4]={0},t[4]={0};
     11     double d,duration;
     12     start=clock();
     13     while(1)
     14     {
     15         q++;
     16         t[0]=x[0]+(b[0]-a[0][0]*x[0]-a[0][1]*x[1]-a[0][2]*x[2]-a[0][3]*x[3])/a[0][0];
     17         t[1]=x[1]+(b[1]-a[1][0]*x[0]-a[1][1]*x[1]-a[1][2]*x[2]-a[1][3]*x[3])/a[1][1];
     18         t[2]=x[2]+(b[2]-a[2][0]*x[0]-a[2][1]*x[1]-a[2][2]*x[2]-a[2][3]*x[3])/a[2][2];
     19         t[3]=x[3]+(b[3]-a[3][0]*x[0]-a[3][1]*x[1]-a[3][2]*x[2]-a[3][3]*x[3])/a[3][3];
     20         for( i=0;i<4;i++)
     21             c[i]=fabs(t[i]-x[i]);
     22         d=c[0];
     23         for( i=1;i<4;i++)
     24             if(d<c[i])
     25                 d=c[i];
     26         for( i=0;i<4;i++)
     27             x[i]=t[i];
     28     if(d<0.00001)
     29     {
     30         cout<<"迭代次数为"<<q<<"次后的结果为:"<<endl;
     31         for(i=0;i<4;i++)
     32             printf("x[%d]=%.7lf\n",i,x[i]);
     33             //cout<<"x["<<i<<"]="<<x[i]<<endl;
     34         finish=clock();
     35         duration=(double)(finish-start);
     36         cout<<"耗时"<<duration<<"ms"<<endl;
     37         break;
     38     }    
     39     }
     40     return 0;
     41 }
     42 double Gauss_Seidel(double a[][4],double b[])
     43 {
     44     int q=0,i;
     45     clock_t start,finish;
     46     double c[4]={0},x[4]={0},t[4]={0};
     47     double d,duration;
     48     start=clock();
     49     while(1)
     50     {
     51         q++;
     52         t[0]=x[0]+(b[0]-a[0][0]*x[0]-a[0][1]*x[1]-a[0][2]*x[2]-a[0][3]*x[3])/a[0][0];
     53         t[1]=x[1]+(b[1]-a[1][0]*t[0]-a[1][1]*x[1]-a[1][2]*x[2]-a[1][3]*x[3])/a[1][1];
     54         t[2]=x[2]+(b[2]-a[2][0]*t[0]-a[2][1]*t[1]-a[2][2]*x[2]-a[2][3]*x[3])/a[2][2];
     55         t[3]=x[3]+(b[3]-a[3][0]*t[0]-a[3][1]*t[1]-a[3][2]*t[2]-a[3][3]*x[3])/a[3][3];
     56         for( i=0;i<4;i++)
     57             c[i]=fabs(t[i]-x[i]);
     58         d=c[0];
     59         for( i=1;i<4;i++)
     60             if(d<c[i])
     61                 d=c[i];
     62         for( i=0;i<4;i++)
     63             x[i]=t[i];
     64         if(d<0.00001)
     65         {
     66             cout<<"迭代次数为"<<q<<"次后的结果为:"<<endl;
     67             for(i=0;i<4;i++)
     68                 printf("x[%d]=%.7lf\n",i,x[i]);
     69                 //cout<<"x["<<i<<"]="<<x[i]<<endl;
     70             finish=clock();
     71             duration=(double)(finish-start);
     72             //printf("%.3lf\n",finish-start);
     73             cout<<"耗时"<<duration<<"ms"<<endl;
     74             break;
     75         }
     76     }
     77     return 0;
     78 }
     79 double SOR(double a[][4],double b[])
     80 {
     81     int q=0,i;
     82     clock_t start,finish;
     83     double c[4]={0},x[4]={0},t[4]={0};
     84     double d,duration;
     85     start=clock();
     86     while(1)
     87     {
     88         q++;
     89         t[0]=x[0]+(b[0]-a[0][0]*x[0]-a[0][1]*x[1]-a[0][2]*x[2]-a[0][3]*x[3])/a[0][0]*1.15;
     90         t[1]=x[1]+(b[1]-a[1][0]*t[0]-a[1][1]*x[1]-a[1][2]*x[2]-a[1][3]*x[3])/a[1][1]*1.15;
     91         t[2]=x[2]+(b[2]-a[2][0]*t[0]-a[2][1]*t[1]-a[2][2]*x[2]-a[2][3]*x[3])/a[2][2]*1.15;
     92         t[3]=x[3]+(b[3]-a[3][0]*t[0]-a[3][1]*t[1]-a[3][2]*t[2]-a[3][3]*x[3])/a[3][3]*1.15;
     93         for( i=0;i<4;i++)
     94         {
     95             c[i]=fabs(t[i]-x[i]);
     96         }
     97         d=c[0];
     98         for( i=1;i<4;i++)
     99         {
    100             if(d<c[i])
    101                 d=c[i];
    102         }
    103         for( i=0;i<4;i++)
    104             x[i]=t[i];
    105         if(d<0.00001)
    106         {
    107             cout<<"迭代次数为"<<q<<"次后的结果为:"<<endl;
    108             for(i=0;i<4;i++)
    109                 printf("x[%d]=%.7lf\n",i,x[i]);
    110                 //cout<<"x["<<i<<"]="<<x[i]<<endl;
    111             finish=clock();
    112             duration=(double)(finish-start);
    113             //printf("%.3lf\n",finish-start);
    114             cout<<"耗时"<<duration<<"ms"<<endl;
    115             break;
    116         }
    117     }
    118     return 0;
    119 }
    120 void main()
    121 {
    122     int n;
    123     double v[4][4]={5,1,-1,-2,
    124                    2,8,1,3,
    125                    1,-2,-4,-1,
    126                    -1,3,2,7};
    127     double f[4]={-2,-6,6,12};
    128     double c[4]={0},x[4]={0},m[4]={0},t[4]={0};
    129     printf("\n****************************");
    130     printf("\n*  1.  雅克比迭代法        *");
    131     printf("\n*  2.  高斯-塞德尔迭代法   *");
    132     printf("\n*  3.  超松弛迭代法        *");
    133     printf("\n*  0.    GAME OVER         *");
    134     printf("\n****************************");
    135     cout<<endl;
    136     printf("请选择一种迭代方法:");
    137     cin>>n;
    138     while(n!=0)
    139     {
    140         switch(n)
    141         {
    142         case 0: break;
    143         case 1: Jacobi(v,f);break;
    144         case 2: Gauss_Seidel(v,f);break;
    145         case 3: SOR(v,f);break;
    146         default: cout<<"Error"<<endl;   
    147         }
    148         printf("请选择一种迭代方法:");
    149         cin>>n;
    150     }
    151             
    152 }
  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/gkfeng/p/2730995.html
Copyright © 2011-2022 走看看