数值方法编程

上传人:d**** 文档编号:170865249 上传时间:2022-11-23 格式:DOCX 页数:11 大小:65.75KB
收藏 版权申诉 举报 下载
数值方法编程_第1页
第1页 / 共11页
数值方法编程_第2页
第2页 / 共11页
数值方法编程_第3页
第3页 / 共11页
资源描述:

《数值方法编程》由会员分享,可在线阅读,更多相关《数值方法编程(11页珍藏版)》请在装配图网上搜索。

1、第一次作业1、编制通用程序:对n+1个节点xi及:=他讯=0,n)(l)n次拉格朗日插值计算公式Ln(x); ( 2) n 次牛顿向前插值计算公式;2、已知 f(x)=lnx,d,b=1,2,取 h=0.1,Xi=1+ih,i=0,1,:10。用通用程序计算 lnl.54 及 1.98的近似值.|流程图:输入n+1个函数节点拉格朗日插值:1、求系数Lk(X); 2、求插值多项式L (X)并计算kn牛顿前插:1、输入步长h,并计算t; 2、求t* (t-1)(t-n+1) 及Any03、求插值多项式N (x)并计算n输出对所求插值多项式的计算结果插值节点:xi1.01.1.1.21.31.41.

2、51.61.71.81.92.0yi00.09530.18230.26240.33650.40550.47000.53060.58780.64180.6931程序:#includeclass Lag拉格朗日插值类 public:Lag(int n0,float y)N=n0;z=y;coutvv请依次输入n1个节点坐标(x,y):vvendl; for(int i=0;iN;i+)coutxi,yiXiYi;Li=1.0; void La()/求系数 Lk(x)for(int i=0;iN;i+)for(int j=0;jN;j+) if(i!=j) Li=Li*(z-Xj)/(Xi-Xj);

3、 double Ln() /求函数的拉格朗日插值 double sum(0);for(int i=0;iN;i+) sum+=Li*Yi; return sum; private:int N;/牛顿插值类float X20,Y20,z; double L20;class Niupublic:Niu(int n, double T) N=n;t=T;coutvv请依次输入n2个节点坐标y:vvendl;for(int i=0;iN;i+) coutyiYi;double Nn()/求函数的牛顿插值 double a20;double sum=Y0,c(1.0);for(int i=0;iN-1;

4、i+)c=c*(t-i)/(i+1);for(int p=0;p=0;j-) for(int q=0;qx;coutvvn拉格朗日插值:vvendl; coutvv请输入节点数n1:;cinn1;Lag m(n1,x);m.La();coutvvnvv用拉格朗日插值算法计算:f(vvxvv)=vvm.Ln()vvendl; coutvvnvv牛顿向前插值:nvvendl;coutvv请输入节点数n2:;cinn2;double h,T,x0;coutvv请输入步长h=;cinh;coutvv请输入 X0=;cinx0;T=(x-x0)/h;Niu b(n2,T);coutvvnvv用牛顿向前插

5、值算法计算:f(vvxvv)=vvb.Nn()vvendl;运行结果:请输入要求函数的x值:1.54拉格朗日插值:请输入节点数n1= 3请依次输入n1个节点坐标(x,y):(x0,y0 ):1.4 0.3365(x1,y1 ):1.5 0.4055(x2,y2 ):1.6 0.4700用拉格朗日插值算法计算: f(1.54)=0.43184牛顿向前插值:请输入节点数n2= 3请输入步长h= 0.1请输入 X0= 1.4请依次输入 n2 个节点坐标 y:y0:0.3365y1:0.4055y2:0.4700用牛顿向前插值算法计算: f(1.54)=0.43184Press any key to

6、continue请输入要求函数的x值:1.98拉格朗日插值:请输入节点数n1= 3请依次输入n1个节点坐标(x,y):(x0,y0 ):1.8 0.5878(x1,y1 ):1.9 0.6418(x2,y2 ):2.0 0.6931用拉格朗日插值算法计算: f(1.98)=0.683056牛顿向前插值:请输入节点数n2= 3请输入步长 h= 0.1请输入 X0= 1.8请依次输入 n2 个节点坐标 y:y0: 0.5878y1: 0.6418y2: 0.6931用牛顿向前插值算法计算:f(1.98)=0.683056Press any key to continue第二次作业编制解Ax=b的通

7、用子程序(1)实现矩阵分解的杜利特尔方法(2)实现矩阵分解的乔立斯机方法程序:#include #include class Doolittlepublic: Doolittle(int n)/杜利特尔矩阵分解 N=n;coutvv请输入系数矩阵 Avv NvvvvNvv:vvendl; for(int i=1;i=N;i+)for(int j=1;jAi-1j-1;coutvv请输入向量 b:vvendl; for(i=1;ibi-1;for(i=1;iv=N;i+) U0i-1=A0i-1;Li-10=Ai-10/U00; for(int r=2;rv=N;r+) for(i=r;iv=N

8、;i+) double sum1(0),sum2(0);for(int k=1;kv=r-1;k+) sum1=sum1+Lr-1k-1*Uk-1i-1; sum2=sum2+Li-1k-1*Uk-1r-1; Ur-1i-1=Ar-1i-1-sum1;Li-1r-1=(Ai-1r-1-sum2)/Ur-1r-1;void result1()/杜利特尔分解方法求解y0=b0;for(int i=2;i=N;i+)double sum3(0);for(int k=1;k=1;i-) double sum4(0);for(int k=i+1;k=N;k+) sum4=sum4+Ui-1k-1*xk-

