首页 文萃 技术文档 培训机构 教学视频 e书下载 五星图书 考试资源 软件下载 标准下载 最新资讯


10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔 转帖

推荐人:WD

 

1.拉格朗日插值多项式 ,用于离散数据的拟合 

 C/C++ code#include <stdio.h>
  #include <conio.h>
  #include <alloc.h>
  float lagrange(float *x,float *y,float xx,int n)     /*拉格朗日插值算法*/
  { int i,j;
    float *a,yy=0.0;    /*a作为临时变量,记录拉格朗日插值多项式*/
    a=(float *)malloc(n*sizeof(float));
    for(i=0;i<=n-1;i++)
    { a[i]=y[i];
      for(j=0;j<=n-1;j++)
      if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);
      yy+=a[i];
    }
  free(a);
  return yy;
 }
 main()
 { int i,n;
  float x[20],y[20],xx,yy;
  printf("Input n:");
  scanf("%d",&n);
  if(n>=20) {printf("Error!The value of n must in (0,20)."); getch();return 1;}
  if(n<=0) {printf("Error! The value of n must in (0,20)."); getch(); return 1;}
  for(i=0;i<=n-1;i++)
  { printf("x[%d]:",i);
     scanf("%f",&x[i]);
  }
  printf("\n");
  for(i=0;i<=n-1;i++)
  { printf("y[%d]:",i);scanf("%f",&y[i]);}
  printf("\n");
  printf("Input xx:");
  scanf("%f",&xx);
  yy=lagrange(x,y,xx,n);
  printf("x=%f,y=%f\n",xx,yy);
  getch();
 }

 

 2.牛顿插值多项式,用于离散数据的拟合 

 C/C++ code#include <stdio.h>
 #include <conio.h>
 #include <alloc.h>
 void difference(float *x,float *y,int n)
 { float *f;
  int k,i;
  f=(float *)malloc(n*sizeof(float));
  for(k=1;k<=n;k++)
  { f[0]=y[k];
     for(i=0;i<k;i++)
       f[i+1]=(f[i]-y[i])/(x[k]-x[i]);
     y[k]=f[k];
  }
  return;
 }
 main()
 { int i,n;
  float x[20],y[20],xx,yy;
  printf("Input n:");
  scanf("%d",&n);
  if(n>=20) {printf("Error! The value of n must in (0,20)."); getch(); return 1;}
  if(n<=0) {printf("Error! The value of n must in (0,20).");getch(); return 1;}
  for(i=0;i<=n-1;i++)
  { printf("x[%d]:",i);
     scanf("%f",&x[i]);
  }
    printf("\n");
  for(i=0;i<=n-1;i++)
  { printf("y[%d]:",i);scanf("%f",&y[i]);}
  printf("\n");
  difference(x,(float *)y,n);
  printf("Input xx:");
  scanf("%f",&xx);
  yy=y[20];
  for(i=n-1;i>=0;i--) yy=yy*(xx-x[i])+y[i];
  printf("NewtonInter(%f)=%f",xx,yy);
  getch();
 }

 

 3.高斯列主元消去法,求解其次线性方程组 

 C/C++ code#include<stdio.h>
 #include <math.h>
 #define N 20
 int main()
 { int n,i,j,k;
  int mi,tmp,mx;
  float a[N][N],b[N],x[N];
  printf("\nInput n:");
  scanf("%d",&n);
  if(n>N)
  { printf("The input n should in(0,N)!\n");
     getch();
     return 1;
  }
  if(n<=0)
  { printf("The input n should in(0,N)!\n");
     getch();
     return 1;
  }
  printf("Now input a(i,j),i,j=0...%d:\n",n-1);
  for(i=0;i<n;i++)
  { for(j=0;j<n;j++)
     scanf("%f",&a[i][j]);}
  printf("Now input b(i),i,j=0...%d:\n",n-1);
  for(i=0;i<n;i++)
  scanf("%f",&b[i]);
  for(i=0;i<n-2;i++)
  { for(j=i+1,mi=i,mx=fabs(a[i][j]);j<n-1;j++)
     if(fabs(a[j][i])>mx)
     { mi=j;
       mx=fabs(a[j][i]);
     }
     if(i<mi)
     { tmp=b[i];b[i]=b[mi];b[mi]=tmp;
       for(j=i;j<n;j++)
       { tmp=a[i][j];
         a[i][j]=a[mi][j];
         a[mi][j]=tmp;
       }
     }
     for(j=i+1;j<n;j++)
     { tmp=-a[j][i]/a[i][i];
       b[j]+=b[i]*tmp;
       for(k=i;k<n;k++)
       a[j][k]+=a[i][k]*tmp;
     }
  }
  x[n-1]=b[n-1]/a[n-1][n-1];
  for(i=n-2;i>=0;i--)
  { x[i]=b[i];
     for(j=i+1;j<n;j++)
     x[i]-=a[i][j]*x[j];
     x[i]/=a[i][i];
  }
  for(i=0;i<n;i++)
  printf("Answer:\n x[%d]=%f\n",i,x[i]);
  getch();
  return 0;
 }
  
  
 #include<math.h>
 #include<stdio.h>
 #define NUMBER 20
 #define Esc   0x1b
 #define Enter 0x0d
  
 float A[NUMBER][NUMBER+1] ,ark;
 int flag,n;
 exchange(int r,int k);
 float max(int k);
 message();
  
 main()
 {
    float x[NUMBER];     
    int r,k,i,j;
    char celect;
    clrscr();
   
    printf("\n\nUse Gauss.");
    printf("\n\n1.Jie please press Enter.");
    printf("\n\n2.Exit press Esc.");
    celect=getch();
    if(celect==Esc)
      exit(0);
    printf("\n\n input n=");
    scanf("%d",&n);
      printf(" \n\nInput matrix A and B:");
    for(i=1;i<=n;i++)
    {
     printf("\n\nInput a%d1--a%d%d and b%d:",i,i,n,i);
        
     for(j=1;j<=n+1;j++)        scanf("%f",&A[i][j]);
    }
    for(k=1;k<=n-1;k++)                      
    {
    ark=max(k);
     if(ark==0)                  
     {
       printf("\n\nIt's wrong!");message();
     }
     else if(flag!=k)
      exchange(flag,k);
      for(i=k+1;i<=n;i++)
      for(j=k+1;j<=n+1;j++)
      A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
    }
    x[n]=A[n][n+1]/A[n][n];
    for( k=n-1;k>=1;k--)
    {
      float me=0;
      for(j=k+1;j<=n;j++)
      {
        me=me+A[k][j]*x[j];
      }
        x[k]=(A[k][n+1]-me)/A[k][k];
    }
    for(i=1;i<=n;i++)
    {
      printf(" \n\nx%d=%f",i,x[i]);
    }
    message();
 }
  
 exchange(int r,int k)      
 {
  int i;
  for(i=1;i<=n+1;i++)
     A[0][i]=A[r][i];
  for(i=1;i<=n+1;i++)
     A[r][i]=A[k][i];
  for(i=1;i<=n+1;i++)
     A[k][i]=A[0][i];
 }
  
 float max(int k)         
 {
  int i;
  float temp=0;
  for(i=k;i<=n;i++)
     if(fabs(A[i][k])>temp)
     {
       temp=fabs(A[i][k]);
       flag=i;
     }
  return temp;
 }
  
 message()                                    
 {
  printf("\n\n Go on Enter ,Exit press Esc!");
  switch(getch())
  {
    case Enter: main();
    case Esc: exit(0);
    default:{printf("\n\nInput error!");message();}
  }
 }

 

 4.龙贝格求积公式,求解定积分 

 C/C++ code#include<stdio.h>
 #include<math.h>
 #define f(x) (sin(x)/x)
 #define N 20
 #define MAX 20      
 #define a 2
 #define b 4
 #define e 0.00001      
 float LBG(float p,float q,int n)
 { int i;
  float sum=0,h=(q-p)/n;
  for (i=1;i<n;i++)
  sum+=f(p+i*h);
  sum+=(f(p)+f(q))/2;
  return(h*sum);
 }
 void main()
  { int i;
    int n=N,m=0;
    float T[MAX+1][2];
    T[0][1]=LBG(a,b,n);
    n*=2;
    for(m=1;m<MAX;m++)
    { for(i=0;i<m;i++)
       T[i][0]=T[i][1];
      T[0][1]=LBG(a,b,n);
      n*=2;
      for(i=1;i<=m;i++)
      T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);
      if((T[m-1][1]<T[m][1]+e)&&(T[m-1][1]>T[m][1]-e))
      { printf("Answer=%f\n",T[m][1]); getch();
       return ;
      }
    }
  }

 

 
 C/C++ code5.牛顿迭代公式,求方程的近似解

 

 C/C++ code#include<stdio.h>
 #include<math.h>
 #include<conio.h>
 #define N 100
 #define PS 1e-5
 #define TA 1e-5
 float Newton(float (*f)(float),float(*f1)(float),float x0 )
 { float x1,d=0;
 int k=0;
  do
  { x1= x0-f(x0)/f1(x0);
     if((k++>N)||(fabs(f1(x1))<PS))
     { printf("\nFailed!");
       getch();
       exit();
     }
     d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);
     x0=x1;
     printf("x(%d)=%f\n",k,x0);
  }
  while((fabs(d))>PS&&fabs(f(x1))>TA) ;
  return x1;
 }
 float f(float x)
 { return x*x*x+x*x-3*x-3; }
 float f1(float x)
 { return 3.0*x*x+2*x-3; }
 void main()
 { float f(float);
  float f1(float);
  float x0,y0;
  printf("Input x0: ");
  scanf("%f",&x0);
  printf("x(0)=%f\n",x0);
  y0=Newton(f,f1,x0);
  printf("\nThe root is x=%f\n",y0);
  getch();
 }

 6. 牛顿-科特斯求积公式,求定积分 

 C/C++ code#include<stdio.h>
 #include<math.h>
 int NC(a,h,n,r,f)
 float (*a)[];
 float h;
 int n,f;
 float *r;
 { int nn,i;
  float ds;
  if(n>1000||n<2)
  { if (f)
    printf("\n Faild! Check if 1<n<1000!\n",n);
    return(-1);
 }
 if(n==2)
 { *r=0.5*((*a)[0]+(*a)[1])*(h);
 return(0);
 }
 if (n-4==0)
  { *r=0;
 *r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]);
 return(0);
 }
 if(n/2-(n-1)/2<=0)
 nn=n;
 else
 nn=n-3;
 ds=(*a)[0]-(*a)[nn-1];
 for(i=2;i<=nn;i=i+2)
 ds=ds+4*(*a)[i-1]+2*(*a)[i];
 *r=ds*(h)/3;
 if(n>nn)
 *r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]);
 return(0);
 }
 main()
 {
  float h,r;
  int n,ntf,f;
  int i;
  float a[16];
 printf("Input the x[i](16):\n");
  for(i=0;i<=15;i++)
  scanf("%d",&a[i]);
 h=0.2;
 f=0;
 ntf=NC(a,h,n,&r,f);
 if(ntf==0)
  printf("\nR=%f\n",r);
   else
  printf("\n Wrong!Return code=%d\n",ntf);
   getch();
 }

 

 7.雅克比迭代,求解方程近似解 

 C/C++ code#include <stdio.h>
 #include <math.h>
 #define N 20
 #define MAX 100
 #define e 0.00001
 int main()
 { int n;
  int i,j,k;
  float t;
  float a[N][N],b[N][N],c[N],g[N],x[N],h[N];
  printf("\nInput dim of n:");   scanf("%d",&n);
  if(n>N)
  { printf("Faild! Check if 0<n<N!\n"); getch(); return 1; }
  if(n<=0)
  {printf("Faild! Check if 0<n<N!\n"); getch(); return 1;}
  printf("Input a[i,j],i,j=0…%d:\n",n-1);
  for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    scanf("%f",&a[i][j]);
  printf("Input c[i],i=0…%d:\n",n-1);
  for(i=0;i<n;i++)
 scanf("%f",&c[i]);
  for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    { b[i][j]=-a[i][j]/a[i][i];   g[i]=c[i]/a[i][i]; }
   for(i=0;i<MAX;i++)
    { for(j=0;j<n;j++)
      h[j]=g[j];
      { for(k=0;k<n;k++)
        { if(j==k) continue; h[j]+=b[j][k]*x[k]; }
      }
      t=0;
      for(j=0;j<n;j++)
      if(t<fabs(h[j]-x[j])) t=fabs(h[j]-x[j]);
      for(j=0;j<n;j++)
      x[j]=h[j];
      if(t<e)
      { printf("x_i=\n");
        for(i=0;i<n;i++)     
 printf("x[%d]=%f\n",i,x[i]);
        getch();
        return 0;
      }
      printf("after %d repeat , return\n",MAX);
      getch();
      return 1;
    }
    getch();
 }

 

 8.秦九昭算法 

 C/C++ code#include <math.h>
 float qin(float a[],int n,float x)
 {    float r=0;
     int i;
     for(i=n;i>=0;i--)
     r=r*x+a[i];
     return r;
 }
 main()
 {    float a[50],x,r=0;
     int n,i;
     do
     {    printf("Input frequency:");
         scanf("%d",&n);
     }
     while(n<1);
     printf("Input value:");
     for(i=0;i<=n;i++)
     scanf("%f",&a[i]);
     printf("Input frequency:");
     scanf("%f",&x);
     r=qin(a,n,x);
     printf("Answer:%f",r);
     getch();
 }

 

 9.幂法 

 C/C++ code#include<stdio.h>
 #include<math.h>
 #define N 100
 #define e 0.00001
 #define n 3
 float x[n]={0,0,1};
 float a[n][n]={{2,3,2},{10,3,4},{3,6,1}};
 float y[n];
 main()
 { int i,j,k;
    float xm,oxm;
    oxm=0;
    for(k=0;k<N;k++)
    { for(j=0;j<n;j++)
       { y[j]=0;
         for(i=0;i<n;i++)
         y[j]+=a[j][i]*x[i];
       }
       xm=0;
       for(j=0;j<n;j++)
       if(fabs(y[j])>xm) xm=fabs(y[j]);
       for(j=0;j<n;j++)
       y[j]/=xm;
       for(j=0;j<n;j++)
       x[j]=y[j];
       if(fabs(xm-oxm)<e)
       { printf("max:%f\n\n",xm);
        printf("v[i]:\n");
         for(k=0;k<n;k++) printf("%f\n",y[k]);
        break;
       }
       oxm=xm;
     }
  getch();
 }

 

 10.高斯塞德尔 

 C/C++ code#include<math.h>
 #include<stdio.h>
 #define N 20
 #define M 99
 float a[N][N];
 float b[N];
 int main()
 {    int i,j,k,n;
     float sum,no,d,s,x[N];
     printf("\nInput dim of n:");
  scanf("%d",&n);
  if(n>N)
  { printf("Faild! Check if 0<n<N!\n "); getch();
    return 1;
  }
  if(n<=0)
  { printf("Faild! Check if 0<n<N!\n ");getch();return 1;}
  printf("Input a[i,j],i,j=0…%d:\n",n-1);
  for(i=0;i<n;i++)
  for(j=0;j<n;j++)
  scanf("%f",&a[i][j]);
  printf("Input b[i],i=0…%d:\n",n-1);
  for(i=0;i<n;i++) scanf("%f",&b[i]);
     for(i=0;i<n;i++) x[i]=0;
  k=0;
  printf("\nk=%dx=",k);
  for(i=0;i<n;i++) printf("%12.8f",x[i]);
  do
  { k++;
      if(k>M){printf("\nError!\n”);getch();}
      break;
  }
  no=0.0;
  for(i=0;i<n;i++)
   { s=x[i];
     sum=0.0;
     for(j=0;j<n;j++)
     if (j!=i) sum=sum+a[i][j]*x[j];
     x[i]=(b[i]-sum)/a[i][i];
     d=fabs(x[i]-s);
     if (no<d) no=d;
  }
  printf("\nk=%2dx=",k);
  for(i=0;i<n;i++)   printf("%f",x[i]);
 }
 while (no>=0.1e-6);
 if(no<0.1e-6)
 { printf("\n\n answer=\n");
   printf("\nk=%d",k);
   for (i=0;i<n;i++)
   printf("\n x[%d]=%12.8f",i,x[i]);
 }
 getch();
 } 

 

 

[收藏本文]   [发表评论]  [查看评论我要推荐文章

上一篇:精妙Sql语句 下一篇:ascall码

最新参与TOP10
数据库 ' tempdb' 的日志已满
用u盘在pe下安装xp原版镜像的方法
10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔
linux下查看磁盘空间实现代码命令
oracle数据导入导出imp/exp sp2-0734:未知的命令开头' imp 忽略了剩余行默认分类 解决办法
让php开发者事半功倍的十大技巧
sqlserver中得到当前日期(convert函数,getdate函数)
修改metabase.xml文件提升iis性能
sql2000如何完美压缩.mdf文件
浅谈几个sql的日志概念
西安家教网 咸阳家教网 武汉家教网 济南家教网 太原家教网 郑州家教网 南宁家教网 贵阳家教网 成都家教网 重庆家教网 合肥家教网 昆明家教网 杭州家教网 南京家教网 苏州家教网 福州家教网 长沙家教网 南昌家教网 广州家教网

西安信息资源网 版权所有 全球排名

QQ:363694816