包括拉格朗日,牛顿插值,高斯,龙贝格,牛顿迭代,牛顿-科特斯,雅克比,秦九昭,幂法,高斯塞德尔 。都是经典的数学算法,希望能开托您的思路。转自kunli.info
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++ code
-
5 .牛顿迭代公式,求方程的近似解
- 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(); }