9、1; xi-1=(yi-1-sum4)/Ui-1i-1;coutvv使用 Doolitlle 分解求解:nvvendl;coutvv方程组的解为vvendl;for(i=1;i=N;i+) coutxi-1=xi-1bi-1;coutvv请输入系数矩阵 Avv NvvvvNvv:vvendl;for(i=1;iv=N;i+)for(int j=1;jv=N;j+) cinAi-1j-1;L00=sqrt(A00);for(i=2;iv=N;i+) Li-10=Ai-10/L00;for(int j=1;jv=N;j+)double sum1(0);for(int k=1;kv=j-1;k+)

10、sum1=sum1+Lj-1k-1*Lj-1k-1; Lj-1j-1=sqrt(Aj-1j-1-sum1);for(i=j+1;iv=N;i+)double sum2(0); for(k=1;kv=j-1;k+) sum2=sum2+Li-1k-1*Lj-1k-1; Li-1j-1=(Ai-1j-1-sum2)/Lj-1j-1; void result2()/乔立斯机矩阵分解方法求解y0=b0/L00;for(int i=2;iv=N;i+)double sum3(0);for(int k=1;kv=i-1;k+) sum3=sum3+Li-1k-1*yk-1; yi-1=(bi-1-sum3

11、)/Li-1i-1;xN-1=yN-1/LN-1N-1;for(i=N-1;i=1;i-) double sum4(0);for(int k=i+1;kv=N;k+) sum4=sum4+Lk-1i-1*xk-1; xi-1=(yi-1-sum4)/Li-1i-1;coutvvn 使用 Cholesky 分解求解: vvendl;coutvv方程组的解为vvendl;for(i=1;i=N;i+) coutxi-1=xi-1n0;Doolittle m(n0);m.result1();coutvv用乔立斯基分解方法求解5;coutn1;Cholesky n(n1);n.result2(); 运

12、行结果:用杜利特尔分解方法求解 请输入阶数 n=6请输入系数矩阵 A66:1 2 4 7 11 162 3 5 8 12 174 5 6 9 13 187 8 9 10 14 1911 12 13 14 15 2016 17 8 19 20 21 请输入向量 b:1 2 4 5 8 7使用 Doolitlle 分解求解:方程组的解为x0=25.3333 x1=-24.3333 x2=-1 x3=0.666667 x4=-3.66667 x5=4用乔立斯基分解方法求解 请输入阶数 n=4 请输入向量 b:12.280 16.928 22.957 50.945请输入系数矩阵 A44:4 0 0 0

13、2.4 5.44 0 02 4 5.21 03 5.8 7.45 19.66使用Cholesky分解求解:方程组的解为x0=1.2x1=-0.8x2=1.7x3=2Press any key to continue第三次作业1、编制通用子程序:(1)雅可比迭代格式;(2)高斯-赛德尔迭代格式;(3) SOR方法格式3、用编制的程序求解方程组Ax=b,取初值x(0)=(1,1,1,1,1,1)t,要求Ilx(k+i)-x(k)|W10-5。 流程图:程序:#include#includeclass Jacobi/雅可比迭代类public:Jacobi(int n) N=n;coutvvJakob

