数值分析中的各种公式C代码.docx
《数值分析中的各种公式C代码.docx》由会员分享,可在线阅读,更多相关《数值分析中的各种公式C代码.docx(28页珍藏版)》请在三一办公上搜索。
1、数值分析中的各种公式C 代码二分法 2.2 算法步骤 步骤1: 准备 计算f(x)在有根区间a,b端点处的值f(a),f(b). 步骤2: 二分 计算f(x)在区间中点 (a+b)/2处的值 f(a+b)/2). 步骤3: 判断 若f(a+b)/2)=0,则(a+b)/2即是根,计算过程结束,否则检验; 若f(a+b)/2)f(a)0,则以(a+b)/2代替b,否则以(a+b)/2代替a. 反复执行步骤2和步骤3,直到区间a,b的长度小于允许误差e,此时中点(a+b)/2即为所 求近似根。 2.3 程序流程图 开始 a,b,e k=0 x0=(a+b)/2 f (a)f(x0)=c N c0
2、Y Y c=0 x0=b 输出x0,k x0=b STOP b-a=e Y 输出x0,k N k+1=k STOP 3 实验结果分析 #includestdio.h void main float a,b,e,x,c; int k=0,n=1; scanf(%f,%f,%f,&a,&b,&e); while(n=1) x=(a+b)/2;c=(x*x*x-x-1)*(a*a*a-a-1); if(c0) b=x; if(b-a=e) printf(%f,%dn,x,k); break; else k+; else if(c=0) printf(%f,%dn,x,k); break; else
3、a=x; if(b-a=e) printf(%f,%dn,x,k); break; else k+; 高斯塞德尔迭代法求方程组解 高斯主元素消去法求方程组解 2.2 算法步骤 高斯塞德尔迭代法: (0)(0)(0)步骤1:给定初值x1,x2,.,xn1 ,精度e,最大容许迭代次数M,令k=1。 nx(1)i=(x(1)(1)i-aijx(j0).aiij=1j0(0)步骤2:对 i=1,2,n 依此计算ei=xi-xixi(1)xi(0)步骤3:求出 e=(0),若 e,则输出 (i=1,2,.,n ),停止计算。否则执行步 exeiimax1in步骤4:若ke i=1,n,1 (bi-aij
4、xj-j=1i-1j=i+1anijxj)/aijxi,xit y xi-te xi-te i y ee n k 输出x1,x2,.,xn 输出迭代失败标志 结束 高斯主元素消去法: 开始 输入系数矩阵A常数项b及n det-1 k=1,n-1,1 调选列主元子程序 i=k+1,n,1 aikaij-aik/akk j=k+1,n,1 aikaij-aik/akj j bibi-aikbk i detakkdet k 消元过程 bnbn/am i=n-1,1,-1 S-0 j=i+1,n,1 ss=aijbj j bi (bi-s)/aij i detanndet 输出b及det 结束 3 实
5、验结果分析 高斯塞德尔迭代法: 回代过程高斯主元素消去法: 高斯塞德尔迭代法: #include #include/控制输入的格式,如下边setw(6),1.234567控制了小数点后六位 #include #include #define M 10 int n; void Gauss_seidel(double x,double x0,double aM,double b,double eps,int Nmax) int i,j,s=0; double max; while(sNmax) for(i=0;in;i+) xi=bi; for(j=0;jn;j+) if(j!=i) xi=xi-
6、aij*xj; xi=xi/aii; max=fabs(x0-x00); for(i=1;imax) max=fabs(xi-x0i); if(maxeps) break; for(i=0;i=Nmax) cout迭代发散!nendl; else cout原方程组的解为:nendl; for(i=0;in;i+) printf(X%d=%fn,i+1,xi); void main double a1010=5,2,1,-1,4,2,2,-3,10; double b10=-12,20,3; double x10,x0110; double eps;/ 精度 int i,j,s=0,Nmax;
7、cout方程组系数矩阵:endl; n=3; for(i=0;in;i+) for(j=0;jn;j+) coutsetw(6)aij;/同上 coutsetw(6)biendl; cout输入初始向量:endl; for(i=0;ixi; x01i=xi; coutn输入所需精度:eps; cout输入最大迭代次数:Nmax; Gauss_seidel(x,x01,a,b,eps,Nmax); coutendl; 高斯主元素消去法: #include #include #include /在列向量中寻找绝对值最大的项,并返回该项的标号 int FindMax(int p,int N,doub
8、le *A) int i=0,j=0; double max=0.0; for(i=p;imax) j=i; max=fabs(Ai*(N+1)+p); return j; /交换矩阵中的两行 void ExchangeRow(int p,int j,double *A,int N) int i=0; double C=0.0; for(i=0;iN+1;i+) C=Ap*(N+1)+i; Ap*(N+1)+i=Aj*(N+1)+i; Aj*(N+1)+i=C; /上三角变换,A为增广矩阵的指针,N为矩阵的行数。 void uptrbk(double *A,int N) int p=0,k=0
9、,q=0,j=0; double m=0.0; for(p=0;pN-1;p+) /找出该列最大项的标号 j=FindMax(p,N,A); /交换p行和j行 ExchangeRow(p,j,A,N); if(Ap*(N+1)+p=0) printf(矩阵是一个奇异矩阵,没有唯一解!); break; /消去P元素以下的p列内容。 for(k=p+1;kN;k+) m=Ak*(N+1)+p/Ap*(N+1)+p; for(q=p;qN+1;q+) Ak*(N+1)+q=Ak*(N+1)+q-m*Ap*(N+1)+q; printf(n增广矩阵高斯列主元消去后的矩阵为:n); for(j=0;j
10、=0;k-) temp=0.0; for(i=k+1;i256|N=0) printf(输入的数字不再范围之内!); printf(n); return 0; else A=(double*)calloc(N*(N+1),sizeof(double); printf(请输入待求解方程组的增广矩阵(%d行%d列):n,N,N+1); for(i=0;iN*(N+1);i+) scanf(%lf,&Ai); system(cls); printf(方程的增广矩阵为:n); for(i=0;iN*(N+1);i+) if(i%(N+1)=0) printf(n); printf(%lft,Ai);
11、uptrbk(A,N); /上三角变换 X=backsub(A,N); /回代函数 printf(nn方程组的解为:n); for(i=0;iN;i+) printf(X(%d)= %lfn,i+1,Xi); free(A); free(X); exit(0); 二次或者三次样条插值 #include math.h #include stdio.h #include #include iostream.h #include GaussRemove.h #define BOOL int #define FALSE 0 #define TRUE 1 /计算分段线性插值的系数 void Linear
12、Coe(double * pd_X, double * pd_Y,double * pd_Coe, int i) /计算分段二次多项式插值的系数 void QuadrateCoe(double * pd_X, double * pd_Y,double * pd_Coe, int i) for(int j = 0; j n+1; j+) GaussRemove(pd_MatrixA,pd_VectorB,pd_Coe,n+1); pd_MatrixAj*3 = pd_Xi+j-1*pd_Xi+j-1; pd_MatrixAj*3 + 1 = pd_Xi+j-1; pd_MatrixAj*3 +
13、2 = 1; pd_VectorB0 = pd_Yi-1; pd_VectorB1 = pd_Yi; pd_VectorB2 = pd_Yi+1; int n = 2; double * pd_MatrixA = new double(n+1)*(n+1); double * pd_VectorB = new doublen+1; pd_Coe0 = (-pd_Xi*pd_Yi+1+pd_Xi+1*pd_Yi)/(pd_Xi+1-pd_Xi); pd_Coe1 = (pd_Yi+1-pd_Yi)/(pd_Xi+1-pd_Xi); /计算分段三次多项式插值的系数 void ThriceCoe(d
14、ouble * pd_X, double * pd_Y,double * pd_Coe, int i) /计算三次样条插值函数的系数组M void SplineCoe(double * pd_X, double * pd_Y, int N, double * pd_h, double * pd_M) int n = N -1; double * pd_Alpha = new doublen; /系数数组Alpha double * pd_Beta = new doublen; /系数数组Beta double * pd_Gama = new doublen; /系数数组Gama int i,j
15、; int n = 3; double * pd_MatrixA = new double(n+1)*(n+1); double * pd_VectorB = new doublen+1; pd_VectorB0 = pd_Yi-2; pd_VectorB1 = pd_Yi-1; pd_VectorB2 = pd_Yi; pd_VectorB3 = pd_Yi+1; for(int j = 0; j n+1; j+) GaussRemove(pd_MatrixA,pd_VectorB,pd_Coe,n+1); pd_MatrixAj*4 = pd_Xi+j-2*pd_Xi+j-2*pd_Xi+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值分析中的各种公式C 代码 数值 分析 中的 各种 公式
![提示](https://www.31ppt.com/images/bang_tan.gif)
链接地址:https://www.31ppt.com/p-3558797.html