数学实验报告
实验序号: 03 日期:2017年 12 月 20 日
班级 | 信息计算科学 | 姓名 | 学号 | 1601114041 | ||
实验名称 | 求代数方程近似根 | |||||
问题背景描述:求代数方程的根是最常见的数学问题之一,当f(x)是一次多项式时,称f(x)=0为线性方程;否则称之为非线性方程。当f(x)=0是非线性方程时,由于f(x)的多样性,尚无一般的解析解法可使用,但如果对任意的精度要求,能求出方程的近似跟,则可以认为求根的计算问题已经解决,至少能满足实际要求。 | ||||||
实验目的:本实验介绍一些求方程实根的近似值的有效方法,要求在使用这些方法前先确定求根区间[a,b],或给出某根的近似值x0。在实际问题抽象出的数学模型中,x0可以根据物理背景确定;也可根据y=f(x)的草图等方法确定,还可用对分法,迭代法及牛顿切线法大致确定根的分布情况。 | ||||||
实验原理与数学模型:对分法函数;function [ x ] = duifen( a,b,tol,f ) if abs(f(a))<tol; x=a; else if abs(f(b))<tol; x=b; else x=(a+b)/2; fx=f(x); k=1; while abs(fx)>tol&&a<b fprintf('k=%d,a=%f,b=%f,f(x)=%e\n',k,a,b,fx); if f(a)*fx<0; b=x; else a=x; end a=(a+b)/2; fx=f(x); k=k+1; end fprintf('k=%d,a=%f,b=%f,f(x)=%e\n',k,a,b,fx); end end | 迭代法函数:迭代法: function [x]=Diedai(tol,f,g,x) k=1; fx=f(x); fprintf('k=%d,x=%f,f(x)=%e\n',k,x,fx); while abs(fx)>tol; x=g(x);fx=f(x); k=k+1; fprintf('k=%d,x=%f,f(x)=%e\n',k,x,fx); end | |||||
实验所用软件及版本:matlab | ||||||
主要内容(要点):本实验主要介绍一些有效的求解方程的数值方法:对分法,不动点迭代法及加速方法、牛顿法 第一题:选择适当的迭代过程,分别使用(1)普通迭代法(2)与之相应的松弛迭代法和Altken迭代法。求方程在1.4附近的根,精确到4位小数。请注意迭代次数的变化。 第二题:分别用对分法、普通迭代法、松弛迭代法、Alken迭代法、牛顿切线法等五种方法求方程 tx=sin(x)的正的近似跟,0<t<=1.(建议取t=0.5.时间许可的话可进一步考虑t=0.25,t=0.125的情况) 求代数方程近似解的方法有:(1)对分法:将区域不断对分,判断根在某个分段内,再对该段进行对分,以此类推,直至满足精度为止。对分法适用于求有跟区间内的单实根或奇重实根。 (2)迭代法:从某个近似根x出发计算x(k+1)=ɸ(xk) k=0,1,2…… (3)松弛迭代原理:x(k+1)=(1-wk)*xk+wk*ɸ(xk) k=0,1,2……其中wk= ,(ɸ’(xk) (4)牛顿法迭代:x(k+1)=xk-f(xk)/f’(xk) k=0,1,2…… (5)其他方法:solve,roots,fzero,linsolve | ||||||
实验过程记录(含基本步骤、主要程序清单及异常情况记录等):1.画函数图像,观察根的分布 2.对分法求根的近似值,精度低 3普通迭代法(不动点迭代) 3.普通迭代法(不动点迭代) 4判断所选迭代形式(函数)的收敛性 4.判断所选迭代形式(函数)的收敛性 5.迭代加速方法:松弛加速;Altken方法 迭代加速方法松弛加速;方法 6.Newton 迭代法 7.列表对比各种方法迭代法的结果及迭代次数 松弛迭代法:第一题:clear; clc; tol=1e-4; f=@(x)x^3-3*x+1; g=@(x)(x^3+1)/3; dg=@(x)x^2; x=1.4; k=1; fx=f(x); gx=g(x); dgx=dg(x); fprintf('k=%d,x=%f,f(x)=%e\n',k,x,fx); while abs(f(x))>tol; w=1/(1-dgx); x=(1-w)*x+w*gx; matlab中fprintf是什么意思 k=k+1; fx=f(x);gx=g(x); dgx=dg(x); fprintf('k=%g,x=%f,f(x)=%e,w=%f\n',k,x,fx,w); end fprintf('迭代步数k=%d,结果x=%f',k,x) 结果:k=1,x=1.400000,f(x)=-4.560000e-01 k=2,x=1.558333,f(x)=1.092610e-01,w=-1.041667 k=3,x=1.532836,f(x)=3.022685e-03,w=-0.700083 k=4,x=1.532090,f(x)=2.562645e-06,w=-0.740968 迭代步数k=4,结果x=1.532090>> 第二题:t=0.5; clear; clc; tol=1e-4; f=@(x)0.5*x-sin(x); g=@(x)2*sin(x); dg=@(x)2*cos(x); x=1; k=1; 牛顿法,第二题: clear; clc; tol=1e-4; f=@(x)0.5*x-sin(x); df=@(x)0.5-cos(x); x=1; k=1; fx=f(x); dfx=df(x); fprintf('k=%d,x=%f,f(x)=%e\n',k,x,fx); while abs(f(x))>tol; x=x-fx/dfx; k=k+1; fx=f(x); dfx=df(x); fprintf('k=%d,x=%f,f(x)=%e\n',k,x,fx); end fprintf('迭代步数k=%d,结果x=%f',k,x); 结果:k=1,x=1.000000,f(x)=-3.414710e-01 k=2,x=-7.472741,f(x)=-2.808167e+00 k=3,x=14.478521,f(x)=6.296958e+00 k=4,x=6.935115,f(x)=2.860836e+00 k=5,x=16.635684,f(x)=9.118097e+00 k=6,x=8.343938,f(x)=3.289615e+00 k=7,x=4.954633,f(x)=3.448119e+00 k=8,x=-8.301318,f(x)=-3.249057e+00 k=9,x=-4.817320,f(x)=-3.403160e+00 k=10,x=3.792574,f(x)=2.502255e+00 k=11,x=1.861061,f(x)=-2.763770e-02 k=12,x=1.896214,f(x)=5.898963e-04 k=13,x=1.895495,f(x)=2.453740e-07 迭代步数k=13,结果x=1.895495>> 其他方法:fzero('x^3-3*x+1',1.4) 结果:1.5321 函数运行结果:第一题: f=@(x)x^3-3*x+1; duifen(1,2,1e-4,f) k=1,a=1.000000,b=2.000000,f(x)=-1.250000e-01 k=2,a=1.750000,b=2.000000,f(x)=-1.250000e-01 k=3,a=1.625000,b=1.500000,f(x)=-1.250000e-01 ans = 1.5000 | fx=f(x); gx=g(x); dgx=dg(x); fprintf('k=%d,x=%f,f(x)=%e\n',k,x,fx); while abs(f(x))>tol; w=1/(1-dgx); x=(1-w)*x+w*gx; k=k+1; fx=f(x);gx=g(x); dgx=dg(x); fprintf('k=%g,x=%f,f(x)=%e,w=%f\n',k,x,fx,w); end fprintf('迭代步数k=%d,结果x=%f',k,x) 结果:k=1,x=1.000000,f(x)=-3.414710e-01 k=2,x=-7.472741,f(x)=-2.808167e+00,w=-12.406238 k=3,x=14.478521,f(x)=6.296958e+00,w=3.908468 k=4,x=6.935115,f(x)=2.860836e+00,w=0.598972 k=5,x=16.635684,f(x)=9.118097e+00,w=-1.695408 k=6,x=8.343938,f(x)=3.289615e+00,w=0.454686 k=7,x=4.954633,f(x)=3.448119e+00,w=0.515152 k=8,x=-8.301318,f(x)=-3.249057e+00,w=1.922201 k=9,x=-4.817320,f(x)=-3.403160e+00,w=0.536155 k=10,x=3.792578,f(x)=2.502259e+00,w=1.264986 k=11,x=1.861058,f(x)=-2.763992e-02,w=0.385955 k=12,x=1.896214,f(x)=5.899952e-04,w=0.635968 k=13,x=1.895495,f(x)=2.454563e-07,w=0.609976 迭代步数k=13,结果x=1.895495>> Altken法:第一题: clear; clc; tol=1e-4; f=@(x)x^3-3*x+1; g=@(x)(x^3+1)/3; x=1.4; k=1; fx=f(x); gx=g(x); fprintf('k=%d,x=%f,f(x)=%e\n',k,x,fx); while abs(f(x))>tol; y=g(x); z=g(y); x=z-(z-y)^2/(z-2*y+x); k=k+1; fx=f(x);gx=g(x); fprintf('k=%g,x=%f,f(x)=%e\n',k,x,fx); end fprintf('迭代步数k=%d,结果x=%f',k,x) 结果:k=1,x=1.400000,f(x)=-4.560000e-01 k=2,x=1.601351,f(x)=3.023306e-01 k=3,x=1.543068,f(x)=4.493007e-02 k=4,x=1.532402,f(x)=1.267174e-03 k=5,x=1.532089,f(x)=1.058857e-06 迭代步数k=5,结果x=1.532089>> 第二题:t=0.5 clear; clc; tol=1e-4; f=@(x)0.5*x-sin(x); g=@(x)2*sin(x); x=1; k=1; fx=f(x); gx=g(x); fprintf('k=%d,x=%f,f(x)=%e\n',k,x,fx); while abs(f(x))>tol; y=g(x); z=g(y); x=z-(z-y)^2/(z-2*y+x); k=k+1; fx=f(x);gx=g(x); fprintf('k=%g,x=%f,f(x)=%e\n',k,x,fx); end fprintf('迭代步数k=%d,结果x=%f',k,x) 结果:k=1,x=1.000000,f(x)=-3.414710e-01 k=2,x=2.232429,f(x)=3.272248e-01 k=3,x=1.834532,f(x)=-4.815707e-02 k=4,x=1.894225,f(x)=-1.038775e-03 k=5,x=1.895494,f(x)=-4.863193e-07 迭代步数k=5,结果x=1.895494>> | |||||
实验结果报告与实验总结:松弛法具有较好的加速效果,甚至有些不收敛的迭代,加速后也能收敛 缺点:每次迭代需计算导数. Altken算法中不需要计算导数,Altken算法同样具有较好的加速效果。 牛顿法优点:至少二阶局部收敛,收敛速度较快,特别是当迭代点充分靠近精确解时。是目前求解非线性方程(组) 的主要方法。 牛顿法的缺点:对重根收敛速度较慢(线性收敛)。对初值的选取很敏感,要求初值相当接近真解。 在实际计算中,可以先用其它方法获得真解的一个粗糙近似然后再用牛顿法求解。 第一,二题中,根据题目要求,可以画出大致图像: | ||||||
思考与深入:(1)判断使用某种方法求已经知道的方程近似解主要是看题目,观察题目要求给的是区间还是某点的值。若已知函数的导数不方便求出来,还需要用别的方法求导数,但是后面就需要用subs。 (2)错误之处:fx=f(x),f(x)=fx,写反。区间选择过大,进入死循环,或者迭代次数过多,停不下来。 (3)错误之处:乘法的符号总是忘记打,.^忘记打. 直接用乘法的话,是矩阵乘法,也就是说,必须满足前一个矩阵的列数等于后一个矩阵的行数。.^表示数组相乘,数组中的每一个元素相乘; (4)松弛加速法加速效果明显,牛顿法收敛速度明显快于对分法。 | ||||||
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论