14、i迭代法vvn请输入误差估计e0=;cine0;coutvv请输入系数矩阵 Avv NvvvvNvv:vvendl; for(int i=0;iN;i+) for(int j=0;jAij;coutvv请输入向量 b:vvendl; for(i=0;ibi;coutvv请输入初始解向量xO:vvendl;for(i=0;ivN;i+) cinx0i;for(i=0;ivN;i+) bi=bi/Aii;for(i=0;ivN;i+) for(int j=0;jvN;j+) if(i!=j) Aij=-Aij/Aii; for(i=0;ivN;i+) Aii=0;void result1()/雅可

15、比迭代格式求解int m(0);Loop1:m+;for(int i=0;ivN;i+)double sum1(0); for(int j=0;jvN;j+) sum1=sum1+Aij*xj;xi=bi+sum1; double sum2(0);for(i=0;ivN;i+) sum2=(xi-x0i)*(xi-x0i)+sum2; if(sqrt(sum2)e0) for(i=0;ivN;i+) x0i=xi;goto Loop1;coutvvJakobi 迭代法求解得:vvendl; for(i=0;ivN;i+) coutvvxvvivv=vvxivvendl; coutvv迭代次数为

16、:vvmvvendl; private:double A1010,b10,x010,x10,e0;int N;class Gauss_Seidle public:Gauss_Seidle(int n) N=n;coutvvnGauss_Seidle 迭代法vvn 请输入误差估计 e0=; cine0;coutvv请输入系数矩阵 Avv NvvvvNvv:vvendl; for(int i=0;ivN;i+) for(int j=0;jvN;j+) cinAij; coutvv请输入向量 b:vvendl;for(i=0;ivN;i+) cinbi;coutvv请输入初始解向量x0:vvendl

17、; for(i=0;ivN;i+) cinx0i;for(i=0;ivN;i+) bi=bi/Aii;for(i=0;iN;i+) for(int j=0;jN;j+) if(i!=j) Aij=-Aij/Aii;for(i=0;iN;i+) Aii=0;void result2()/高斯-赛德尔迭代格式求解int m1(0);Loop2:for(int i=0;iN;i+) double sum1(0);for(int j=0;j=i-1;j+) sum1=sum1+Aij*xj;for(j=i+1;jN;j+) sum1=sum1+Aij*x0j;xi=bi+sum1;double sum

18、2(0);for(i=0;ie0) for(i=0;iN;i+) x0i=xi;goto Loop2;coutvvGauss_Seidle 迭代法求解得:vvendl;for(i=0;iN;i+) coutxi=xie0;coutvv请输入系数矩阵 Avv NvvvvNvv:vvendl; for(int i=0;ivN;i+)for(int j=0;jvN;j+) cinAij;coutvv请输入向量 b:vvendl;for(i=0;ivN;i+) cinbi;coutvv请输入初始解向量x0:vvendl;for(i=0;ivN;i+) cinx0i; coutvv请输入松弛因子w:;

19、cinw;void result3()/SOR 方法格式求解int ml(0);x0=x00;Loop3:for(int i=1;i=N;i+) double sum1(0);for(int j=1;j=i-1;j+) sum1=sum1+Ai-1j-1*xj-1; for(j=i;j=N;j+) sum1=sum1+Ai-1j-1*x0j-1; xi-1=x0i-1+(bi-1-sum1)*w/Ai-1i-1;double sum2(0);for(i=0;ie0) for(i=0;iN;i+) x0i=xi;goto Loop3;coutvvSOR 迭代法求解得:vvendl;for(i=0

20、;iN;i+) coutxi=xin;Jacobi ml(n);ml.resultl();Gauss_Seidle m2(n);m2.result2();SOR m(n);m.result3();程序运行结果:请输入阶数 n=6Jakobi 迭代法请输入误差估计 e0=0.0000l请输入系数矩阵 A66:4 -l 0 -l 0 0-l 4 -l 0 -l 00 -l 4 0 0 -l-l 0 0 4 -l 00 -l 0 -l 4 -l0 0 -l 0 -l 4请输入向量 b:0 5 0 6 -2 6请输入初始解向量 x0:l l l l l lJakobi 迭代法求解得: x0=0.999

21、997x1=2x2=0.999999x3=2x4=0.999999x5=2 迭代次数为:155Gauss_Seidle 迭代法 请输入误差估计 e0=0.00001 请输入系数矩阵 A66:4 -1 0 -1 0 0-1 4 -1 0 -1 00 -1 4 0 0 -1-1 0 0 4 -1 00 -1 0 -1 4 -10 0 -1 0 -1 4 请输入向量 b:0 5 0 6 -2 6 请输入初始解向量 x0:1 1 1 1 1 1Gauss_Seidle 迭代法求解得 x0=0.999997x1=2x2=0.999999x3=2x4=0.999998x5=2迭代次数为:13SOR 迭代法 请输入误差估计 e0=0.00001 请输入系数矩阵 A66:4 -1 0 -1 0 0-1 4 -1 0 -1 00 -1 4 0 0 -1-1 0 0 4 -1 00 -1 0 -1 4 -10 0 -1 0 -1 4 请输入向量 b:0 5 0 6 -2 6 请输入初始解向量 x0:1 1 1 1 1 1 请输入松弛因子 w:1.3 SOR 迭代法求解得: x0=1 x1=2 x2=1 x3=2 x4=1 x5=2 迭代次数为:12Press any key to continue

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!