zoukankan      html  css  js  c++  java
  • 高斯消去法

    代码
    #include "stdio.h"
    #include 
    "math.h"
    #include 
    "stdlib.h"
    typedef 
    double arrtype;
    //高斯消去法
    void GuassScale(arrtype coff[],int n,arrtype *= NULL,int m = 1)
    {
    int col = n + m;
    arrtype 
    *= new arrtype[n];
    int *nrow = new int[n];
    arrtype 
    *base = coff;
    for(int i = 0; i<n;i++)
    {
      s[i] 
    = 0;
      
    for(int j = 0;j<n;j++)
      {
       arrtype t 
    = fabs(coff[i*col + j]);
       
    if(s[i] < t)
        s[i] 
    = t;
      }
      nrow[i] 
    = i;
    }
    for(i=0;i<n-1;i++)
    {
      
    int p = i;
      arrtype t 
    = fabs(coff[nrow[p]*col+i])/s[nrow[p]];
      
    for(int j= i+1;j<n;j++)
      {
       arrtype temp
    = fabs(coff[nrow[j]*col+i])/s[nrow[j]];
       
    if(t<temp)
       {
        t
    =temp;
        p
    =j;
       }    
      }
      
    if(coff[nrow[p]*col+i]==0)
       
    return;
      
    if(nrow[p]!=nrow[i])
      {
       
    int ncopy = nrow[i];
       nrow[i] 
    = nrow[p];
       nrow[p] 
    =ncopy;
      }
      
    for(j= i+1;j<n;j++)
      {
       arrtype m 
    = coff[nrow[j]*col+i]/coff[nrow[i]*col+i];
       
    for(int k=i+1;k<col;k++)
       {
        coff[nrow[j]
    *col+k]-=coff[nrow[i]*col+k]*m;
       }
      }
    }
    if(coff[nrow[n-1]*col+n-1]==0)
      
    return;
    for(i=n;i<col;i++)
    {
      x[(n
    -1)*m+(i-n)]=coff[nrow[n-1]*col+i]/coff[nrow[n-1]*col+n-1];
    }
    for(i=n-2;i>=0;i--)
    {
      
    for(int j = n;j<col;j++)
      {
       
    for(int k=n-1;k>i;k--)
        coff[nrow[i]
    *col+j]-=coff[nrow[i]*col+k]*x[k*m+(j-n)];
       x[i
    *m+(j-n)]=coff[nrow[i]*col+j]/coff[nrow[i]*col+i];
      }
    }
    }
    void main(int argc,char* argv[])
    {
    FILE 
    *fpi,*fpo;
    if(argc > 1)
      fpi
    =fopen(argv[1],"r");
    else
      fpi
    =stdin;
    if(!fpi)return;
    if(argc>2)
      fpo 
    = fopen(argv[2],"w");
    else
      fpo 
    = stdout;
    if(!fpo)return;
    int m,n;
    printf(
    "请输入n和m的值:\n");
    fscanf(fpi,
    "%d",&n);
    fscanf(fpi,
    "%d",&m);
    arrtype 
    *co;
    co 
    = new arrtype[n*(n+m)];
    for(int i = 0;i<n*(n+m);i++)
    {
      
    float t;
      fscanf(fpi,
    "%f",&t);
      co[i]
    =t;
    }
    fclose(fpi);
    arrtype 
    *= new arrtype[m*n];
    GuassScale(co,n,x,m);
    delete[] co;
    for(i=0;i<n;i++)
    {
      fprintf(fpo,
    "x[%d]=",i);
      
    for(int j=0;j<m;j++)
       fprintf(fpo,
    "%f",x[i*m+j]);
      fprintf(fpo,
    "\n");
    }
    delete[] x;
    fclose(fpo);
  • 相关阅读:
    数据库学习笔记5---MySQL字符串函数、日期时间函数
    关于hibernate的AnnotationConfiguration的问题
    浅谈Java web 中request的setAttribute()用法
    JAVA常见面试题之Forward和Redirect的区别
    JSP页面中<%!%>与<%%>与<%=%>
    Servlet的生命周期
    JavaEE学习路线图
    java web项目WEB-INF与META-INF的作用
    iOS-申请邓白氏编码的超详细流程介绍
    从高版本JDK换成低版本JDK报错
  • 原文地址:https://www.cnblogs.com/magic_evan/p/1847527.html
Copyright © 2011-2022 走看看