找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3861|回复: 1
打印 上一主题 下一主题
收起左侧

10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格

[复制链接]
跳转到指定楼层
楼主
ID:86460 发表于 2015-7-22 10:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
10个重要的算法C语言实现源代码:拉格朗日,牛顿插值,高斯,龙贝格~~
关键字: 拉格朗日,牛顿插值,高斯,龙贝格
1.拉格朗日插值多项式 ,用于离散数据的拟合

C/C++ code
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <alloc.h>
  4. float lagrange(float *x,float *y,float xx,int n)     /*拉格朗日插值算法*/
  5. { int i,j;
  6.    float *a,yy=0.0;    /*a作为临时变量,记录拉格朗日插值多项式*/
  7.    a=(float *)malloc(n*sizeof(float));
  8.    for(i=0;i<=n-1;i++)
  9.    { a[i]=y[i];
  10.      for(j=0;j<=n-1;j++)
  11.      if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);
  12.      yy+=a[i];
  13.    }
  14. free(a);
  15. return yy;
  16. }
  17. main()
  18. { int i,n;
  19. float x[20],y[20],xx,yy;
  20. printf("Input n:");
  21. scanf("%d",&n);
  22. if(n>=20) {printf("Error!The value of n must in (0,20).");getch();return 1;}
  23. if(n<=0) {printf("Error! The value of n must in (0,20)."); getch();return 1;}
  24. for(i=0;i<=n-1;i++)
  25. { printf("x[%d]:",i);
  26.     scanf("%f",&x[i]);
  27. }
  28. printf("\n");
  29. for(i=0;i<=n-1;i++)
  30. { printf("y[%d]:",i);scanf("%f",&y[i]);}
  31. printf("\n");
  32. printf("Input xx:");
  33. scanf("%f",&xx);
  34. yy=lagrange(x,y,xx,n);
  35. printf("x=%f,y=%f\n",xx,yy);
  36. getch();
  37. }



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

  39. C/C++ code
  40. #include <stdio.h>
  41. #include <conio.h>
  42. #include <alloc.h>
  43. void difference(float *x,float *y,int n)
  44. { float *f;
  45. int k,i;
  46. f=(float *)malloc(n*sizeof(float));
  47. for(k=1;k<=n;k++)
  48. { f[0]=y[k];
  49.     for(i=0;i<k;i++)
  50.       f[i+1]=(f[i]-y[i])/(x[k]-x[i]);
  51.     y[k]=f[k];
  52. }
  53. return;
  54. }
  55. main()
  56. { int i,n;
  57. float x[20],y[20],xx,yy;
  58. printf("Input n:");
  59. scanf("%d",&n);
  60. if(n>=20) {printf("Error! The value of n must in (0,20).");getch(); return 1;}
  61. if(n<=0) {printf("Error! The value of n must in (0,20).");getch();return 1;}
  62. for(i=0;i<=n-1;i++)
  63. { printf("x[%d]:",i);
  64.     scanf("%f",&x[i]);
  65. }
  66.    printf("\n");
  67. for(i=0;i<=n-1;i++)
  68. { printf("y[%d]:",i);scanf("%f",&y[i]);}
  69. printf("\n");
  70. difference(x,(float *)y,n);
  71. printf("Input xx:");
  72. scanf("%f",&xx);
  73. yy=y[20];
  74. for(i=n-1;i>=0;i--) yy=yy*(xx-x[i])+y[i];
  75. printf("NewtonInter(%f)=%f",xx,yy);
  76. getch();
  77. }



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

  79. C/C++ code
  80. #include<stdio.h>
  81. #include <math.h>
  82. #define N 20
  83. int main()
  84. { int n,i,j,k;
  85. int mi,tmp,mx;
  86. float a[N][N],b[N],x[N];
  87. printf("\nInput n:");
  88. scanf("%d",&n);
  89. if(n>N)
  90. { printf("The input n should in(0,N)!\n");
  91.     getch();
  92.     return 1;
  93. }
  94. if(n<=0)
  95. { printf("The input n should in(0,N)!\n");
  96.     getch();
  97.     return 1;
  98. }
  99. printf("Now input a(i,j),i,j=0...%d:\n",n-1);
  100. for(i=0;i<n;i++)
  101. { for(j=0;j<n;j++)
  102.     scanf("%f",&a[i][j]);}
  103. printf("Now input b(i),i,j=0...%d:\n",n-1);
  104. for(i=0;i<n;i++)
  105. scanf("%f",&b[i]);
  106. for(i=0;i<n-2;i++)
  107. { for(j=i+1,mi=i,mx=fabs(a[i][j]);j<n-1;j++)
  108.     if(fabs(a[j][i])>mx)
  109.     { mi=j;
  110.       mx=fabs(a[j][i]);
  111.     }
  112.     if(i<mi)
  113.     { tmp=b[i];b[i]=b[mi];b[mi]=tmp;
  114.       for(j=i;j<n;j++)
  115.       { tmp=a[i][j];
  116.         a[i][j]=a[mi][j];
  117.         a[mi][j]=tmp;
  118.       }
  119.     }
  120.     for(j=i+1;j<n;j++)
  121.     { tmp=-a[j][i]/a[i][i];
  122.       b[j]+=b[i]*tmp;
  123.       for(k=i;k<n;k++)
  124.       a[j][k]+=a[i][k]*tmp;
  125.     }
  126. }
  127. x[n-1]=b[n-1]/a[n-1][n-1];
  128. for(i=n-2;i>=0;i--)
  129. { x[i]=b[i];
  130.     for(j=i+1;j<n;j++)
  131.     x[i]-=a[i][j]*x[j];
  132.     x[i]/=a[i][i];
  133. }
  134. for(i=0;i<n;i++)
  135. printf("Answer:\n x[%d]=%f\n",i,x[i]);
  136. getch();
  137. return 0;
  138. }


  139. #include<math.h>
  140. #include<stdio.h>
  141. #define NUMBER 20
  142. #define Esc   0x1b
  143. #define Enter 0x0d

  144. float A[NUMBER][NUMBER+1] ,ark;
  145. int flag,n;
  146. exchange(int r,int k);
  147. float max(int k);
  148. message();

  149. main()
  150. {
  151.    float x[NUMBER];     
  152.    int r,k,i,j;
  153.    char celect;
  154.    clrscr();
  155.   
  156.    printf("\n\nUse Gauss.");
  157.    printf("\n\n1.Jie please press Enter.");
  158.    printf("\n\n2.Exit press Esc.");
  159.    celect=getch();
  160.    if(celect==Esc)
  161.      exit(0);
  162.    printf("\n\n input n=");
  163.    scanf("%d",&n);
  164.      printf(" \n\nInput matrix A and B:");
  165.    for(i=1;i<=n;i++)
  166.    {
  167.     printf("\n\nInput a%d1--a%d%d and b%d:",i,i,n,i);
  168.       
  169.     for(j=1;j<=n+1;j++)       scanf("%f",&A[i][j]);
  170.    }
  171.   for(k=1;k<=n-1;k++)                     
  172.    {
  173.    ark=max(k);
  174.    if(ark==0)                 
  175.     {
  176.       printf("\n\nIt's wrong!");message();
  177.     }
  178.     else if(flag!=k)
  179.      exchange(flag,k);
  180.      for(i=k+1;i<=n;i++)
  181.      for(j=k+1;j<=n+1;j++)
  182.      A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];
  183.    }
  184.    x[n]=A[n][n+1]/A[n][n];
  185.    for( k=n-1;k>=1;k--)
  186.    {
  187.      float me=0;
  188.      for(j=k+1;j<=n;j++)
  189.      {
  190.        me=me+A[k][j]*x[j];
  191.      }
  192.        x[k]=(A[k][n+1]-me)/A[k][k];
  193.    }
  194.    for(i=1;i<=n;i++)
  195.    {
  196.      printf(" \n\nx%d=%f",i,x[i]);
  197.    }
  198.    message();
  199. }

  200. exchange(int r,int k)      
  201. {
  202. int i;
  203. for(i=1;i<=n+1;i++)
  204.     A[0][i]=A[r][i];
  205. for(i=1;i<=n+1;i++)
  206.     A[r][i]=A[k][i];
  207. for(i=1;i<=n+1;i++)
  208.     A[k][i]=A[0][i];
  209. }

  210. float max(int k)         
  211. {
  212. int i;
  213. float temp=0;
  214. for(i=k;i<=n;i++)
  215.     if(fabs(A[i][k])>temp)
  216.     {
  217.       temp=fabs(A[i][k]);
  218.       flag=i;
  219.     }
  220. return temp;
  221. }

  222. message()                                   
  223. {
  224. printf("\n\n Go on Enter ,Exit press Esc!");
  225. switch(getch())
  226. {
  227.    case Enter: main();
  228.    case Esc: exit(0);
  229.    default:{printf("\n\nInput error!");message();}
  230. }
  231. }



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

  233. C/C++ code
  234. #include<stdio.h>
  235. #include<math.h>
  236. #define f(x) (sin(x)/x)
  237. #define N 20
  238. #define MAX 20      
  239. #define a 2
  240. #define b 4
  241. #define e 0.00001      
  242. float LBG(float p,float q,int n)
  243. { int i;
  244. float sum=0,h=(q-p)/n;
  245. for (i=1;i<n;i++)
  246. sum+=f(p+i*h);
  247. sum+=(f(p)+f(q))/2;
  248. return(h*sum);
  249. }
  250. void main()
  251. { int i;
  252.    int n=N,m=0;
  253.    float T[MAX+1][2];
  254.    T[0][1]=LBG(a,b,n);
  255.    n*=2;
  256.    for(m=1;m<MAX;m++)
  257.    { for(i=0;i<m;i++)
  258.       T[i][0]=T[i][1];
  259.      T[0][1]=LBG(a,b,n);
  260.      n*=2;
  261.      for(i=1;i<=m;i++)
  262.     T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);
  263.     if((T[m-1][1]<T[m][1]+e)&&(T[m-1][1]>T[m][1]-e))
  264.      { printf("Answer=%f\n",T[m][1]); getch();
  265.       return ;
  266.      }
  267.    }
  268. }




  269. C/C++ code
  270. 5.牛顿迭代公式,求方程的近似解



  271. C/C++ code
  272. #include<stdio.h>
  273. #include<math.h>
  274. #include<conio.h>
  275. #define N 100
  276. #define PS 1e-5
  277. #define TA 1e-5
  278. float Newton(float (*f)(float),float(*f1)(float),float x0 )
  279. { float x1,d=0;
  280. int k=0;
  281. do
  282. { x1= x0-f(x0)/f1(x0);
  283.     if((k++>N)||(fabs(f1(x1))<PS))
  284.     { printf("\nFailed!");
  285.       getch();
  286.       exit();
  287.     }
  288.     d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);
  289.     x0=x1;
  290.     printf("x(%d)=%f\n",k,x0);
  291. }
  292. while((fabs(d))>PS&&fabs(f(x1))>TA) ;
  293. return x1;
  294. }
  295. float f(float x)
  296. { return x*x*x+x*x-3*x-3; }
  297. float f1(float x)
  298. { return 3.0*x*x+2*x-3; }
  299. void main()
  300. { float f(float);
  301. float f1(float);
  302. float x0,y0;
  303. printf("Input x0: ");
  304. scanf("%f",&x0);
  305. printf("x(0)=%f\n",x0);
  306. y0=Newton(f,f1,x0);
  307. printf("\nThe root is x=%f\n",y0);
  308. getch();
  309. }

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

  311. C/C++ code
  312. #include<stdio.h>
  313. #include<math.h>
  314. int NC(a,h,n,r,f)
  315. float (*a)[];
  316. float h;
  317. int n,f;
  318. float *r;
  319. { int nn,i;
  320. float ds;
  321. if(n>1000||n<2)
  322. { if (f)
  323.    printf("\n Faild! Check if 1<n<1000!\n",n);
  324.    return(-1);
  325. }
  326. if(n==2)
  327. { *r=0.5*((*a)[0]+(*a)[1])*(h);
  328. return(0);
  329. }
  330. if (n-4==0)
  331. { *r=0;
  332. *r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]);
  333. return(0);
  334. }
  335. if(n/2-(n-1)/2<=0)
  336. nn=n;
  337. else
  338. nn=n-3;
  339. ds=(*a)[0]-(*a)[nn-1];
  340. for(i=2;i<=nn;i=i+2)
  341. ds=ds+4*(*a)[i-1]+2*(*a)[i];
  342. *r=ds*(h)/3;
  343. if(n>nn)
  344. *r=*r+0.375*(h)*((*a)[n-4]+3*(*a)[n-3]+3*(*a)[n-2]+(*a)[n-1]);
  345. return(0);
  346. }
  347. main()
  348. {
  349. float h,r;
  350. int n,ntf,f;
  351. int i;
  352. float a[16];
  353. printf("Input the x[i](16):\n");
  354. for(i=0;i<=15;i++)
  355. scanf("%d",&a[i]);
  356. h=0.2;
  357. f=0;
  358. ntf=NC(a,h,n,&r,f);
  359. if(ntf==0)
  360. printf("\nR=%f\n",r);
  361.   else
  362. printf("\n Wrong!Return code=%d\n",ntf);
  363.   getch();
  364. }



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

  366. C/C++ code
  367. #include <stdio.h>
  368. #include <math.h>
  369. #define N 20
  370. #define MAX 100
  371. #define e 0.00001
  372. int main()
  373. { int n;
  374. int i,j,k;
  375. float t;
  376. float a[N][N],b[N][N],c[N],g[N],x[N],h[N];
  377. printf("\nInput dim of n:");  scanf("%d",&n);
  378. if(n>N)
  379. { printf("Faild! Check if 0<n<N!\n"); getch(); return 1; }
  380. if(n<=0)
  381. {printf("Faild! Check if 0<n<N!\n"); getch(); return 1;}
  382. printf("Input a[i,j],i,j=0…%d:\n",n-1);
  383. for(i=0;i<n;i++)
  384.    for(j=0;j<n;j++)
  385.    scanf("%f",&a[i][j]);
  386. printf("Input c[i],i=0…%d:\n",n-1);
  387. for(i=0;i<n;i++)
  388. scanf("%f",&c[i]);
  389. for(i=0;i<n;i++)
  390.    for(j=0;j<n;j++)
  391.    { b[i][j]=-a[i][j]/a[i][i];   g[i]=c[i]/a[i][i]; }
  392.   for(i=0;i<MAX;i++)
  393.    { for(j=0;j<n;j++)
  394.      h[j]=g[j];
  395.      { for(k=0;k<n;k++)
  396.        { if(j==k) continue; h[j]+=b[j][k]*x[k]; }
  397.      }
  398.      t=0;
  399.      for(j=0;j<n;j++)
  400.      if(t<fabs(h[j]-x[j])) t=fabs(h[j]-x[j]);
  401.      for(j=0;j<n;j++)
  402.      x[j]=h[j];
  403.      if(t<e)
  404.      { printf("x_i=\n");
  405.       for(i=0;i<n;i++)     
  406. printf("x[%d]=%f\n",i,x[i]);
  407.        getch();
  408.        return 0;
  409.      }
  410.      printf("after %d repeat , return\n",MAX);
  411.      getch();
  412.      return 1;
  413.    }
  414.    getch();
  415. }



  416. 8.秦九昭算法

  417. C/C++ code
  418. #include <math.h>
  419. float qin(float a[],int n,float x)
  420. {    float r=0;
  421.     int i;
  422.     for(i=n;i>=0;i--)
  423.     r=r*x+a[i];
  424.     return r;
  425. }
  426. main()
  427. {    float a[50],x,r=0;
  428.     int n,i;
  429.     do
  430.     {    printf("Input frequency:");
  431.         scanf("%d",&n);
  432.     }
  433.     while(n<1);
  434.     printf("Input value:");
  435.     for(i=0;i<=n;i++)
  436.     scanf("%f",&a[i]);
  437.     printf("Input frequency:");
  438.     scanf("%f",&x);
  439.     r=qin(a,n,x);
  440.     printf("Answer:%f",r);
  441.     getch();
  442. }



  443. 9.幂法

  444. C/C++ code
  445. #include<stdio.h>
  446. #include<math.h>
  447. #define N 100
  448. #define e 0.00001
  449. #define n 3
  450. float x[n]={0,0,1};
  451. float a[n][n]={{2,3,2},{10,3,4},{3,6,1}};
  452. float y[n];
  453. main()
  454. { int i,j,k;
  455.    float xm,oxm;
  456.    oxm=0;
  457.    for(k=0;k<N;k++)
  458.    { for(j=0;j<n;j++)
  459.       { y[j]=0;
  460.         for(i=0;i<n;i++)
  461.         y[j]+=a[j][i]*x[i];
  462.       }
  463.       xm=0;
  464.       for(j=0;j<n;j++)
  465.       if(fabs(y[j])>xm) xm=fabs(y[j]);
  466.       for(j=0;j<n;j++)
  467.       y[j]/=xm;
  468.       for(j=0;j<n;j++)
  469.       x[j]=y[j];
  470.       if(fabs(xm-oxm)<e)
  471.       { printf("max:%f\n\n",xm);
  472.        printf("v[i]:\n");
  473.         for(k=0;k<n;k++)printf("%f\n",y[k]);
  474.        break;
  475.       }
  476.       oxm=xm;
  477.     }
  478. getch();
  479. }



  480. 10.高斯塞德尔

  481. C/C++ code
  482. #include<math.h>
  483. #include<stdio.h>
  484. #define N 20
  485. #define M 99
  486. float a[N][N];
  487. float b[N];
  488. int main()
  489. {    int i,j,k,n;
  490.     float sum,no,d,s,x[N];
  491.     printf("\nInput dim of n:");
  492. scanf("%d",&n);
  493. if(n>N)
  494. { printf("Faild! Check if 0<n<N!\n "); getch();
  495.    return 1;
  496. }
  497. if(n<=0)
  498. { printf("Faild! Check if 0<n<N!\n ");getch();return 1;}
  499. printf("Input a[i,j],i,j=0…%d:\n",n-1);
  500. for(i=0;i<n;i++)
  501. for(j=0;j<n;j++)
  502. scanf("%f",&a[i][j]);
  503. printf("Input b[i],i=0…%d:\n",n-1);
  504. for(i=0;i<n;i++) scanf("%f",&b[i]);
  505.     for(i=0;i<n;i++) x[i]=0;
  506. k=0;
  507. printf("\nk=%dx=",k);
  508. for(i=0;i<n;i++) printf("%12.8f",x[i]);
  509. do
  510. { k++;
  511.      if(k>M){printf("\nError!\n”);getch();}
  512.      break;
  513. }
  514. no=0.0;
  515. for(i=0;i<n;i++)
  516.   { s=x[i];
  517.     sum=0.0;
  518.     for(j=0;j<n;j++)
  519.     if (j!=i) sum=sum+a[i][j]*x[j];
  520.     x[i]=(b[i]-sum)/a[i][i];
  521.     d=fabs(x[i]-s);
  522.     if (no<d) no=d;
  523. }
  524. printf("\nk=%2dx=",k);
  525. for(i=0;i<n;i++)   printf("%f",x[i]);
  526. }
  527. while (no>=0.1e-6);
  528. if(no<0.1e-6)
  529. { printf("\n\n answer=\n");
  530.   printf("\nk=%d",k);
  531.   for (i=0;i<n;i++)
  532.   printf("\n x[%d]=%12.8f",i,x[i]);
  533. }
  534. getch();
  535. }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:86439 发表于 2015-7-23 23:52 来自手机 | 只看该作者
有什么用?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表