C语言解线性方程的四种方法

 更新时间:2013年11月19日 14:36:41   作者:  
这篇文章主要介绍了C语言解线性方程的四种方法,大家参考使用,学习线性代数的同学一定能用到
发了好几天编了个解线性方程组的小程序,可第一次实战就大败而归。经过半天的调试,仍找不出纠正的方法。因为并不是算法的问题,而是因为自己对编译器处理 浮点函数的方法不是很理解。明明D=0的方阵解出来不等于0了,跟踪调试发现,计算过程程序对数据进行了舍去处理,导致最终结果不对。不过如果没有浮点型 的话,这个程序应该算不错了 。

复制代码 代码如下:

#include<stdio.h>
#include<math.h>
#include<mem.h>
#define NUM 100
void print(void)     /* 使用说明 */
      { clrscr();
        printf("\n\n\n\n\n\t\t\t\t Introduction \n");
        printf("\t*--------------------------------------------------------------*\n");
        printf("\t*    This program was design for compute linear equations.       *\n");
        printf("\t*    The way of use it is very simple.                           *\n");
        printf("\t*    First : Input the number of the equation;(Input 0 to exit) *\n");
        printf("\t*    Second: Input the coefficient of every eqution;             *\n");
        printf("\t*    Third : Input the constant of every eqution;                *\n");
        printf("\t*    Last : Chose the way you want use to solve the equtions; *\n");
        printf("\t*    That's all, input any key to run it . . .                   *\n");
        printf("\t*-------------------------By__TJX------------------------------*\n");
        getch(); }

void chose(void)    /*选择计算方法*/
    { clrscr();
       fflush(stdin);
        printf("\n\n\n\n\n\t\t**********Introduction********** \n");
                  printf("\t\t* Chose the way,please.        * \n");
                  printf("\t\t* a : Gauss eliminant.         * \n");
                  printf("\t\t* b : Gauss_yd eliminant.      * \n");
          printf("\t\t* c : Iterative way.           * \n");
                  printf("\t\t* d : Cramer way.              * \n");
                  printf("\t\t* e : exit.                    * \n");              
                  printf("\t\t*************By__TJX************ \n");
                  printf("\t\tPlease choose number :\n");}

void input(double **a1,double b1[],int num)    /*数据输入*/
     { int i,j,t;
       double *p;
       char de1,de2;
do{
     printf("Please input array a[%d][%d]: \n",num,num);
     printf("Warn: The first number of the array mustn't contain zero! \n");
    for(i=1;i<=num;i++)
      {printf("Please input array a[%d][]: \n",i);
       for(j=1;j<=num;j++)
       {t=0;
         if(i==1&&j==1)
          { do{
           if(t==0) { scanf("%lf",&a1[i][j]); t++;}
            else {printf("The input is invalid,please input again:\n"); scanf("%f",&a1[i][j]);}
           }while(a1[i][j]==0);}
         else scanf("%lf",&a1[i][j]);}}
      printf(" \nPlease check the value of array a[%d][%d],press Y to input again.\n",num,num);
      do{
         de1=getch();
         }while(de1!='y'&&de1!='Y'&&de1!='n'&&de1!='N');
    }while(de1=='y'||de1=='Y');
    do{
       printf("Please input array b[%d]: \n",num);
       p=b1+1;
       for(i=1;i<=num;i++)
        scanf("%lf",p++);
       printf(" \nPlease check the value of array b[%d],press Y to input again.\n",num);
        do{
         de2=getch();
         }while(de2!='y'&&de2!='Y'&&de2!='n'&&de2!='N');
    }while(de2=='y'||de2=='Y');}

 
int max(double *t1, double x1[],int n)    /*迭代子函数*/
     { int i,temp=0;
           for(i=1;i<=n;i++)
          if(fabs(x1[i]-t1[i])>1e-2) {temp=1;break;}
     /* printf("    %d    ",temp); */
          return temp;
     }

