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

本文提供了一系列数值方法的C/C++实现,包括拉格朗日插值、牛顿插值、高斯列主元消去法、龙贝格求积及牛顿迭代等,适用于解决数学问题中的离散数据拟合、方程求解和积分计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导读:

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

  C/C++ code

  

  #include

  #include

  #include

  floatlagrange(float*x,float*y,floatxx,intn) /*拉格朗日插值算法*/

  { inti,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);

  returnyy;

  }

  main()

  { inti,n;

  floatx[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();return1;}

  if(n<=0) {printf("Error! The value of n must in (0,20)."); getch(); return1;}

  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 >
  #include

  #include

  voiddifference(float*x,float*y,intn)

  { float*f;

  intk,i;

  f=(float*)malloc(n*sizeof(float));

  for(k=1;k<=n;k++)

  { f[0]=y[k];

  for(i=0;i
  f[i+1]=(f[i]-y[i])/(x[k]-x[i]);

  y[k]=f[k];

  }

  return;

  }

  main()

  { inti,n;

  floatx[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(); return1;}

  if(n<=0) {printf("Error! The value of n must in (0,20).");getch(); return1;}

  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

  #include

  #defineN 20

  intmain()

  { intn,i,j,k;

  intmi,tmp,mx;

  floata[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();

  return1;

  }

  if(n<=0)

  { printf("The input n should in(0,N)!/n");

  getch();

  return1;

  }

  printf("Now input a(i,j),i,j=0...%d:/n",n-1);

  for(i=0;i
  { for(j=0;j
  scanf("%f",&a[i][j]);}

  printf("Now input b(i),i,j=0...%d:/n",n-1);

  for(i=0;i
  scanf("%f",&b[i]);

  for(i=0;i
  { for(j=i+1,mi=i,mx=fabs(a[i][j]);j
  if(fabs(a[j][i])>mx)

  { mi=j;

  mx=fabs(a[j][i]);

  }

  if(i   { tmp=b[i];b[i]=b[mi];b[mi]=tmp;

  for(j=i;j
  { tmp=a[i][j];

  a[i][j]=a[mi][j];

  a[mi][j]=tmp;

  }

  }

  for(j=i+1;j
  { tmp=-a[j][i]/a[i][i];

  b[j]+=b[i]*tmp;

  for(k=i;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   x[i]-=a[i][j]*x[j];

  x[i]/=a[i][i];

  }

  for(i=0;i
  printf("Answer:/n x[%d]=%f/n",i,x[i]);

  getch();

  return0;

  }

  

  

  #include >
  #include

  #defineNUMBER 20

  #defineEsc 0x1b

  #defineEnter 0x0d

  

  floatA[NUMBER][NUMBER+1] ,ark;

  intflag,n;

  exchange(intr,intk);

  floatmax(intk);

  message();

  

  main()

  {

  floatx[NUMBER];

  intr,k,i,j;

  charcelect;

  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();

  }

  elseif(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--)

  {

  floatme=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(intr,intk)

  {

  inti;

  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];

  }

  

  floatmax(intk)

  {

  inti;

  floattemp=0;

  for(i=k;i<=n;i++)

  if(fabs(A[i][k])>temp)

  {

  temp=fabs(A[i][k]);

  flag=i;

  }

  returntemp;

  }

  

  message()

  {

  printf("/n/n Go on Enter ,Exit press Esc!");

  switch(getch())

  {

  caseEnter: main();

  caseEsc: exit(0);

  default:{printf("/n/nInput error!");message();}

  }

  }

  

  

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

  C/C++ code

  

  #include

  #include

  #definef(x) (sin(x)/x)

  #defineN 20

  #defineMAX 20

  #definea 2

  #defineb 4

  #definee 0.00001

  floatLBG(floatp,floatq,intn)

  { inti;

  floatsum=0,h=(q-p)/n;

  for(i=1;i   sum+=f(p+i*h);

  sum+=(f(p)+f(q))/2;

  return(h*sum);

  }

  voidmain()

  { inti;

  intn=N,m=0;

  floatT[MAX+1][2];

  T[0][1]=LBG(a,b,n);

  n*=2;

  for(m=1;m
  { for(i=0;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))>
  { printf("Answer=%f/n",T[m][1]); getch();

  return;

  }

  }

  }

  

  

  C/C++ code

  

  5.牛顿迭代公式,求方程的近似解

  

  

  C/C++ code

  

  #include

  #include

  #include

  #defineN 100

  #definePS 1e-5

  #defineTA 1e-5

  floatNewton(float(*f)(float),float(*f1)(float),floatx0 )

  { floatx1,d=0;

  intk=0;

  do

  { x1=x0-f(x0)/f1(x0);

  if((k++>N)||(fabs(f1(x1))   { 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) ;

  returnx1;

  }

  floatf(floatx)

  { returnx*x*x+x*x-3*x-3;}

  floatf1(floatx)

  { return3.0*x*x+2*x-3;}

  voidmain()

  { floatf(float);

  floatf1(float);

  floatx0,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();

  }

  

  问题点数:50 回复次数:178修改删除举报引用回复

  

  

  



本文转自

http://topic.youkuaiyun.com/u/20080509/13/d4500a19-10aa-4fdf-b876-8e30f4daa331.html?seed=1798747162
t[m][1]-e))> > >
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值