数值上机作业.doc_第1页
数值上机作业.doc_第2页
数值上机作业.doc_第3页
数值上机作业.doc_第4页
数值上机作业.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. 利用区间二分法计算下述方程在1,2的近似根,要求误差小于0.001#include#include#includefloat f(float x);void main() ifstream in(1in.txt,ios:in); ofstream out; cout*求方程x3-x-1=0在1,2上的近似根*e; if(f(1)*f(2)0) coute) x=0.5*(a+b); value=f(x); if(f(a)*f(x)0) b=x; else a=x; i+; out.open(1out.txt,ios:out); out方程近似解为:0.5*(a+b); cout求解成功!迭代次数为i次endl; in.close; out.close; float f(float x)return pow(x,3)-x-1;、0.0012. 用牛顿迭代法求取下列方程在0.5附近的根,要求误差小于0.0001。 #include#include#includefloat f1(float x);float f2(float x);const float e1=2.71828183;void main()float x0,e,x1;ifstream in(2in.txt,ios:in);inx0e;while(fabs(f1(x0)e)x1=x0-f1(x0)/f2(x0);x0=x1;ofstream out(2out.txt,ios:out);out近似解为:x1;in.close;out.close;float f1(float x)return x-pow(e1,-x);float f2(float x)return 1+pow(e1,-x);0.5 0.00013. 用列主元素消去法编程,最大变元数200;给出下面方程组的运算结果。#include#include#includevoid choose_main_element(float a202,float b,int k,int n);void main()ifstream in(3in.txt,ios:in);float a202202,b202,float c;int n=0;while(in.get()!=n)inc;n+; n-;/自动判断方程组阶数n(bug:不能在每一行最后加空格,且每个数字前都要有空格,否则无法判断)in.close;ifstream in1(3in.txt,ios:in);for(int q=1;q=n;q+)for(int w=1;waqw;in1bq;/读取数据float m;int k=1,i,j;for(k=1;k=n-1;k+)choose_main_element(a,b,k,n);for(i=k+1;i=n;i+)aik=aik/akk;for(j=k+1;j=1;i-)for(j=i+1;j=n;j+) sum+=aij*bj;bi=(bi-sum)/aii;sum=0;/回代过程ofstream out(3out.txt,ios:out);out方程组的解为:(;for(int t=1;t=n-1;t+)outbt,;outbn)T;cout求解成功endl;in1.close;out.close;void choose_main_element(float a202,float b,int k,int n) /选主元素float max_element=akk;int max_element_number=k;for(int m=k;mmax_element)max_element=amk;max_element_number=m;float temp,temp1;for(int c=k;c=n;c+)temp=akc;akc=amax_element_numberc;amax_element_numberc=temp;temp1=bk;bk=bmax_element_number;bmax_element_number=temp1; 1 2 -3 82 1 3 223 2 1 284. 用矩阵分解法编程,最大变元数200;给出下面方程组的运算结果。 #include#includeint main()ifstream infile(in.txt,ios:in);ofstream outfile(out.txt,ios:out); int i,j,n,p;float a200200,b200,x200,w=0;infilen;for(i=0;in;i+)for(j=0;jaij; for(i=0;ibi;for(i=1;in;i+)ai0=ai0/a00;for(i=1;in;i+)for(j=1;jn;j+) if(i=j) for(p=0;pj) for(p=0;pj;p+) w+=aip*apj; aij=aij-w; aij=aij/ai-1j; if(ij) for(p=0;pi;p+) w+=aip*apj; aij=aij-w; w=0; /求LU分解矩阵for(i=0;in;i+) outfileendl; for(j=0;jn;j+) outfileaij ; outfileendl;x0=b0;for(i=1;in;i+)for(j=0;ji;j+) w=w+xj*aij; xi=(bi-w); w=0;/求LY=B中的Yfor(i=0;in;i+) outfilexi ;outfileendl;for(i=0;i=0;i-)for(j=n-1;ji;j-) w=w+xj*aij; xi=(bi-w)/aii; w=0;/求UX=Y中的Xfor(i=0;in;i+) outfilexiendl; 3 2 3 4 3 -2 2 4 2 3 39 14 435. 对于一组数据表进行二次插值编程;根据下面数据表计算f(0.31),f(0.49)和f(0.51)。x0.20.40.60.8f(x)16201510解法一:#include#includevoid main() ifstream infile(in.txt,ios:in); ofstream outfile(out.txt,ios:out); float x100,y100,l100,s,w,L100,X100; int i,j,n,m,p; infilenm;for(i=0;im;i+) Li=0;for(i=0;iXi;for(i=0;ixi;for(i=0;iyi;for(p=0;pm;p+) for(i=0;in;i+) s=1;w=1; for(j=0;jn;j+)if(i!=j) w*=(xi-xj);else s*=1; for(j=0;jn;j+) if(i!=j) s*=(Xp-xj); else s*=1; li=s/w; for(i=0;in;i+) Lp+=li*yi; for(i=0;in;i+) outfileLiendl; 3 30.31 0.49 0.510.2 0.4 0.6 16 20 15解法二:/*对于一组数据表进行二次插值编程*/#include#includevoid main()double x50=0,y50=0,z50,b=0,l=1; /*z待求数 b累加器 l累乘器*/ int i,n,m,j,dn,dx,td,tt=0,k; /*m已知数个数 n未知数个数 dn、dx待测点介于这两数之间*/ ifstream infile(in.txt,ios:in); ofstream outfile(out.txt,ios:in); infilemn; for (i=0;ixi; for (i=0;iyi; for (i=0;izi; outfilesetiosflags(ios:fixed)setprecision(5); /设置精度 for (i=0;in;i+) for (j=0;j=xj) dn=j; /判断该数处于哪个位置if (zi=-1) tt=dn-1;for(td=dn-1;td=dx;td+) l=1; /累乘器调1 for (k=tt;k=dx;k+) if (k!=td) l=l*(zi-xk)/(xtd-xk); b=b+l*ytd;outfile当x=ziendl从该数右边第一个数向左取数的内插:bendl;if(dx+2=dn;td-) l=1; for (k=tt;k=dn;k-) if (k!=td) l=l*(zi-xk)/(xtd-xk); b=b+l*ytd; outfile当x=ziendl从该数左边第一个数向右取数的内插:bendl;b=0; if (dn-2-1) tt=dx; for(td=dx;td=dx+2;td+) l=1; for (k=tt;k=dx+2;k+) if (k!=td) l=l*(zi-xk)/(xtd-xk); b=b+l*ytd; outfile当x=ziendl从该数右边第一个数向右取数的外推:bm) b=0; tt=dn; for (td=dn;td=dn-2;td-) l=1; for (k=tt;j=dn-2;k-) if(k!=td) l=l*(zi-xk)/(xtd-xk); b=b+l*ytd; outfile当x=ziendl从该数左边第一个数向左取数的外推:bendl;outfileendl; infile.close(); outfile.close();输入4 30.2 0.4 0.6 0.816 20 15 100.31 0.49 0.51输出当x=0.31000从该数左边第一个数向右取数的内插:19.31375当x=0.31000从该数右边第一个数向右取数的外推:22.25000当x=0.49000从该数右边第一个数向左取数的内插:18.86375当x=0.49000从该数左边第一个数向右取数的内插:17.75000当x=0.51000从该数右边第一个数向左取数的内插:18.36375当x=0.51000从该数左边第一个数向右取数的内插:17.250006. 对于一组数据表进行二次多项式曲线拟合;根据以下数据的二次拟合曲线求y(5),并计算其绝对误差和相对误差。X12345678910Y1.62.83.64.95.46.87.99.210.211.4#include#include#includevoid main()ifstream infile(in.txt,ios:in);ofstream outfile(out.txt,ios:out); double a100100,b100,x100,w0,w1,w2,x0,w=0,s=0,Y,W,S; int n,i,j,p,m; w0=0;w2=0;w1=0; infilen;m=n; infilex0; for(i=0;ixi;for(i=0;ibi;for(i=0;in;i+)for(j=0;jn;j+)aij=0; a00=n/1.0; for(i=0;in;i+) a01+=xi; a02+=xi*xi; a12+=xi*xi*xi; a22+=xi*xi*xi*xi;a10=a01,a11=a02,a20=a02,a21=a12;/系数矩阵for(i=0;i3;i+)/ coutendl;for(j=0;j3;j+)outfileaij ;/for(i=0;in;i+) w0+=bi,w1+=xi*bi,w2+=xi*xi*bi;b0=w0;b1=w1;b2=w2;/常数项outfileendl;for(i=0;i3;i+) outfilebi ;n=3;for(i=1;in;i+)ai0=ai0/a00;for(i=1;in;i+)for(j=1;jn;j+) if(i=j) for(p=0;pj)for(p=0;pj;p+)w+=aip*apj;aij=aij-w;aij=aij/ai-1j; if(ij)for(p=0;pi;p+)w+=aip*apj; aij=aij-w; w=0; /求LU分解矩阵for(i=0;in;i+) outfileendl; for(j=0;jn;j+) outfileaij ; coutendl;x0=b0;for(i=1;in;i+)for(j=0;ji;j+) w=w+xj*aij; xi=(bi-w); w=0;/求LY=B中的Yfor(i=0;in;i+) outfilexi ;outfileendl;for(i=0;i=0;i-)for(j=n-1;ji;j-) w=w+xj*aij; xi=(bi-w)/aii; w=0;/求UX=Y中Xfor(i=0;in;i+) outfilexiendl;Y=x0+x1*x0+x2*x0*x0;outfileendlY;for(i=0;im;i+) s+=(bi-Y)*(bi-Y);W=sqrt(s)/m;S=W/Y;outfileendl;outfileWendlS10 5 1 2 3 4 5 6 7 8 9 10 1.6 2.8 3.6 4.9 5.4 6.8 7.9 9.2 10.2 11.4解法二:/*对于一组数据进行二次多项式曲线拟合*/#include#include#includevoid main()double a200200=0,x200=0,y200,b200=0,l=1,zj,z,d=0,c; /*z待求数*/ int i,n,m,j,g,f,h,k=0; /*g已知数个数 i行数 j列数 */ ifstream infile(in.txt,ios:in); ofstream outfile(out.txt,ios:in); infileg; for(i=0;ixi; for(i=0;iyi; infilezh; /设定方程阶数 h=h+1; for(i=0;ih;i+) for(j=0;jh;j+) d=0; for (k=0;kg;k+) d=d+pow(xk,i+j); aij=aij+d; /系数矩阵A for(i=0;ih;i+) d=0; for (k=0;kg;k+) d=d+yk*pow(xk,i); bi=bi+d; /增广矩阵b for(i=0;ih;i+) aih=bi;k=h+1;/第三题的列主元法求方程组 for (m=0,n=0;mh;m+,n+) for (i=m;i=ai+1n) f=i;/确认最大行数 if (i+1=h) for(j=0;jk;j+) /换元 b0=afj;afj=amj;amj=b0; for(i=m+1;ih;i+) /消元 c=ain/amn; for (j=n;jk;j+)aij=aij-c*amj; for (m=0;m=0;i-) d=0; for(j=i+1;j=h-1;j+) d=d+aij*xj; xi=(bi-d)/aii; outfile得出曲线方程:y=x0+x1*x+x2*x2endl; zj=x0+z*x1+z*z*x2; outfile当x=z时解为:zjendl实际值为:yint(z-1)endl; outfile绝对误差:fabs(zj-yint(z-1)endl; outfile相对误差:fabs(zj-yint(z-1)/yint(z-1)endl; infile.close(); outfile.close()101 2 3 4 5 6 7 8 9 101.6 2.8 3.6 4.9 5.4 6.8 7.9 9.2 10.2 11.45 2得出曲线方程:y=0.766667+0.914545*x+0.0151515*x2当x=5时解为:5.71818实际值为:5.4绝对误差:0.318182相对误差:0.05892267. 取h=0.2,用改进欧拉方法求解下列初值问题。#include#include#includedouble dy(double x,double y)return sqrt(2*x*x+3*y*y);int main()double h,x0,y

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论