int ddcompute(double **a1,double b1[],double x1[],int n) /*迭代法计算*/
      {double *t;
       int i,j,k=0;
       double sum1=0.0,sum2=0.0;
       t=(double*)malloc(n*sizeof(double));
       printf("\nPlease Input The Initial Value of x:\n");
         for(i=1;i<=n;i++)
         scanf("%lf",&x1[i]);
        do{ k++;
         for(i=1;i<=n;i++)
             t[i]=x1[i];
           for(i=1;i<=n;i++)
            { sum1=0.0;sum2=0.0;
            for(j=1;j<=i-1;j++) sum1=sum1+a1[i][j]*x1[j]; /*printf(" sum1= %0.4f ",sum1);*/

               for(j=i+1;j<=n;j++) sum2=sum2+a1[i][j]*t[j]; /* printf(" sum2= %0.4f ",sum2);}*/
           if(a1[i][i]==0||fabs(sum1)>1e+12||fabs(sum2)>1e+12)
          {printf(" \nWarning: These equtions can't be solve by this way!\n Press any Key to continue...");
          getch();
                   free(t);
          return 0;}
            x1[i]=(b1[i]-sum1-sum2)/a1[i][i];}
     }while(max(t,x1,n));
     /* for(i=1;i<=n;i++)
                {if(i%3==0) printf("\n");
          printf("    %.4f    ",x1[i]);}*/
     free(t);
           return 1; }

int gscompute(double **a1,double b1[],double x1[],int n) /*高斯消元法计算*/
     {int i,j,k;
      double m,sum;
      for(k=1;k<=n-1;k++)
      for(i=k+1;i<=n;i++)
     { if(a1[k][k]==0) {printf(" \nThese equtions can't be solve is this way.\n Press any Key to continue...");
          getch();
                   return 0; }
         if((m=0-a1[i][k]/a1[k][k])==0) {i++; continue;}
     else {for(j=k+1;j<=n;j++)
            a1[i][j]=a1[i][j]+a1[k][j]*m;
     b1[i]=b1[i]+b1[k]*m;}}
/* yi xia ji suan x zhi */
    x1[n]=b1[n]/a1[n][n];
    for(i=n-1;i>=1;i--)
     {sum=0.0;
     for(j=n;j>=i+1;j--)
     sum=sum+a1[i][j]*x1[j];
      x1[i]=(b1[i]-sum)/a1[i][i];}
      return 1;    }

int gs_ydcompute(double **a1,double b1[],double x1[],int n) /*高斯_约当法计算*/
     {int i,j,k;
      double m,sum;
      for(k=1;k<=n;k++)
         {i=1;
           while(i<=n)
            { if(a1[k][k]==0) {printf(" \nThese equtions can't be solve is this way.\n Press any Key to continue...");
          getch();                    return 0;}
                if(i!=k)
                  { if((m=0-a1[i][k]/a1[k][k])==0) {i++; continue;}
                 else {for(j=k+1;j<=n;j++)
                        a1[i][j]=a1[i][j]+a1[k][j]*m;
                        b1[i]=b1[i]+b1[k]*m;}
                    i++;}
                 else i++;    }}
/* yi xia ji suan x zhi */   
    for(i=n;i>=1;i--)
     x1[i]=b1[i]/a1[i][i];
     return 1;}

 
double computed(double **a,int h,int l, int *c1,int n) /*计算系数行列式D值*/
       { int i, j,p=1;
    double sum=0.0;
        if(h==n)
               sum=1.0;
        else {
               i=++h;
               c1[l]=0;
               for(j=1;j<=n;j++)
                  if(c1[j])
                    if(a[i][j]==0) p++;
                    else {sum=sum+a[i][j]*computed(a,i,j,c1,n)*pow(-1,1+p); p++; }                 c1[l]=1; }
       return sum; }
void ncompute(double **a,double b[],double x[],int n,int *c,double h)      /*克莱姆法计算*/
      {int i,j;
       double t[NUM];
        for(j=1;j<=n;j++)
         { for(i=1;i<=n;i++)
             {t[i]=a[i][j];a[i][j]=b[i];}
     x[j]=computed(a,0,0,c,n)/h;
           for(i=1;i<=n;i++)
              a[i][j]=t[i]; }
         }

main()
{double x[NUM];
double b[NUM];
int i,j=2,n=0;
int *c;
double he;
char m,decision;
double **a;
a=(double**)malloc(NUM*sizeof(double*));
for (i=0; i<NUM; i++)
a[i]=(double*)malloc(NUM*sizeof(double));
    print();
do{
    clrscr();
    do{
       if(n>=NUM) printf("n is too large,please input again:\n");
       else
          printf("Please input the total number of the equations n(n<NUM): \n");
          scanf(" %d",&n);
       }while(n>NUM);
    if(n==0) {for(i=1; i<NUM; i++) free(a[i]);
                  free(a); exit(1);}
    input(a,b,n);
    c=(int *)malloc((n+1)*sizeof(int));
    memset(c,1,(n+1)*sizeof(int));
    he=computed(a,0,0,c,n);
       if(fabs(he)>1e-4)   
         {
          Other:    chose();
          do{
             m=getche();
            }while(m!='a'&&m!='b'&&m!='A'&&m!='B'&&m!='c'&&m!='C'&&m!='d'&&m!='D'&&m!='e'&&m!='E');
          switch(m)
           { case 'a': ;
           case 'A': j=gscompute(a,b,x,n);     break;
           case 'b': ;
           case 'B': j=gs_ydcompute(a,b,x,n); break;
           case 'c': ;
           case 'C': j=ddcompute(a,b,x,n);     break;
           case 'd': ;
           case 'D': j=1; ncompute(a,b,x,n,c,he); break;
           case 'e': ;
           case 'E': j=2; break;
              default: j=2; break;
           }
          if(j==1)
            {    clrscr();
                printf("\n\n\n\n");
                printf("     D=%.4f \n",he);
                for(i=1;i<=n;i++)
                  {if(i%5==0) printf("\n");
                    printf("    %.4f    ",x[i]);}
            }
          else if(j==0)   
            {printf(" \nThese equtions can't be solve is this way.\nPlease chose the other way."); goto Other;}
          else {for(i=1; i<NUM; i++) free(a[i]);
          free(a);
          free(c);
          exit(1);}
         }
       else printf(" \n\n\tD=%.4f\n This linear equations hasn't accurate answer!",he);
       printf(" \n Do you want to continue?(Y/N) \n");
       do{
           decision=getchar();}while(decision!='y'&&decision!='Y'&&decision!='n'&&decision!='N');
         }while(decision=='y'||decision=='Y');
for(i=1; i<NUM; i++) free(a[i]);
free(a);
free(c);}

相关文章

  • 深入C++可见性与生命期的区别详解

    深入C++可见性与生命期的区别详解

    本篇文章对C++中可见性与生命期的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 详解C++虚函数的工作原理

    详解C++虚函数的工作原理

    这篇文章主要介绍了C++虚函数的工作原理的的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-06-06
  • C++如何将二叉搜索树转换成双向循环链表(双指针或数组)

    C++如何将二叉搜索树转换成双向循环链表(双指针或数组)

    这篇文章主要介绍了C++如何将二叉搜索树转换成双向循环链表(双指针或数组),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • 解析c语言switch中break语句的具体作用

    解析c语言switch中break语句的具体作用

    以下是对c语言switch中break语句的作用进行了详细的分析介绍,需要的朋友可以过来参考下
    2013-07-07
  • C++ OpenCV生成蒙太奇图像的示例详解

    C++ OpenCV生成蒙太奇图像的示例详解

    图片的蒙太奇效果,一般称为马赛克图。由很多小图拼接成一个大图。这篇文章主要为大家介绍如何利用C++ OpenCV实现生成蒙太奇图像,感兴趣的可以了解一下
    2022-01-01
  • c++ 读写yaml配置文件

    c++ 读写yaml配置文件

    YAML所表示的YAML Ain’t Markup Language,YAML 是一种简洁的非标记语言,这篇文章主要介绍了在C语言开发中如何读写配置yaml配置文件,感兴趣的同学可以参考一下
    2023-04-04
  • C语言约瑟夫环的实现

    C语言约瑟夫环的实现

    这篇文章主要介绍了C语言约瑟夫环的实现的相关资料,这里主要是利用数据数据结果中循环链表来实现,需要的朋友可以参考下
    2017-08-08
  • C语言实现冒泡排序的思路以及过程

    C语言实现冒泡排序的思路以及过程

    冒泡排序是最简单的排序方法,理解起来容易。虽然它的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握。本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值
    2021-09-09
  • boost.asio框架系列之socket编程

    boost.asio框架系列之socket编程

    这篇文章介绍了boost.asio框架系列之socket编程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C++超详细讲解逗号操作符

    C++超详细讲解逗号操作符

    使用逗号运算符是为了把几个表达式放在一起。整个逗号表达式的值为系列中最后一个表达式的值。从本质上讲,逗号的作用是将一系列运算按顺序执行
    2022-05-05

最新评论