dy/dx 计算

求dy/dx然后化简
学而思问答
求dy/dx然后化简
西安,古称“长安”,是举世闻名的世界四大文明古都之一,居中国古都之首,是中国历史上建都时间最长、建都朝代最多、影响力最大的都城,是中华民族的摇篮、中华文明的发祥地、中华文化的代表.当今的西安是陕西省的省会,中国七大区域中心城市之一
如图在RT三角形ABC中,CD是直角C的角平分线,E为AB的中点,PE垂直AB交CD延长线于P求证三角形ABC为直角三角形如图在RT三角形ABC中,CD是直角C的角平分线,E为AB的中点,PE垂直AB交CD延长线于P求证三角形ABC为等腰直角三角形我打错了,应该是求ABP为等腰三角形
2003年夏天,湖南省由于持续高温和连日无雨,水库蓄水量普遍下降,下图是某水库的蓄水量V万米3与干旱持续时间t(天)之间的关系图,请根据此图,回答下列问题:(1)该水库原蓄水量为多少万米3?持续干旱10天后,水库蓄水量为多少万米3?(2)若水库的蓄水量小于400万米3时,将发出严重干旱警报,请问:持续干旱多少天后,将发出严重干旱警报?(3)按此规律,持续干旱多少天时,水库将干涸?
如图,角1=角2=角3,若图中所有角的和等于180度,求角AOB的度数.查看: 8866|回复: 80
刘红杰手把手教你GPS手持机DX,DY,DZ三参数的计算
马上注册地信网,享受更多功能,学习更多知识,成就人生精彩!
才可以下载或查看,没有帐号?
(367.64 KB, 下载次数: 2737)
16:51 上传
点击文件名下载附件
有什么好的方法,大家相互交流。
注意国家三角点坐标数据的保密呀!!&
牛人!那么多太阳!送我一个哈~~~华夏船长
有什么用,能不能先看看那
最近喜欢这方面的东西,下来学习一下!
呵呵,下载下来看看,,
看看,谢谢楼主了!
呵呵,谢谢共享,
最近正需要,谢谢楼主!
你应该给我点铜板,你侵权了哥们,呵呵
psb.gif (25.99 KB, 下载次数: 147)
16:57 上传
刘红杰 发表于
你应该给我点铜板,你侵权了哥们,呵呵
呵呵 貌似是哦 。。。
论坛推荐话题 /1
地信网全新手机版隆重上线了!手机“每日签到”3秒搞定!即刻起用手机访问地信网,体验强大功能!
热线: 400-
Powered by求导公式(撇号为转置):
Y = A * X --& DY/DX = A'
Y = X * A --& DY/DX = A
Y = A' * X * B --& DY/DX = A * B'
Y = A' * X' * B --& DY/DX = B * A'
乘积的导数
d(f*g)/dx=(df'/dx)g+(dg/dx)f'
于是把以前学过的矩阵求导部分整理一下:
1. 矩阵Y对标量x求导:
相当于每个元素求导数后转置一下,注意M×N矩阵求导后变成N×M了
Y = [y(ij)]--& dY/dx = [dy(ji)/dx]
2. 标量y对列向量X求导:
注意与上面不同,这次括号内是求偏导,不转置,对N×1向量求导后还是N×1向量
y&= f(x1,x2,..,xn) --& dy/dX= (Dy/Dx1,Dy/Dx2,..,Dy/Dxn)'
3. 行向量Y'对列向量X求导:
注意1×M向量对N×1向量求导后是N×M矩阵。
将Y的每一列对X求偏导,将各列构成一个矩阵。
重要结论:
d(AX)'/dX =A'
4. 列向量Y对行向量X’求导:
转化为行向量Y’对列向量X的导数,然后转置。
注意M×1向量对1×N向量求导结果为M×N矩阵。
dY/dX' =(dY'/dX)'
5. 向量积对列向量X求导运算法则:
注意与标量求导有点不同。
d(UV')/dX =(dU/dX)V' + U(dV'/dX)
d(U'V)/dX =(dU'/dX)V + (dV'/dX)U'
重要结论:
d(X'A)/dX =(dX'/dX)A + (dA/dX)X' = IA + 0X' = A
d(AX)/dX' =(d(X'A')/dX)' = (A')' = A
d(X'AX)/dX =(dX'/dX)AX + (d(AX)'/dX)X = AX + A'X
6. 矩阵Y对列向量X求导:
将Y对X的每一个分量求偏导,构成一个超向量。
注意该向量的每一个元素都是一个矩阵。
7. 矩阵积对列向量求导法则:
d(uV)/dX =(du/dX)V + u(dV/dX)
d(UV)/dX =(dU/dX)V + U(dV/dX)
重要结论:
d(X'A)/dX =(dX'/dX)A&+ X'(dA/dX) = IA + X'0 = A
8. 标量y对矩阵X的导数:
类似标量y对列向量X的导数,
把y对每个X的元素求偏导,不用转置。
dy/dX = [Dy/Dx(ij) ]
重要结论:
y = U'XV=&ΣΣu(i)x(ij)v(j) 于是 dy/dX = [u(i)v(j)] =UV'
y = U'X'XU 则dy/dX = 2XUU'
y =(XU-V)'(XU-V) 则 dy/dX = d(U'X'XU - 2V'XU + V'V)/dX = 2XUU' - 2VU' +0 = 2(XU-V)U'
9. 矩阵Y对矩阵X的导数:
将Y的每个元素对X求导,然后排在一起形成超级矩阵。
10.乘积的导数
d(f*g)/dx=(df'/dx)g+(dg/dx)f'
d(x'Ax)=(d(x'')/dx)Ax+(d(Ax)/dx)(x'')=Ax+A'x&(注意:''是表示两次转置)
d/dx&(y)&is a vector whose&(i)&element is&dy(i)/dxd/dx&(y) is a vector whose&(i)&element is&dy/dx(i)d/dx&(yT) is a matrix whose&(i,j)&element is&dy(j)/dx(i)d/dx&(Y) is a matrix whose&(i,j)&element is&dy(i,j)/dxd/dX&(y) is a matrix whose&(i,j)&element is&dy/dx(i,j)
Note that the Hermitian transpose is not used because complex conjugates are not analytic.
In the expressions below matrices and vectors&A,&B,&C&do not depend on&X.
Derivatives of Linear Products
d/dx&(AYB)&=A&*&d/dx&(Y) *&B
d/dx&(Ay)&=A&*&d/dx&(y)
d/dx&(xTA)&=A
d/dx&(xT)&=Id/dx&(xTa)&= d/dx&(aTx)
d/dX&(aTXb) =&abT
d/dX&(aTXa) =&d/dX&(aTXTa)
d/dX&(aTXTb) =&baTd/dx&(YZ)&=Y&*&d/dx&(Z) +&d/dx&(Y)&*
Derivatives of Quadratic Products
d/dx&(Ax+b)TC(Dx+e) =&ATC(Dx+e)&+&DTCT(Ax+b)
d/dx&(xTCx) = (C+CT)x
[C: symmetric]:&d/dx&(xTCx)
= 2Cxd/dx&(xTx) = 2x
d/dx&(Ax+b)T&(Dx+e) =&AT&(Dx+e)&+&DT&(Ax+b)
d/dx&(Ax+b)T&(Ax+b) = 2AT&(Ax+b)
[C: symmetric]:&d/dx&(Ax+b)TC(Ax+b)
= 2ATC(Ax+b)
d/dX&(aTXTXb) =&X(abT&+
d/dX&(aTXTXa) = 2XaaT
d/dX&(aTXTCXb) =&CTXabT&+
d/dX&(aTXTCXa) =&(C + CT)XaaT[C:Symmetric]&d/dX&(aTXTCXa)
d/dX&((Xa+b)TC(Xa+b)) = (C+CT)(Xa+b)aT
Derivatives of Cubic Products
d/dx&(xTAxxT) = (A+AT)xxT+xTAxI
Derivatives of Inverses
d/dx&(Y-1) =&-Y-1d/dx&(Y)Y-1
Derivative of Trace
Note: matrix dimensions must result in an&n*n&argument for tr().
d/dX&(tr(X)) =&Id/dX&(tr(Xk)) =k(Xk-1)Td/dX&(tr(AXk)) =&SUMr=0:k-1(XrAXk-r-1)Td/dX&(tr(AX-1B)) =&-(X-1BAX-1)T
d/dX&(tr(AX-1)) =d/dX&(tr(X-1A))
=&-X-TATX-T
d/dX&(tr(ATXBT)) =&d/dX&(tr(BXTA))
d/dX&(tr(XAT)) =&d/dX&(tr(ATX))
=d/dX&(tr(XTA)) =&d/dX&(tr(AXT))&= A
d/dX&(tr(AXBXT)) =&ATXBT&+&AXB
d/dX&(tr(XAXT)) =&X(A+AT)d/dX&(tr(XTAX)) =&XT(A+AT)d/dX&(tr(AXTX)) =&(A+AT)X
d/dX&(tr(AXBX)) =&ATXTBT&+&BTXTAT[C:symmetric]&d/dX&(tr((XTCX)-1A)
=&d/dX&(tr(A (XTCX)-1) =&-(CX(XTCX)-1)(A+AT)(XTCX)-1[B,C:symmetric]&d/dX&(tr((XTCX)-1(XTBX))
=&d/dX&(tr( (XTBX)(XTCX)-1) =&-2(CX(XTCX)-1)XTBX(XTCX)-1&+
2BX(XTCX)-1
Derivative of Determinant
Note: matrix dimensions must result in an&n*n&argument for det().
d/dX&(det(X)) =&d/dX&(det(XT))
= det(X)*X-T
d/dX&(det(AXB)) = det(AXB)*X-Td/dX&(ln(det(AXB))) =&X-T
d/dX&(det(Xk)) =&k*det(Xk)*X-T
d/dX&(ln(det(Xk))) =&kX-T
[Real]&d/dX&(det(XTCX))
= det(XTCX)*(C+CT)X(XTCX)-1
[C:&Real,Symmetric]&d/dX&(det(XTCX))
= 2det(XTCX)* CX(XTCX)-1
[C:&Real,Symmetricc]&d/dX&(ln(det(XTCX)))
= 2CX(XTCX)-1
If&y&is a function of&x, then&dyT/dx&is the Jacobian matrix of&y&with respect to&x.
Its determinant, |dyT/dx|, is the&Jacobian&of&y&with respect to&x&and represents the ratio of the hyper-volumes&dy&and&dx.
The Jacobian occurs when changing variables in an integration: Integral(f(y)dy)=Integral(f(y(x)) |dyT/dx| dx).
Hessian matrix
If f is a function of&x&then the symmetric matrix d2f/dx2&=&d/dxT(df/dx) is the&Hessian&matrix
of f(x). A value of&x&for which df/dx&=&0&corresponds to a minimum, maximum or saddle point according to whether the Hessian is positive definite, negative definite
or indefinite.
d2/dx2&(aTx) = 0d2/dx2&(Ax+b)TC(Dx+e) =&ATCD&+&DTCTA
d2/dx2&(xTCx) =&C+CT
d2/dx2&(xTx) = 2I
d2/dx2&(Ax+b)T&(Dx+e) =&ATD&+&DTA
d2/dx2&(Ax+b)T&(Ax+b) = 2ATA
[C: symmetric]:&d2/dx2&(Ax+b)TC(Ax+b)
本文已收录于以下专栏:
相关文章推荐
linear regression
logistic regression
矩阵(向量)求导
原文地址:矩阵求导公式【转】作者:三寅今天推导公式,发现居然有对矩阵的求导,狂汗--完全不会。不过还好网上有人总结了。吼吼,赶紧搬过来收藏备份。
基本公式:
Y = A * X --& DY/D...
转自:/wrchow//%E7%99%BE%E5%BA%A6%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E7%A0...
矩阵、向量求导法则
复杂矩阵问题求导方法:可以从小到大,从scalar到vector再到matrix。
 x is a column vector, A is a matrix
d(A*x)/...
复杂矩阵问题求导方法:可以从小到大,从scalar到vector再到matrix。
 x is a column vector, A is a matrix
$d(A*x)/dx=A$  ...
今天推导公式,发现居然有对矩阵的求导,狂汗--完全不会。不过还好网上有人总结了。吼吼,赶紧搬过来收藏备份。
基本公式:
Y = A * X --& DY/DX = A'
Y = X * A ...
矩阵求导好像读书的时候都没学过,因为讲矩阵的课程上不讲求导,讲求导的课又不提矩阵。如果从事机器学习方面的工作,那就一定会遇到矩阵求导的东西。维基百科上:http://en.wikipedia.org/...
原文地址:矩阵求导公式【转】作者:三寅
今天推导公式,发现居然有对矩阵的求导,狂汗--完全不会。不过还好网上有人总结了。吼吼,赶紧搬过来收藏备份。
基本公式:
Y = A * X -...
他的最新文章
讲师:AI100
讲师:谢梁
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)GPS手持机DX,DY,DZ三参数的计算_中华文本库
第1页/共4页
GPS 手持机中 WGS84 坐标转换成 BJ54 坐标时要设置哪些参数?如何设置?
GPS 手持机中 WGS84 坐标转换成 BJ54 坐标时要设置哪些参数?如何设置? GPS 手持机 DX,DY,DZ 三参数的计算。 1. 进入"主菜单页面"的"设置"子页面中,按动方向键选择“单位”按输入键进入坐标设置 的页面,将"位置格式"的选项改为" User UTM Grid "(自定义坐标格式) 。 2. 在出现的参数输入页面中输入相关的参数,包括中央经线,投影比例(该数值为 1) , 东西偏差(该数值为 500000) ,南北偏差(该数值为 0) 。 3. 按下屏幕上的"存储"按钮后,再将"地图基准"(有的机器称之为"坐标系统")的选项改 为"User"(自定义坐标系统) 。 4. 在出现的参数输入页面中输入相关参数,包括 DX,DY,DZ,DA 和 DF。其中 DA 的数值 为-108,DF 的数值为 0.0000005。按下屏幕上的"存储"按钮后,机器显示的位置将用北 京 54 坐标来表示了。如果是西安 80 坐标,则 DA=-3,DF=0。 5. DX,DY,DZ 三个参数因地区而异,具体如何求解可以让他们首先与本地测绘部门去咨 询,如果不给的话,可以通过如下方法来求解: 首先知道一个点的已知 BJ54 坐标(这个工作之前要收集,当地测绘局会有) ,然后用手 持机测此点的坐标(WGS84 坐标) ,通过坐标转换程序,即可求出 DX,DY,DZ。需要注意的 是,此程序中的 y 为 6 位数,也就是要将 Bj54 坐标中的前两位(带数)去掉。如果不知道 BJ54 坐标的高程,可以输入与 WGS84 坐标相同的即可。 通过上述设置后,即可将坐标系进行转换,此时手持机中显示的坐标上行为 y,下行为 x 坐标。
GPS 手持机中 WGS84 坐标转换成 BJ54 坐标时要设置哪些参数?如何设置?
EasyPar 软件下载地址
以内蒙古阿尔山四号沟工区为例, 内蒙古自治区测绘科技档案资料馆资料三十公里 5 万图幅 L-51-25-D 三角点点名三道沟 西,地形等级为Ⅲ级。 北京 54 坐标 X:,Y:(21) 黄海 56 高程 H1395.3m. 实地三角点丈量 WGS84 坐标经纬度为(来源于张工数据) B:47°03′03.7″,L:120°26′02.0″黄海 56 高程 H1397m. 软件 1:Easypar
计算参数结果: Dx:2.5 Dy:-128 Dz:-43
软件二、Gps 帮帮
GPS 手持机中 WGS84 坐标转换成 BJ54 坐标时要设置哪些参数?如何设置?
输入手持 GPS 中,去实地工区三角点效验系统误差。 注:1:1 万地质填图内三角点效验一次及可符合规范 软件三:CooRD
GPS 手持机中 WGS84 坐标转换成 BJ54 坐标时要设置哪些参数?如何设置?
作者简介: 刘红杰 毕业于甘肃工业职业技术学院,现工作于内蒙古第三地质矿产勘查开发院。 版权说明: 欢迎使用本说明,欢迎大家提出意见指正. 有好的建议请发
第1页/共4页
寻找更多 ""当前位置: >>
计算方法与软件
实验目的作为实践性非常强的课程,安排上机实验的目的,不仅是为了验证教材和授 课内容,更重要的是,要通过实验深入理解方法的设计原理与处理问题的技巧, 培养自行处理常规数值计算问题的能力和综合运用知识分析、解决问题的能力。 1、通过上机实验加深课堂内容的理解。 通过上机实验加深课堂内容的理解。 数值分析的主要任务就是研究适合于在计算机上使用的数值计算方法及与 此相关的理论。通过编程上机,就可以加深对方法运行过程的理解,同时在编程 中领会和理解数值计算方法的计算要领和步骤,体会问题的条件和限制范围,理 解一般问题和特殊问题的区别。 2、学会对数值计算结果的分析和处理。 学会对数值计算结果的分析和处理。 果的分析和处理 数值分析实验不只是编写程序得到一个数值结果, 我们应在掌握数值计算计 算方法的基本原理和思想的同时,注意方法处理的技巧及其与计算机的密切结 合,重视误差分析、收敛性及稳定性的讨论。此外,还要注意算法能否在计算机 上实现,应避免因数值方法选用不当、程序设计不合理而导致超过计算机的存储 能力,或导致计算结果精度不高等。 3、要能灵活掌握各种数值计算方法。 要能灵活掌握各种数值计算方法。 由于针对同一个问题可以选用不同的数值计算方法, 我们要注意各种方法的 使用条件。通过上机,比较各种方法间的异同及优缺点,以便更好的使用不同的 方法来解决实际问题,使计算机成为我们最好的工具。1 实验基本要求一、上机前的准备工作 1、复习和掌握与本次实验有关的教学内容。 2、根据本次实验要求,在纸上编写算法及上机的程序,并经过人工模拟运 行检验,减少不必要的错误,提高上机效率。切忌不编程序、不作人工检查就进 行程序输入,这只能使上机调试的难度增加,甚至可能带来学习自信心的下降, 影响后续课程的学习。 二、上机实验步骤 1、启动开发环境; 2、建立源程序文件,输入源程序; 3、编译产生目标程序,连接生成可执行程序,运行程序,输出结果; 4、对数值计算结果进行误差分析,讨论数值算法的收敛性与稳定性; 5、整理实验报告。 三、实验报告 实验报告是记录实验工作全过程的技术文档,实验报告的撰写是科学技术工 作的一个组成部分。 《数值分析》实验报告包括下列要求: 1、实验原理; 2、实验内容和要求; 3、数值算法描述,包括数据输入、数据处理和数据输出; 4、算法的实现 (1) 给出具体的计算实例, (2) 经调试正确的源程序清单, (3) 对具体的数值例子给出数值结果; 5、计算结果的误差分析,算法的收敛性与稳定性的讨论; 6、实验心得。2 实验项目实验一、 实验一、误差分析误差问题是数值分析的基础,又是数值分析中一个困难的课题。在实际计算 中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。 因此, 选取算法时注重分析舍入误差的影响, 在实际计算中是十分重要的。 同时, 由于在数值求解过程中用有限的过程代替无限的过程会产生截断误差, 因此算法 的好坏会影响到数值结果的精度。 一、实验目的 1、通过上机编程,复习巩固以前所学程序设计语言及上机操作指令; 2、通过上机计算,了解误差、绝对误差、误差界、相对误差界的有关概念;3、 通过上机计算,了解舍入误差所引起的数值不稳定性。二、算法实例 例 1.1 用差商 f ′(a) ≈f (a + h) ? f (a) 求 f ( x) = ln x 在 x = 3 处导数的近似值。取 hh = 0.1 , h = 0.000 1 , h =0.000 000 000 000 001 和 h =0.000 000 000 000 000 1 分别用 MATLAB 软件计算,取十五位数字计算。 解: 在 MATLAB 工作窗口输入下面程序 &&a=3;h=0.1;y=log(a+h)-log(a);yx=y/h 运行后得 yx = 0.91. 将此程序中 h 改为 0.000 1,运行后得 yx = 0.85. 后者比前者好。再取 h = 0.000 000 000 000 001,运行后得 yx = 0.06, 不如前者好。取 h = 0.000 000 000 000 000 1,运行后得 yx = 0, 算出的结果反而毫无价值。 例 1.2 ?1 分别求方程组 AX = b 在下列情况时的解,其中 A = ? ?1 ?1 ? ?. 1.01? ?3 ? 2? (1) b = ? ? ; ? 2? ? ?? 2 ? (2) b = ? ? 2.01? . ? ? ?解: (1) 首先将方程组 AX = b 化为同解方程 X = A ?1b ,然后在 MATLAB 工 作窗口输入程序 && b=[2,2]';A=[1,1;1,1.01]; X=A\b ? 2? ? 2? 运行后输出当 b = ? ? 时, AX = b 的解为 X = ? ? ; ? 2? ? 0? ? ? ? ? ? 2 ? ? 1? ? 时, AX = b 的解为 X = ? ? . (2)同理可得,当 b = ? ? 2.01? ? 1? ? ? ? ? 例 1.3 计算 e 的近似值。解:泰勒级数 ex=1+ x + 取 x = 1 ,得x2 x3 x4 xn + + +L + + L ( ?∞ & x & ∞) , 2 ! 3! 4 !   n!  e =1+1+1 1 1 1 + + +L + +L. 2 ! 3! 4 !   n!  (1.1)这是一个无限过程,计算机无法求到精确值。只能在(1.1)取有限项时计 算,再估计误差。如果取有限项 1 1 1 1 s n (1) = 1 + 1 + + + +L + 2 ! 3! 4 !   n!   作为 e 的值必然会有误差,根据泰勒余项定理可知其截断误差为e ? s n (1) =eθ ( n + 1) !  (0 & θ & 1) .如果取(1.1)的前九项,输入程序 && n=8; s=1;S =1; for k=1:n s=s*k; S=S+1/s, end s, S, R=3/(s*(n+1)) 或 &&S1=1+1+1/2+1/(1*2*3)+1/(1*2*3*4)+1/(1*2*3*4*5)+1/ (1*2*3*4*5*6)+1/(1*2*3*4*5*6*7)+1/(1*2*3*4*5*6*7*8), R1=3/(1*2*3*4*5*6*7*8*9) 运行后结果 S =8.768e-006 R =2.274 因为截断误差为eθ 3 & ≈ 8.267 196 × 10- 6 (0 & θ & 1), (8 + 1) ! 9!     1 1 1 1 1 1 1 + + + + ≈ 2.718 28. 所以 e 的近似值 e ≈ s8 (1) = 1 + 1 + + +     2 ! 3! 4 ! 5 ! 6! 7 ! 8 !e ? s8 (1) =例 1.4 取 2.718 28 作为 e 的四舍五入近似值时,求其绝对误差和相对误差。解:在 MATLAB 工作窗口输入程序 &&juewu=exp(1)-2.71828 运行后输出结果为 juewu = 1.828 459 045 505 326e-006 例 1.5 解 计算 ∫ 20πsin x d x 的近似值,并确定其绝对误差和相对误差。 xsin x 的原函数不是初等函数,故用泰勒级数求之。 x(?∞ & x & ∞) ,因为被积函数sin x x2 x4 x6 x8 =1? + ? + +L x ! ! 3 ! 5  7 ! 9 (1.5)这 是 一 个 无 限 过 程 , 计 算 机 无 法 求 到 精 确 值 。 可 用 ( 1.5 ) 的 前 四 项1?sin x x2 x4 x6 代替被积函数 ,得 + ? x 3 ! 5  7 ! !y = ∫20ππ ( )3 ( )5 ( )7 sin x x2 x4 x6 π 2( 2 2 ? dx ≈ ∫ 1? )d x = ? =y. + ? + ? 2 0 x 3 ! 5  7 ! ! 2 3 ?3 ! 5 ?5  7 ?7 ! !πππ根据泰勒余项定理和交错级数收敛性的判别定理,得到绝对误差 π 9? R= y? y & ( ) 2 = WU, 9 ? 9!在 MATLAB 命令窗口输入计算程序如下: syms x f=1-x^2/(1*2*3)+x^4/(1*2*3*4*5)-x^6/(1*2*3*4*5*6*7) y=int(f,x,0,pi/2),y1=double(y) y11=pi/2-(pi/2)^3/(3*3*2)+(pi/2)^5/(5*5*4*3*2)-(pi/ 2)^7/(7*7*6*5*4*3*2) inf=int(sin(x)/x,x,0,pi/2) ,infd=double(inf) WU =(pi/2)^9/(9*9*8*7*6*5*4*3*2), R =infd-y11 ? 因为运行后输出结果为: y = 1.370 762 168 154 49, y =1.370 744 664 18938, R = 1.750 396 510 491 47e-005, WU= 1.782 679 830 970 664e-005 & 10 ?4 . 所 π ?4 sin x ? ? 以, y 的绝对误差为 ε = 10 ,故 y = ∫ 2 d x ≈ 1.370 7 。 y 的相对误差为 0 x5 εr =例 1.6ε10 ?4 &0.007 3%. = ? y 1.370 7设计三种算法求方程 2 x 2 + x ? 15 = 0 在 ( 2, 3) 的一个正根 x * 的近似值,并研究每种算法的误差传播情况. 解:为解已知方程,我们可以设计如下三种算法,然后将计算结果与此方程 的精确解 x * = 2.5 比较,观察误差的传播. 算法 1 将已知方程化为同解方程 x = 15 ? 2 x .取初值 x0 = 2 ,按迭代公式22 xk +1 = 15 ? 2 xk依次计算 x1 , x 2 , L , x n , L ,结果列入表 1C3 中。 算法 2 将已知方程化为同解方程 x =x k +1 =15 .取初值 x0 = 2 ,按迭代公式 2x + 115 2 xk + 1依次计算 x1 , x 2 , L , x n , L ,结果列入表 1C1 中。 算法 3 将已知方程化为同解方程 x = x ?22 x 2 + x ? 15 .取初值 x0 = 2 , 按迭代 4x + 1公式为xk +12 x + x k ? 15 = xk ? k 4 xk + 1依次计算 x1 , x 2 , L , x n , L ,结果列入表 1C1 中。 我们为这三种算法的计算编写两套 MATLAB 程序如下: (1)MATLAB 主程序 function [k,juecha,xiangcha,xk]= liti112(x0,x1,limax) % 输入的量--x0是初值, limax是迭代次数和精确值x; % 输出的量--每次迭代次数k和迭代值xk, % --每次迭代的绝对误差juecha和相对误差xiangcha, x(1)=x0; for i=1:limax x(i+1)=fl(x(i));%程序中调用的fl.m juecha = abs(x(i)-x1); xiangcha = juecha /( abs(x(i))+eps); xk=x(i);k=i-1;[(i-1),juecha,xiangcha,xk] end (2)MATLAB 调用函数程序及其计算结果6 ① 算法 2 的 MATLAB 调用函数程序 function y1=fl(x) y1=15/(2*x+1); ② 将MATLAB主程序和调用函数程序分别命名liti112.m和fl.m, 分别保存为 M文件,然后在MATLAB工作窗口输入命令 && [k,juecha,xiangcha,xk]= liti112(2,2.5,100) ③ 运行后输出计算结果列入表 1C1 和表 1-2 中。 ④ 将算法 2 的 MATLAB 调用函数程序的函数分别用 y1=15-2*x^2 和 y1=x-(2*x^2+x-15)/(4*x+1)代替,得到算法 1 和算法 3 的调用函数程序,将其保 存,运行后将三种算法的前 8 个迭代值 x1 , x 2 , L , x8 列在一起(见表 1-1) ,进行 比较.将三种算法的 x1 , x 2 , L , x8 对应的绝对误差和相对误差的值列在一起(见表 1-2) ,进行比较。表 1-1 例 1.6 中三种算法的计算结果 算 法 迭代次数 0 1 2 3 4 5 6 7 2 7 -83 -13 763 -378 840 323 -2.870 4 ×
8 × 10 35 -5.430 7 × 10 70 2.000 000 00 3.000 000 00 2.142 857 14 2.837 837 84 2.246 963 56 2.246 963 56 2.321 774 84 2.657 901 65 2.000 000 00 2.555 555 56 2.500 550 06 2.500 000 06 2.500 000 00 2.500 000 00 2.500 000 00 2.500 000 00 算法 1 的迭代结果 算法 2 的迭代结果 算法 3 的迭代结果M99M-InfM2.500 000 01M2.500 000 00表 1-2 例 1.6 中三种算法计算结果的误差算法 迭 代 次 数算法 1 的误差 绝对误差 相对误差算法 2 的误差 绝对误差 相对误差算法 3 的误差 绝对误差 相对误差0 1 2 3 4 5 6 70.500 000 00 4.500 000 00 85.500 000 00 13 765.500 00 378 840 326 2.870 399 81 ×
746 80 × 10700.250 000 00 0.642 857 14 1.030 120 48 0.000 100 02 1.000 000 01 1 1 10.500 000 00 0.500 000 00 0.357 142 86 0.337 837 84 0.253 036 44 0.230 287 04 0.178 225 16 0.157 901 650.250 000 00 0.166 666 67 0. 0.119 047 62 0.112 612 62 0.084 345 48 0.076 762 47 0.059 408 390.500 000 00 0.055 555 60 0.000 550 10 0.000 000 06 0.000 000 00 0 0 00.250 000 00 0.021 739 13 0.000 219 97 0.000 000 02 0.000 000 00 0 0 0M99MInfMNaNM0.000 000 01M0.000 000 00M0M07 例 1.7 求数 x = 715 × ( 1 + 8 ?19 ? 1 的近似值。 ) 解 (1)直接用 MATLAB 命令 && x=(7^15)*(sqrt(1+8^(-19))-1) 运行后输出结果 x = 0.?19 问题出现在两个相近的数 1 + 8 与 1 相减时,计算机运行程序&&sqrt(1+8^(-19))-1运行后输出结果ans = 0.由于计算机硬件只支持有限位机器数的运算,因此在计算中可能引入和传播 导致输出 1 + 8 ?19 ? 1 的结果为 0, 计算机不 舍入误差.因为有效数字的严重损失, 能再与数 715 继续进行真实的计算,所以,最后输出的结果与 x 的精确值不符。 (2)如果化为x = 715 × ( 1 + 8 ?19 ? 1) = 715 × 8 ?19 1 + 8 ?19 + 1,再用 MATLAB 命令&& x=(7^15)*( (8^(-19))/(sqrt(1+8^(-19))+1))运行后输出结果x = 1.这是因为 1 + 8 ?19 ? 1 化为8 ?19 1 + 8 ?19 + 1后,计算机运行程序&& x= (8^(-19))/(sqrt(1+8^(-19))+1)运行后的结果为x =3.由于有效数字的损失甚少,所以运算的结果 3.4694 × 10 -18 再与 715 继续计算,最后 输出的结果与 x 的精确值相差无几。 例 1.8 求数 y = ln(30 ? 30 2 ? 1) 的近似值。解 (1)直接用 MATLAB 程序8 && x=30;x1= sqrt(x^2-1) 运行后输出结果 x1 = 29.9833 输入 MATLAB 程序 && x=30; x1=29.9833;y=log(x-x1) 运行后输出结果 y = -4.0923 (2)因为 ln(30 ? 30 2 ? 1) 中的 x = 30 很大,如果采用倒数变换法z1 = x ? x 2 ? 1 =即1 x + x2 ?1,ln(30 ? 30 2 ? 1) = ln输入 MATLAB 程序1 30 + 30 2 ? 1= ? ln(30 + 900 ? 1) .&& x=30;y=-log(x+sqrt(x^2-1))运行后输出结果y = -4.0941(3)输入 MATLAB 程序&& x=30; y=log(x-sqrt(x^2-1))运行后输出结果y = -4.0941可见, 2)计算的近似值比(1)的误差小。 ( 参加计算的数,有时数量级相差很大.如果不注意采取相应的措施,在它们 的加减法运算中,绝对值很小的那个数经常会被绝对值较大的那个数“吃掉” , 不能发挥其作用,造成计算结果失真。 例 1.9 两个数 x * = 111 111 111 111 111 + 0.1 + 0.3 和 y * = 1 111 111 111 111 111 + 0.1 + 0.3 将计算结果与准确值比较,解释计算结果。9请在 16 位十进制数值精度计算机上利用软件 MATLAB 计算下面的 解在 MATLAB 工作窗口输入下面程序 && x=111+0.1+0.3, y=+0.3运行后输出结果 x = 1.114e+014,y =1.111e+015 从输出的结果可以看出,x = x * ,而 y ≠ y * .为什么 y * 仅仅比 x * 多一位 1,而 y ≠ y * 呢? 这是因为计算机进行运算时,首先要把参加运算的数写成绝对值小于 1 而 计算机进行运算时, 计算机进行运算时 。 “阶码”相同的数,这一过程称为数的“对阶” 在 16 位十进制数值精度计算机 阶码”相同的数,这一过程称为数的“对阶” 上利用软件 MATLAB 计算这两个数,把运算的数 x * 写成浮点规格化形式为x * = 0.111 111 111 111 111 0 × 1015 + 0.000 000 000 000 000 1 × 1015 + 0.000 000 000 000 000 3 × 1015 ,在 16 位十进制数值精度计算机上, 三项的数都表示为小数点后面 16 位数字的数 与 1015 之积,所以,计算机没有对数进行截断,而是按原来的三个数进行计算。 因此,计算的结果 x = x * 。而y * = 0.111 111 111 111 111 1×1016 + 0.000 000 000 000 000 01×1016 + 0.000 000 000 000 000 03×1016三项的数都表示写成绝对值小于 1 而“阶码”都为 1016 的数以后,第一项的纯小 数的小数点后面有 16 位数字.但是,后两项数的纯小数的小数点后面有 17 位数 字,超过了 16 位十进制数值精度计算机的存储量,计算机对后两项的数都进行 截断最后一位,即后两项的数都是 16 位机上的零,再进行计算,所以计算结果 与实际不符。三、实验任务 对 n = 0,1,2,L,20 ,计算定积分yn = ∫0 1xn dx . x+5算法 1:利用递推公式10 yn =1 ? 5 y n ?1 , nn = 1,2, L ,20 ,取y0 = ∫011 dx = ln 6 ? ln 5 ≈ 0.182322 . x+5算法 2:利用递推公式y n ?1 = 1 1 ? yn 5n 5 n = 20,19, L ,1 .注意到1 1 x 20 1 1 = ∫ x 20 dx ≤ ∫ dx ≤ ∫ x 20 dx = , 126 6 0 x+5 50 105 01 1 1取y 20 ≈1 1 1 ( + ) ≈ 0.008730 . 20 105 126思考:从计算结果看,哪个算法是不稳定的,哪个算法是稳定的。11 实验二、 实验二、插值法插值法是函数逼近的一种重要方法,它是数值积分、微分方程数值解等数值 计算的基础与工具,其中多项式插值是最常用和最基本的方法。拉格朗日插值多 项式的优点是表达式简单明确,形式对称,便于记忆,它的缺点是如果想要增加 插值节点,公式必须整个改变,这就增加了计算工作量。而牛顿插值多项式对此 做了改进,当增加一个节点时只需在原牛顿插值多项式基础上增加一项,此时原 有的项无需改变,从而达到节省计算次数、节约存储单元、应用较少节点达到应 有精度的目的。 一、实验目的 1、理解插值的基本概念,掌握各种插值方法,包括拉格朗日插值和牛顿插值等, 注意其不同特点; 2、通过实验进一步理解并掌握各种插值的基本算法。二、算法实例1. 与插值有关的 MATLAB 函数 (一) POLY2SYM 函数 调用格式一:poly2sym (C) 调用格式二:f1=poly2sym(C,'V') 或 f2=poly2sym(C, sym ('V') ), (二) POLYVAL 函数 调用格式:Y = polyval(P,X) (三) POLY 函数 调用格式:Y = poly (V) (四) CONV 函数 调用格式:C =conv (A, B) (五) DECONV 函数 调用格式:[Q,R] =deconv (B,A) (六) roots(poly(1:n))命令 调用格式:roots(poly(1:n)) (七) det(a*eye(size (A)) - A)命令12 调用格式:b=det(a*eye(size (A)) - A) 2.线性插值及其 MATLAB 程序 例 2.1 已知函数 f (x) 在 [1,3] 上具有二阶连续导数, f & ( x) ≤ 5 ,且满足条件 f (1) = 1, f (3) = 2 。求线性插值多项式和函数值 f (1.5) ,并估计其误差。 解:输入程序 && X=[1,3];Y=[1,2]; l01= poly(X(2))/( X(1)- X(2)), l11= poly(X(1))/( X(2)- X(1)), l0=poly2sym (l01),l1=poly2sym (l11), P = l01* Y(1)+ l11* Y(2), L=poly2sym (P),x=1.5; Y = polyval(P,x) 运行后输出基函数 l0 和 l1 及其插值多项式的系数向量 P(略) 、插值多项式 L 和 插值 Y 为 l0 =-1/2*x+3/2 输入程序 && M=5;R1=M*abs((x-X(1))* (x-X(2)))/2 运行后输出误差限为 R1 = 1.8750 例 2.2 求函数 f ( x) = e ? x 在 [0,1] 上线性插值多项式,并估计其误差。 l1 =1/2*x-1/2 L = 1/2*x+1/2 Y =1.2500解: 输入程序 && X=[0,1]; Y =exp(-X) , l01= poly(X(2))/( X(1)- X(2)), l11= poly(X(1))/( X(2)- X(1)), l0=poly2sym (l01), l1=poly2sym (l11), P = l01* Y(1)+ l11* Y(2), L=poly2sym (P), 运行后输出基函数 l0 和 l1 及其插值多项式的系数向量 P 和插值多项式 L 为 l0 = -x+1 l1 = x P = -0.0L =-*x+1 输入程序 && M=1;x=0:0.001:1; R1=M*max(abs((x-X(1)).*(x-X(2))))./2 运行后输出误差限为 R1 = 0.1250. 3.抛物线插值及其 MATLAB 程序13 例 2.3求将区间 [0, π/2] 分成 n 等份 (n = 1,2) ,用 y = f ( x) = cos x 产生n + 1 个节点,然后分别作线性插值函数 P1 ( x) 和抛物线插值函数 P2 ( x) .用它们分别计算 cos (π/6) (取四位有效数字),并估计其误差。 解: 输入程序 && X=[0,pi/2]; Y =cos(X) , l01= poly(X(2))/( X(1)- X(2)), l11= poly(X(1))/( X(2)- X(1)), l0=poly2sym (l01), l1=poly2sym (l11), P = l01* Y(1)+ l11* Y(2), L=poly2sym (P),x=pi/6; Y = polyval(P,x) 运行后输出基函数 l0 和 l1 及其插值多项式的系数向量 P、插值多项式和插 值为 l0 =-*x+1 l1 =*x P = -0.0L =-*x+1 Y =0.6667 输入程序 && M=1;x=pi/6; R1=M*abs((x-X(1))*(x-X(2)))/2 运行后输出误差限为 R1 = 0.2742. (2) 输入程序 && X=0:pi/4:pi/2; Y =cos(X) , l01= conv (poly(X(2)), poly(X(3)))/(( X(1)- X(2))* ( X(1)- X(3))), l11= conv (poly(X(1)), poly(X(3)))/(( X(2)- X(1))* ( X(2)- X(3))), l21= conv (poly(X(1)), poly(X(2)))/(( X(3)- X(1))* ( X(3)- X(2))),14 l0=poly2sym (l01),l1=poly2sym (l11),l2=poly2sym (l21), P = l01* Y(1)+ l11* Y(2) + l21* Y(3), L=poly2sym (P),x=pi/6; Y = polyval(P,x) 运行后输出基函数 l01、l11 和 l21 及其插值多项式的系数向量 P、插值多 项式 L 和插值 Y 为 l0=185/656*x^2-*x+1 l1=-185/328*x^2+*x l2=185/656*x^2-*x P = -0.2 1.0000L=-*x^2-*x+1 Y = 0.8508 输入程序 && M=1;x=pi/6; R2=M*abs((x-X(1))*(x-X(2)) *(x-X(3)))/6 运行后输出误差限为 R2 =0.0239. 4. n 次拉格朗日(Lagrange)插值及其 MATLAB 程序 例 2.4 给出节点数据 f (?2.00) = 17.00 , f (0.00) = 1.00 , f (1.00) = 2.00 ,f (2.00) = 17.00 ,作三次拉格朗日插值多项式计算 f (0.6) ,并估计其误差。解:输入程序&& X=[-2,0,1,2]; Y =[17,1,2,17];p1=poly(X(1)); p2=poly(X(2)); p3=poly(X(3)); p4=poly(X(4)); l01= conv ( conv (p2, p3), p4)/(( X(1)- X(2))* ( X(1)- X(3)) * ( X(1)- X(4))), l11= conv ( conv (p1, p3), p4)/(( X(2)- X(1))* ( X(2)- X(3)) * ( X(2)- X(4))), l21= conv ( conv (p1, p2), p4)/(( X(3)- X(1))* ( X(3)- X(2)) * ( X(3)- X(4))),15 l31= conv ( conv (p1, p2), p3)/(( X(4)- X(1))* ( X(4)- X(2)) * ( X(4)- X(3))), l0=poly2sym (l01), l1=poly2sym (l11),l2=poly2sym (l21), l3=poly2sym (l31), P = l01* Y(1)+ l11* Y(2) + l21* Y(3) + l31* Y(4), 运行后输出基函数 l0,l1,l2 和 l3 及其插值多项式的系数向量 P(略)为 l0 =-1/24*x^3+1/8*x^2-1/12*x,l1 =1/4*x^3-1/4*x^2-x+1 l2 =-1/3*x^3+4/3*x,l3 =1/8*x^3+1/8*x^2-1/4*x 输入程序 && L=poly2sym (P),x=0.6; Y = polyval(P,x) 运行后输出插值多项式和插值为 L = x^3+4*x^2-4*x+1 输入程序 && syms M; x=0.6; R3=M*abs((x-X(1))*(x-X(2)) *(x-X(3)) *(x-X(4)))/24 运行后输出误差限为 R3 =91/2500*M即Y = 0.2560.R3 ≈ 0.04 f ( 4) (ξ ) ,ξ ∈ (?2.00, 2.00) .5. 拉格朗日插值及其误差估计的 MATLAB 程序 拉格朗日插值及其误差估计的 MATLAB 主程序function [y,R]=lagranzi(X,Y,x,M) n=length(X); m=length(x); for i=1:m z=x(i);s=0.0; for k=1:n p=1.0; q1=1.0; c1=1.0; for j=1:n if j~=k p=p*(z-X(j))/(X(k)-X(j)); end q1=abs(q1*(z-X(j)));c1=c1*j;16 end s=p*Y(k)+s; end y(i)=s; end R=M*q1/c1; 例 2.5 已知 sin 30 o = 0.5 , sin 45 o = 0.707 1 , sin 60 o = 0.866 0 ,用拉格朗日 插值及其误差估计的 MATLAB 主程序求 sin 40 o 的近似值,并估计其误差。 解:在 MATLAB 工作窗口输入程序&& x=2*pi/9; M=1; X=[pi/6 ,pi/4, pi/3]; Y=[0.5,0.0]; [y,R]=lagranzi(X,Y,x,M)运行后输出插值 y 及其误差限 R 为y =0.6434 R =8..6.牛顿插值及其误差估计的 MATLAB 主程序 function [y,R]= newcz(X,Y,x,M) n=length(X); m=length(x); for t=1:m z=x(t); A=zeros(n,n);A(:,1)=Y'; s=0.0; p=1.0; q1=1.0; c1=1.0; for j=2:n for i=j:n A(i,j)=(A(i,j-1)-A(i-1,j-1))/(X(i)-X(i-j+1)); end q1=abs(q1*(z-X(j-1)));c1=c1*j; end C=A(n,n);q1=abs(q1*(z-X(n))); for k=(n-1):-1:1 C=conv(C,poly(X(k)));d=length(C); C(d)=C(d)+A(k,k); end y(t)= polyval(C, z); end R=M*q1/c1; 例 2.6 已知 sin 30 o = 0.5 , sin 45o = 0.707 1 , sin 60 o = 0.866 0 ,用牛顿插值 法求 sin 40 o 的近似值,估计其误差,并与例 6.2.6的计算结果比较. 解 方法1(牛顿插值及其误差估计的MATLAB主程序)输入MATLAB程序 && x=2*pi/9;M=1; X=[pi/6 ,pi/4, pi/3];17 Y=[0.5,0.0]; [y,R]= newcz(X,Y,x,M) 运行后输出y = 0.6434 R = 8.方法2 (求牛顿插值多项式和差商的MATLAB主程序)输入MATLAB程序 && x=2*pi/9; X=[pi/6 ,pi/4, pi/3]; Y=[0.5,0.0]; M=1; [A,C,L,wcgs,Cw]= newploy(X,Y), y=polyval(C,x) 运行后输出结果 A = 0. 0.1 0 0.0 -0.3516 C = -0.3 -0.0588 L = -*x^2+ *x-691/5248 wcgs = 1/6*M*(x^3-3/4*x^2*pi+*x-) Cw = 0.7 0.8 y = 0.6434 上述两种方法计算y的结果相同. 7. 牛顿插值法的MATLAB综合程序 求牛顿插值多项式、差商、插值及其误差估计的MATLAB主程序 function [y,R,A,C,L]=newdscg(X,Y,x,M) n=length(X); m=length(x); for t=1:m z=x(t); A=zeros(n,n);A(:,1)=Y'; s=0.0; p=1.0; q1=1.0; c1=1.0; for j=2:n for i=j:n A(i,j)=(A(i,j-1)A(i-1,j-1))/(X(i)-X(i-j+1)); end q1=abs(q1*(z-X(j-1)));c1=c1*j; end C=A(n,n);q1=abs(q1*(z-X(n))); for k=(n-1):-1:1 C=conv(C,poly(X(k))); d=length(C);C(d)=C(d)+A(k,k); end y(t)= polyval(C, z);18 end R=M*q1/c1;L(k,:)=poly2sym(C); 例 2.7 给出节点数据 f (?4.00) = 27.00 , f (0.00) = 1.00 , f (1.00) = 2.00 ,f (2.00) = 17.00 ,作三阶牛顿插值多项式,计算 f (?2.345) ,并估计其误差。解 首先将名为newdscg.m的程序保存为M文件,然后在MATLAB工作窗口输入 程序 && syms M,X=[-4,0,1,2]; Y =[27,1,2,17]; x=-2.345; [y,R,A,C,P]=newdscg(X,Y,x,M) 运行后输出插值y ≈ f (?2.345) 及其误差限公式R,三阶牛顿插值多项式P及其 系数向量C,差商的矩阵A如下 y = 22.3211 R =*M (即R =2.3503*M) A= 27. 0 1.0 0 0 2.0 1..0 7.7 C =0.0 -4.0 P =11/12*x^3+17/4*x^2-25/6*x+1 例 2.8 将区间 [0,π/2] 分成 n 等份 (n = 2,3) , y = f ( x) = sin x 产生 n + 1 用 个节点,求二阶和三阶牛顿插值多项式 P2 ( x) 和 P3 ( x) .用它们分别计算sin (π/7) (取四位有效数字),并估计其误差. 解 程序 && X1=0:pi/4:pi/2; Y1 =sin(X1); M=1; x=pi/7; X2=0:pi/6:pi/2; Y2 =sin(X2); [y1,R1,A1,C1,P2]=newdscg(X1,Y1,x,M), [y2,R2,A2,C2,P3]=newdscg(X2,Y2,x,M) 运行后输出插值y1= P2 (π / 7) ≈ sin(π / 7) 和y2= P3 (π / 7) ≈ sin(π / 7) 及其误差 限R1和R2,二阶和三阶牛顿插值多项式P2和P3及其系数向量C1和C2,差商的矩阵 A1和A2如下 y1 =0..0282 A1 = 0 0 0 0.3 0 1.9 -0.3357 C1 = -0.0 0 P2=-*x^2+*x y2 =0.434519首先将名为newdscg.m的程序保存为M文件, 然后在MATLAB工作窗口输入 R2 =9. A2 = 0 0 0 0 0.9 0 0 0.1 -0..9 -0.9 C2 =-0.5 1.=-*x^3-*x^2+62 7370496*x三、实验任务1、已知函数表 xi yi 0.41 0.59 0.77 0.95用二次拉格朗日插值多项式求 x = 0.5635 时的函数近似值。 2、已知函数表xi yi0.4 0.410750.55 0.578150.65 0.696750.8 0.888110.9 1.02652用牛顿插值多项式求 N 3 (0.596) 和 N 4 (0.895) 。四、思考题1、插值多项式的存在唯一性有何意义? 2、多项式插值是如何构造的?截断误差如何表示?如何估计? 3、在插值区间上,随着节点的增多,插值多项式是否越来越接近被插函数?20 实验三、 实验三、数据拟合法曲线拟合的最小二乘法是计算机数据处理的重要内容, 也是函数逼近的另一 种重要方法,它在工程技术中有着广泛的应用。对实际问题而言,拟合曲线的选 择是一个极其重要而又比较困难的问题, 必要时可由草图观察选取几种不同类型 的拟合曲线,再以其偏差小者为优,经检验后再决定最后的取舍。一、实验目的1、 理解数据拟合的基本概念、基本方法; 2、掌握最小二乘法的基本原理,并会通过计算机解决实际问题; 3、了解超定方程组的最小二乘解法。二、算法实例例 3.1 给出一组数据点 ( xi , y i ) 列入表 3C1 中,试用线性最小二乘法求拟合曲线,并估计其误差,作出拟合曲线。 表 3C1 xi yi -2.5 -1.7 -1.1 例 3.1 的一组数据 ( xi , y i ) -0.8 0 -9.10 0.1 -8.43 1.5 -13.12 2.7 6.50 3.6 68.04-192.9 -85.50 -36.15 -26.52 解(1)在 MATLAB 工作窗口输入程序&& x=[-2.5 -1.7 -1.1 -0.8 0 0.1 1.5 2.7 3.6]; y=[-192.9 -85.50 -36.15 -26.52 -9.10 -8.43 -13.12 6.50 68.04]; plot(x,y,'r*'), legend('实验数据(xi,yi)') xlabel('x'), ylabel('y'), title('例3.1的数据点(xi,yi)的散点图') 运行后屏幕显示数据的散点图(略) 。 (3)编写下列 MATLAB 程序计算 f (x) 在 ( xi , y i ) 处的函数值,即输入程序 && syms a1 a2 a3 a4 x=[-2.5 -1.7 -1.1 -0.8 0 0.1 1.5 fi=a1.*x.^3+ a2.*x.^2+ a3.*x+ a4 运行后屏幕显示关于a1,a2, a3和a4的线性方程组 fi =[ -125/8*a1+25/4*a2-5/2*a3+a4, -*a1+289/100*a2-17/10*a3+a4, -*a1+121/100*a2-11/10*a3+a4, -64/125*a1+16/25*a2-4/5*a3+a4,212.73.6]; a4,1//100*a2+1/10*a3+a4, 27/8*a1+9/4*a2+3/2*a3+a4, *a1+729/100*a2+27/10*a3+a4, +324/25*a2+18/5*a3+a4] 编写构造误差平方和的 MATLAB 程序 6.50 && y=[-192.9 -85.50 -36.15 -26.52 -9.10 -8.43 -13.12 68.04]; fi=[-125/8*a1+25/4*a2-5/2*a3+a4, -*a1+289/100*a2-17/10*a3+a4, -*a1+121/100*a2-11/10*a3+a4, -64/125*a1+16/25*a2-4/5*a3+a4,a4, 1//100*a2+1/10*a3+a4, 27/8*a1+9/4*a2+3/2*a3+a4, *a1+729/100*a2+27/10*a3+a4, +324/25*a2+18/5*a3+a4]; fy=fi-y; fy2=fy.^2; J=sum(fy.^2) 运行后屏幕显示误差平方和如下 J=(-125/8*a1+25/4*a2-5/2*a3+a4++(-*a1+289/100*a2-17/10*a3+a4+171/2)^2+(-*a1+ 121/100*a2-11/10*a3+a4+723/20)^2+(-64/125*a1+16/25*a2 -4/5*a3+a4+663/25)^2+(a4+91/10)^2+(1//100*a2 +1/10*a3+a4+843/100)^2+(27/8*a1+9/4*a2+3/2*a3+a4+328/ 25)^2+(*a1+729/100*a2+27/10*a3+a4-13/2)^2+( +324/25*a2+18/5*a3+a4- ?J 为 求 a1 , a 2 , a 3 , a 4 使 J 达 到 最 小 , 只 需 利 用 极 值 的 必 要 条 件 =0 ?a k(k = 1,2,3,4) ,得到关于 a1 , a 2 , a 3 , a 4 的线性方程组,这可以由下面的 MATLAB 程序完成,即输入程序 && syms a1 a2 a3 a4 J=(-125/8*a1+25/4*a2-5/2*a3+a4++(-*a1+289/100*a2-17/10*a3+a4...+171/2)^2+(-*a1+1 21/100*a2-11/10*a3+a4+723/20)^2+(-64/125*a1+16/25*a2-4/5* a3+a4+663/25)^2+(a4+91/10)^2+(1//100*a2+1/10*a3+ a4+843/100)^2+(27/8*a1+9/4*a2+3/2*a3+a4+328/25)^2+(1*a1+729/100*a2+27/10*a3+a4-13/2)^2+(+324/2 5*a2+18/5*a3+a4-; Ja1=diff(J,a1); Ja2=diff(J,a2); Ja3=diff(J,a3); Ja4=diff(J,a4); Ja11=simple(Ja1), Ja21=simple(Ja2), Ja31=simple(Ja3), Ja41=simple(Ja4), 运行后屏幕显示 J 分别对 a1, a2 ,a3 ,a4 的偏导数如下 Ja11=00*a1+00*a2+ 500*a3+*a4- Ja21=00*a1+0*a2+*a22 3+67*a4+ Ja31=0*a1+*a2+67*a3+18/5*a4-23
Ja41=*a1+67*a2+18/5*a3+18*a4+14859/25 解线性方程组 Ja11 =0,Ja21 =0,Ja31 =0,Ja41 =0,输入下列程序 &&A=[00, 00, 0, ; 00, 0, , 67; 0, , 67, 18/5; , 67, 18/5, 18]; B=[, -, , -14859/25]; C=B/A, f=poly2sym(C) 运行后屏幕显示拟合函数 f 及其系数 C 如下 C = 5.5 6.4 f=759/328*x^3 -*x^2 +*x - 故所求的拟合曲线为 f ( x ) = 5.0911 x 3 ? 14.1905 x 2 + 6.4102 x ? 8.2574 . (4)编写下面的 MATLAB 程序估计其误差,并作出拟合曲线和数据的图形. 输入程序 && xi=[-2.5 -1.7 -1.1 -0.8 0 0.1 1.5 2.7 3.6]; y=[-192.9 -85.50 -36.15 -26.52 -9.10 -8.43 -13.12 6.50 68.04]; n=length(xi); f=5.0911.*xi.^3-14.1905.*xi.^2+6.4102.*xi -8.2574; x=-2.5:0.01: 3.6; F=5.0911.*x.^3-14.1905.*x.^2+6.4102.*x -8.2574; fy=abs(f-y); fy2=fy.^2; Ew=max(fy), E1=sum(fy)/n, E2=sqrt((sum(fy2))/n) plot(xi,y,'r*'), hold on, plot(x,F,'b-'), hold off legend('数据点(xi,yi)','拟合曲线y=f(x)'), xlabel('x'), ylabel('y'), title('例3.1的数据点(xi,yi)和拟合曲线y=f(x)的图形') 运行后屏幕显示数据 ( xi , y i ) 与拟合函数 f 的最大误差 Ew,平均误差 E1 和均方根 误差 E2 及其数据点 ( xi , y i ) 和拟合曲线 y=f(x)的图形(略) 。 例 3.2 Ew =3.105 4 E1 =0.903 4 E2 =1.240 9 给出一组数据点 ( xi , y i ) 列入表 3C2 中,试用线性最小二乘法求拟合曲线,并估计其误差,作出拟合曲线. 表 3C2 xi yi -2.9 53.94 -1.9 33.68 -1.1 20.88 例 3.2 的一组数据 ( xi , y i ) 0 8.7923-0.8 16.920.1 8.981.5 4.172.7 9.123.6 19.88 解 (1)首先根据表 3C2 给出的数据点 ( xi , y i ) ,用下列 MATLAB 程序画出散 点图。 在 MATLAB 工作窗口输入程序 && x=[-2.9 -1.9 -1.1 -0.8 0 0.1 1.5 2.7 3.6]; y=[53.94 33.68 20.88 16.92 8.79 8.98 4.17 9.12 19.88]; plot(x,y,'r*'), legend('数据点(xi,yi)') xlabel('x'), ylabel('y'), title('例3.2的数据点(xi,yi)的散点图') 运行后屏幕显示数据的散点图(略). (3)用作线性最小二乘拟合的多项式拟合的 MATLAB 程序求待定系数 a k( k = 1, 2,3) .输入程序&& a=polyfit(x,y,2) 运行后输出系数 a =2.8302 故拟合多项式为 f ( x ) = 2 . 830 2 x 2 ? 7 .372 1 x + 9 .138 2 . (4)编写下面的 MATLAB 程序估计其误差,并做出拟合曲线和数据的图形. 输入程序 && xi=[-2.9 -1.9 -1.1 -0.8 0 0.1 1.5 2.7 3.6]; y=[53.94 33.68 20.88 16.92 8.79 8.98 4.17 9.12 9.88]; n=length(xi); f=2.8302.*xi.^2-7.3721.*xi+9.1382 x=-2.9:0.001:3.6;F=2.8302.*x.^2-7.3721.*x+8.79; fy=abs(f-y); fy2=fy.^2; Ew=max(fy), E1=sum(fy)/n, E2=sqrt((sum(fy2))/n), plot(xi,y,'r*', x,F,'b-'), legend('数据点(xi,yi)','拟合曲线y=f(x)') xlabel('x'), ylabel('y'), title('例3.2 的数据点(xi,yi)和拟合曲线y=f(x)的图形') 运行后屏幕显示数据 ( xi , y i ) 与拟合函数 f 的最大误差 Ew,平均误差 E1 和均方根 误差 E2 及其数据点(xi,yi)和拟合曲线 y=f(x)的图形(略). Ew =0.745 7, 例 3.3 3.6 E1 =0.389 2, E2 = 0.436 3 6.8 5.10 4.5 -7.2给出一组实验数据点 ( xi , y i ) 的横坐标向量为 x=(7.5 2.6 2.5 2.1 1.5 2.73.43.6) ,纵横坐标向量为 y=(359.26 24.22) ,165.60 59.17 41.66 25.92 22.3713.47 12.87 11.87 6.69 14.87试用线性变换和线性最小二乘法求拟合曲线,并估计其误差,作出拟合曲线。24 解: (1)首先根据给出的数据点 在 MATLAB 工作窗口输入程序( xi , y i ),用下列 MATLAB 程序画出散点图。&& x=[7.5 6.8 5.10 4.5 3.6 3.4 2.6 2.5 2.1 1.5 2.7 3.6]; y=[359.26 165.60 59.17 41.66 25.92 22.37 13.47 12.87 11.87 6.69 14.87 24.22]; plot(x,y,'r*'), legend('数据点(xi,yi)') xlabel('x'), ylabel('y'), title('例3.3的数据点(xi,yi)的散点图') 运行后屏幕显示数据的散点图(略) 。 (2)根据数据散点图,取拟合曲线为y = a e bx (a & 0, b ≠ 0) ,(3.1)其中 a, b 是待定系数.令 Y = ln y, A = ln a, B = b ,则(3.1)化为 Y = A + Bx 。在 MATLAB 工作窗口输入程序 && x=[7.5 6.8 5.10 4.5 3.6 3.4 2.6 2.5 2.1 1.5 2.7 3.6]; y=[359.26 165.60 59.17 41.66 25.92 22.37 13.47 12.87 11.87 6.69 14.87 24.22]; Y=log(y); a=polyfit(x,Y,1); B=a(1);A=a(2); b=B,a=exp(A) n=length(x); X=8:-0.01:1; Y=a*exp(b.*X); f=a*exp(b.*x); plot(x,y,'r*',X,Y,'b-'), xlabel('x'),ylabel('y') legend('数据点(xi,yi)','拟合曲线y=f(x)') title('例 3.3 的数据点(xi,yi)和拟合曲线 y=f(x)的图形') fy=abs(f-y); fy2=fy.^2; Ew=max(fy), E1=sum(fy)/n, E2=sqrt((sum(fy2))/n) 运行后屏幕显示 y = a e 的系数 b =0.624 1,a =2.703 9,数据 ( xi , y i ) 与拟合函 数 f 的最大误差 Ew =67.641 9,平均误差 E1=8.677 6 和均方根误差 E2=20.711 3 及其数据点 ( xi , y i ) 和拟合曲线 f ( x ) = 2 . 703 9 e 例 3.4 超定方程组的最小二乘算法概要 设超定方程组为0.624 1 x bx的图形(略) 。? a11 x1 + a12 x 2 + L + a1s x s = b1 ?a x + a x + L + a x = b ? 21 1 22 2 2s s 2 ? LLLLLLLLLLLL ? ?a n1 x1 + a n 2 x 2 + L + a ns x s = bn ? .25 令? a11 ? ?a A = ? 21 L ? ?a ? n1a12 a 22 L an2L L L La1s ? ? b1 ? ? x1 ? ? ? ? ? ? a2s ? ? b2 ? ?x ? ,B = ? ?, X = ? 2 ?, L? M M ? ? ? ? ? ? ?b ? ?x ? a ns ? ? n? ? s?? s ? ? ∑ a1 j x j ? ? j =1 ? ? s ? ? ∑ a 2 j x j ? = AX Y = j =1 ? ? M ? ? ? s ? ? ∑ a nj x j ? ? j =1 ? .0 最小二乘法就是找 x10 , x 2 , L , x s0 使 Y 与 B 的距离最短。但由前知道向量 Y 就是? a1s ? ? a11 ? ? a12 ? ? ? ? ? ? ? ? a 21 ? ? a 22 ? ?a ? Y = x1 ? ? + x 2 ? + L + xn ? 2s ? M M ? M ? ? ? ? ? ? ?a ? ?a ? ?a ? ? n2 ? ? ns ? ? n1 ?.把 A 的 各 列 向 量 分 别 记 成 α 1 , α 2 ,L, α s 。 由 它 们 生 成 的 子 空 间 为L(α 1 , α 2 , L , α s ) 。 Y 就是 L(α 1 , α 2 , L , α s ) 中的向量。于是最小二乘法问题可叙述成: 找X 使∑ (ai =1ni1 1x + a i 2 x 2 + L + a is x s ? bi ) 2最小,就是在 L(α 1 , α 2 , L , α s ) 中找一向量 Y ,使得 B 到它的距离比到子空间L(α 1 , α 2 , L , α s ) 中其它向量的距离都短。应用前面所讲的结论,设Y = AX = x1α 1 + x 2α 2 + L + x sα s是所要求的向量,则C = B ? Y = B ? AX必须垂直于子空间 L(α 1 , α 2 , L , α s ) 。为此只须而且必须(C , α 1 ) = (C , α 2 ) = L = (C , α s ) = 0 .回忆矩阵乘法规则,上述一串等式可以写成矩阵相乘的式子,即26 ' α 1' C = 0, α 2 C = 0,L , α s' C = 0 . ' 而 α 1' , α 2 , L , α s' 按行正好排成矩阵 A' ,上述一串等式合起来就是A ' ( B ? AX ) = 0 , 或 A ' AX = A ' B . 这就是最小二乘解所满足的代数方程,它是一个线性方程组,系数矩阵是 A, A ' ,常数项是 A' B ,然后只要调用解线性方程组的函数程序即可。三、实验任务1、已知一组实验数据如下,求它的拟合曲线。 0.3 0.5 0.6 0.7 0.9 1.67xy1.66 1.532、解超定方程组? 2 x1 + x 2 = 3 ? ? x1 + 2 x 2 = 4 . ? x +x =5 2 ? 1四、思考题1、何谓最小二乘原理?它与插值函数求近似式有何区别? 2、最小二乘问题的法方程组是如何构造出来的?它是否存在唯一解?27 实验四 数值积分和数值微分在实际问题中我们常常需要计算定积分。但在很多情况下,并不能利用牛 顿-莱布尼兹公式方便地计算函数的定积分,因此,有必要研究定积分的数值计 算问题。牛顿-科特斯公式是在等距节点情形下的插值型求积公式,其简单情形 如梯形公式、抛物线公式等。复化求积公式是改善求积公式精度的一种行之有效 的方法,特别是复化梯形公式、复化抛物线公式,使用方便,在实际计算中常常 使用。龙贝格求积公式是在区间逐次分半过程中,对用梯形法所得的近似值进行 多级“修正” ,而获得的准确程度较高的求积分近似值的一种方法。当然,对具 体实际问题而言,一个公式使用的效果如何,与被积分的函数性态及计算结果的 精度要求等有关,我们要根据具体问题,选择合适的公式进行计算。 微分是高等数学中的基本运算。一方面它是一些非常重要的数学工具(微分 方程、概率论等)的基础,另一方面它在实际问题中也有着许多直接的应用。一、实验目的1、理解数值积分的概念,掌握各种数值积分方法,包括梯形公式、抛物线公式、 复化求积公式等;2、 通过实际计算体会各种数值积分方法的精确度; 3、 理解数值求导的概念,掌握各种数值求导的方法。二、算法实例1.梯形公式的 MATLAB 程序 function T=rctrap(fun,a,b,m) n=1;h=b-a; T=zeros(1,m+1); x=a; T(1)=h*(feval(fun,a)+feval(fun,b))/2; for i=1:m h=h/2; n=2*n; s=0; for k=1:n/2 x=a+h*(2*k-1); s=s+feval(fun,x); end T(i+1)=T(i)/2+h*s; end T=T(1+m) 例 4.1 用 rctrap 计算 I = 确值比较.281 2π∫π2 0e?x2 2dx, 递归 14 次, 并将计算结果与精 解输入程序&&T=rctrap(fun,0,pi/2,14), syms t fi=int(exp((-t^2)/2)/(sqrt(2*pi)),t,0, pi/2); Fs= double(fi), wT= double(abs(fi-T)) 运行后屏幕显示 I 精确值 Fs,用 rctrap 计算 I 的递归值 T 和 T 与精确值 Fs 的绝对误差 wT 2.复合辛普森(Simpson)数值积分的 MATLAB 主程序 function y=comsimpson(fun,a,b,n) z1=feval (fun,a)+ feval (fun,b);m=n/2; h=(b-a)/(2*m); x=a; z2=0; z3=0; x2=0; x3=0; for k=2:2:2*m x2=x+k*h; z2= z2+2*feval (fun,x2); end for k=3:2:2*m x3=x+k*h; z3= z3+4*feval (fun,x3); end y=(z1+z2+z3)*h/3; 例 4.2 用 comsimpson.m 和 quad.m 分别计算定积分 I = 精度为 10 ,并与精确值比较. 解:输入程序 && [Q1,FCNT14] = quad(@fun,0,1,1.e-4,3), Q2 =comsimpson (@fun,0,1,10000) syms x fi=int(exp( (-x.^2)./2)./(sqrt(2*pi)),x,0, 1); Fs= double (fi) wQ1= double (abs(fi-Q1) ), wQ2= double (abs(fi-Q2) ) 运行后屏幕显示 I 的精确值 Fs,用 comsimpson.m 和 quad.m 分别计算 I 的近 似值 Q2、Q1 和迭代次数 FCNT14,取精度分别为 10 ,Q2、Q1 分别与精确值 Fs 的绝对误差 wQ2, wQ1 如下 9 0. 2.1 0. 11 0. 4.1 0. 13 0. 2.1 0. Q1 = 0.3413 FCNT14 = 13 Q2 =0.3413 Fs = 0.3413 wQ1 =3. wQ2 =3..计算 n 阶牛顿-科茨的公式的截断误差公式的 MATLAB 主程序 function RNC=ncE(n) suk=1; p=n/2-fix(n/2); if p==0 for k=1:n+2 suk=suk*k;29?4 ?41 2π∫1e?x2 20d x ,取
syms t a b fxn2,su=t^2; for u=1:n su=su*(t-u); intf=int(su,t,0,n); y=double(intf); RNC= (((b-a)/n)^(n+3))*fxn2*abs(y)/ else for k=1:n+1 suk=suk*k; syms t a b fxn1,su=t; for u=1:n su=su*(t-u); intf=int(su,t,0,n); y=double(intf); RNC= (((b-a)/n)^(n+2))*fxn1*abs(y)/ end 例 4.3 用求截断误差公式的 MATLAB 主程序,求计算定积分 ∫ f (x) d x 的近似a b值的 1,2,3,4,8 阶牛顿C科茨公式的截断误差公式. 解 输入求 1,2,3,4,8 阶牛顿C科茨公式的截断误差公式的程序 && n=1, RNC1=ncE(n), n=2, RNC2=ncE(n), n=3, RNC3=ncE(n) n=4, RNC4=ncE(n), n=8, RNC8=ncE(n) 运行后屏幕显示结果如下 n = 1 RNC1 =1/12*(b-a)^3*fxn1 n = 2 RNC2 =1/90*(1/2*b-1/2*a)^5*fxn2 n = 3 RNC3=3/80*(1/3*b-1/3*a)^5*fxn1 n = 4 RNC4=8/945*(1/4*b-1/4*a)^7*fxn2 n = 8 RNC8= 43/*b-1/8*a)^11*fxn2 4.龙贝格积分的 MATLAB 程序 function [RT,R,wugu,h]=romberg(fun,a,b, wucha,m) n=1;h=b-a; wugu=1; x=a;k=0; RT=zeros(4,4); RT(1,1)=h*(feval(fun,a)+feval(fun,b))/2; while((wugu&wucha)&(k&m)|(k&4)) k=k+1; h=h/2; s=0; for j=1:n x=a+h*(2*j-1); s=s+feval(fun,x); end RT(k+1,1)= RT(k,1)/2+h*s; n=2*n; for i=1:k RT(k+1,i+1)=((4^i)*RT(k+1,i)-RT(k,i))/(4^i-1); end wugu=abs(RT(k+1,k)-RT(k+1,k+1)); end R=RT(k+1,k+1);30 例 4.4取精度为 ε = 10 ?8 ,分别用 T j +1, j +1 ? T j +1, j & ε 和 T j +1, j +1 ? T j , j & ε 作1.5 0为计算停止的条件,用 romberg.m 程序计算 I = ∫ 小 步 长 h , 取 精 度 为 10?81 d x ,龙贝格积分表,最 1+ x?7, 并 与 精 确 值 比 较 . 然 后 取 精 度 为 10,用T j +1, j +1 ? T j +1, j & ε 作为计算停止的条件, 观察用龙贝格求积公式计算的结果与精确值的绝对误差是否满足 10 。 解 (1)取精度分别为 10 ,当用 T j +1, j +1 ? T j +1, j & ε 作为计算停止的条件, 输入程序 &&F=inline('1./(1+x)'); [RT,R,wugu,h]=romberg(F,0,1.5,1.e-8,13) syms x fi=int(1/(1+x),x,0,1.5); Fs=double(fi), wR=double(abs(fi-R)), wR1= wR - wugu ?8 运行后屏幕显示 I 精确值 Fs,取精度为 10 ,利用龙贝格求积公式 的 romberg.m 程序计算 I 的近似值 R, 龙贝格积分表 RT, 误差估计 err, 最小步长 h, 近似值 R 与精确值 Fs 的绝对误差 wR。 5.差商求导及其 MATLAB 程序 例 4.5 设 f ( x) = sin(5 x 2 ? 21) 。 分别利用前差公式和后差公式计算 f ' (0.79) 的近似值和误差, 4 位小 的近似值和误差, ( 1) 取 数点计算,其中步长分别取 h = 0.1, 0.01, 0.001, 0.000 1 , f & ( x) ≤ 80, x ∈ [0,1] . (2)将(1)中计算的 f ' (0.79) 的近似值分别与精确值比较. 解 (1)编写计算 y = f ( x) 的一阶导数计算 f ' ( x) 的近似值和误差估计的 MATLAB程序,并输入 && x=0.79;h=[0.1,0.01,0.001,0.0001]; M=80;x1=x+h;x2=x-h; y=sin(5.*x.^2-21); y1=sin(5.*x1.^2-21); y2=sin(5.*x2.^2-21); yq=(y1-y)./h, yh=(y-y2)./h, wu=abs(h.*M/2), syms x,f=sin(5.*x.^2-21); yx=diff(f,x) 运行后屏幕显示利用前差公式和后差公式计算 f ' (0.79) 的近似值yq,yh和误差估 计wu,取4位小数点计算,其中步长分别取 h = 0.1, 0.01, 0.001, 0.000 1 ,M=80,导 函数yx yq =1.78 4.4331?8?74.97 4.22 yh =5.36 4.27 4.07 wu =4.00 0.00 0.00 yx =10*cos(5*x^2-21)*x (2)计算 f ′(0.79) 的值.输入程序4.55 0.00&& x=0.79; yx =10*cos(5*x^2-21)*x, wuq=abs(yq-yx), wuh=abs(yh-yx) 运行后屏幕显示利用前差公式和后差公式计算 f ′(0.79) 的近似值与精确值的绝 对误差wuq,wuh和 f ′(0.79) 的精确值yx如下 yx=4.84 wuq=2.06 0.41 0.61 wuh=1.53 0.44 0.24 6.中心差商公式求导及其MATLAB程序 0.87 0.72利用精度为 O(h 2 ) 的三点公式计算 f ′(x) 的近似值和误差估计的 MATLAB 主程 序 function [n,xi,yx,wuc]=sandian(h,xi,fi,M) n=length(fi); yx=zeros(1,n); wuc=zeros(1,n); x1= xi(1); x2= xi(2); x3= xi(3);y1=fi(1); y2=fi(2); y3=fi(3); xn= xi(n); xn1= xi(n-1); xn2= xi(n-2); yn=fi(n); yn1=fi(n-1); yn2=fi(n-2); for k=2:n-1 yx(1)=(-3*y1+4*y2-y3)/(2*h); yx(n)=(yn2-4*yn1+3*yn)/(2*h); yx(2)=(fi(3)-fi(1))/(2*h);yx(k)=(fi(k+1)- fi(k-1))./(2*h); wuc(1)=abs(h.^2.*M./3); wuc(n)=abs(h.^2.*M./3); wuc(2:n-1)=abs(-h.^2.*M./6); end 利用精度为 O(h 2 ) 的三点公式计算 f ' ( x) 的近似值和误差估计的 MATLAB 主程 序 function [x,yxj, wuc]=sandian3(h,xi,fi,M) yxj=zeros(1,3); wuc=zeros(1,3); x1= xi(1); x2= xi(2); x3= xi(3); y1=fi(1); y2=fi(2); y3=fi(3); for t=1:3 s(t)=((2*t-5)*y1-4*(t-2)*y2+(2*t-3)*y3)/(2*h); x= y=s(t); yxj(t)=y; if t==2 wuc(2)=abs(-h.^2*M/6); else wuc(1:2:3)=abs(h.^2*M/3); end end 例 4.6 设已给出 y = f (x) 的数据表 4C1:32 1.000 0 1.100 0 1.600 0 f(x) 0.250 0 0.226 8 0.206 6 0.147 9 M= 0.750 2,试用三点公式计算下列问题:x表 4C1 1.200 0 1.300 0 0.189 01.400 0 0.173 61.500 0 0.160 0(1)当 h=0.1 时, y = f (x) 在 x=1.000 0,1.100 0,1.200 0,1.300 0,1.400 0,1.500 0,1.600 0 处的一阶导数的近似值,并估计误差; (2)当 h=0.2 时, y = f (x) 在 x=1.000 0,1.200 0, 1.400 0,1.600 0 处 的一阶导数的近似值,并估计误差; (3)当 h=0.3 时, y = f (x) 在 x=1.000 0,1.300 0 ,1.600 0 处的一阶导数 的近似值,并估计误差; (4) 表 4C1 中的数据是函数 f ( x) = 算的一阶导数的近似值与 f ( x) = 误差。 解 (1)保存 M 文件 sandian.m,sandian3.m; (2)在 MATLAB 工作窗口输入如下程序 && syms x,y=1/((1+x)^2); yx=diff(y,x,1), yx3=diff(y,x,3), 运行后将屏幕显示的结果为 yx =-2/(1+x)^3 yx3 =-24/(1+x)^5 (3)在 MATLAB 工作窗口输入如下程序 &&h=0.1; xi=1.0000:h:1.6000; fi=[0.8 0.0 0.0 0.1479]; x=1:0.001:1.6; yx3 =-24./(1+x).^5; M= max(abs(yx3)); [n1,x1,yx1,wuc1]=sandian(h,xi,fi,M) yxj1=-2./(1+xi).^3,wuyxj1=abs(yxj1- yx1) h=0.2; xi=1.0000:h:1.6000; fi=[0.6 0.9]; x=1:0.001:1.6; yx3 =-24./(1+x).^5; M= max(abs(yx3)); [n2,x2,yx2,wuc2]=sandian(h,xi,fi,M) yxj2=-2./(1+xi).^3,wuyxj2=abs((yxj2- yx2)) h=0.3; xi=1.0000:h:1.6000; fi=[0.0 0.1479]; x=1:0.001:1.6; yx3 =-24./(1+x).^5; M=max(abs(yx3)); [x3,yx3, wuc3]=sandian3(h,xi,fi,M) yxj3=-2./(1+xi).^3,wuyxj3=abs(yxj3- yx3)331 在相应点的数值,将(1)至(3)计 (1 + x) 21 的一阶导数值比较,并求出它们的绝对 (1 + x) 2 或&& h1=0.1, x=[1.0,1.0,1.0,1.6000]; f=[0.8,0.0,0.0,0.1479]; xi=x(1:3);f11=f(1:3); M= 0.7502; [x11,yxj11,wuc11]=sandian3(h1,xi,f11,M), xi= x(4:6);f12=f(4:6); [x12,yxj12,wuc12]=sandian3(h1,xi,f12,M), xi=x(5:7);f13=f(5:7); [x13,yxj13,wuc13]=sandian3(h1,xi,f13,M), h2=0.2, xi= x(1:2:5);f21= f(1:2:5); [x21,yxj21,wuc21]=sandian3(h2,xi,f21,M), xi= x(2:2:6);f22=f(2:2:6); [x22,yxj22,wuc22]=sandian3(h2,xi,f22,M), xi= x(3:2:7);f23=f(3:2:7); [x23,yxj23,wuc23]=sandian3(h2,xi,f23,M), h3=0.3, xi= x(1:3:7);f31= f(1:3:7); [x31,yxj31,wuc31]=sandian3(h3,xi,f31,M), 将运行的结果(略) 。 7.理查森外推法求导及其MATLAB程序 利用理查森外推法计算 f ' ( x) 的近似值和误差估计的 MATLAB 程序 function [Dy,dy,jdw,n]=diffext1(fun,x0,jdwc,max1) h=1;j=1; n=1;jdW=1;xdW=1; x1=x0+h;x2=x0-h; Dy(1,1)=(feval(fun,x1)- feval(fun,x2))/(2*h); while((jdW&jdwc)&(j&max1))x1=x0+2^(-j)*h;x2=x0-2^(-j)*h; Dy(j+1,1)=(feval(fun,x1)-feval(fun,x2))/(2^(1-j)*h); for k=1:Dy(j+1,k+1)= Dy(j+1,k)+( Dy(j+1,k)- Dy(j,k))/(4^k-1); end jdW=abs(Dy(j+1,j+1)-Dy(j+1,j)); j=j+1; end [n,n]=size(Dy);jdw=abs(Dy(n,n)-Dy(n,n-1)); dy= Dy(n,n); 例 4.7 设 f ( x) = sin(5 x 2 ? 21) ,取精度 jdwc=0.000 000 1,用理查森外推法' 计算 f (0.79) 的近似值和误差估计,将近似值与精确值 4.84 比较。解 取最大计算次数max1=100,输入程序 && x0=0.79;jdwc=0.0000001,max1=100; [Dy,dy,jdw,n]=diffext1(@fun,x0,jdwc,max1), wu=4.84-dy 运行后屏幕显示 f ' (0.79) 的近似值 dy, 与精确值的绝对误差 wu, dy 导数 f ' ( x0 ) 近 似值的迭代矩阵 Dy,jdW=|Dy(n,n)-Dy(n,n-1)|的值。三、实验任务1、用复化辛普森公式计算定积分34 I =∫11 dx , 2 0 1+ x并将计算结果与实际准确值比较,分析其误差。 2、用梯形公式的逐次分半法计算定积分I =∫并考虑用 Romberg 公式进行加速。1sin x dx , 1+ x 0四、思考题1、谓插值型求积公式?它的截断误差如何表示? 2、复化求积与分段插值的思想方法有何联系?4、 梯形公式、 辛普森公式及其复化公式都具有什么形式?这两个复化公式的截断误差各是步长 h 的几阶无穷小量?35 实验五、 实验五、常微分方程初值问题的数值解法常微分方程的求解问题在实践中经常遇到, 因此研究常微分方程的数值解法 就很有必要。欧拉方法是最简单、最基本的方法,利用差商代替微商,就可得到 一系列欧拉公式。这些公式形式简洁,易于编程计算,但精度较低,可方便用于 精度要求不高的近似计算。龙格-库塔方法是利用区间上多个点的斜率值的加权 平均的思想,得出的高精度的计算公式。特别是四阶龙格-库塔公式,易于编程 计算,精度较高,是常用的工程计算方法。线性多步方法是在用插值多项式代替 被积函数的基础上构造的,它可利用前面若干步计算结果的信息,使计算结果提 高精度,其中较常用的是四阶阿当姆斯方法。一、实验目的1、 熟悉求解常微分方程初值问题的有关方法和理论,主要是改进欧 四阶龙格-库塔法; 2、会编制上述方法的计算程序,包括求解微分方程组的计算程序; 3、针对实习题编制程序,并上机计算其所需要的结果;4、 通过对各种求解方法的计算实习,体会各种解法的功能、优缺点及适用场合,拉法、会选取适当的求解方法。二、算法实例1.向前欧拉公式的 MATLAB 主程序 例 5.1 用欧拉方法求初值问题? dy ? = x ? y , 0 ≤ x ≤ 1, ? dx ? y x =0 = 1 ?的数值解, 分别取 h = 0.075 0, .007 5 , 0 并计算误差, 画出精确解和数值解的图形。解:编写并保存名为 Eulerli1.m 的 MATLAB 计算和画图的主程序如下function P=Eulerli1(x0,y0,b,h) n=(b-x0)/h; X=zeros(n,1); Y=zeros(n,1); k=1; X(k)=x0; Y(k)=y0; for k=1:n X(k+1)=X(k)+h; Y(k+1)=Y(k)+h*(X(k)-Y(k)); k=k+1; end36 y=X-1+2*exp(-X); plot(X,Y,'mp',X,y,'b-') grid xlabel('自变量 X'), ylabel('因变量 Y') title('用向前欧拉公式求dy/dx=x-y,y(0)=1在[0,1]上的数值 解和精确解y=x-1+2 exp(-x)') legend('h=0.075时,dy/dx=x-y,y(0)=1在[0,1]上的数值解 ','精确解y=x-1+2 exp(-x)') jwY=y-Y;xwY=jwY./y; k1=1:n;k=[0,k1]; P=[k',X,Y,y,jwY,xwY]; 在 MATLAB 工作窗口输入下面的程序 &&x0=0;y0=1;b=1;h=0.0750; P=Eulerli1(x0,y0,b,h) 在 MATLAB 工作窗口输入下面的程序 &&h1=0.0075; P1=Eulerli1(x0,y0,b,h1) legend('h1=0.0075 时,dy/dx=x-y,y(0)=1 在[0,1]上的数值 解','精确解 y=x-1+2 exp(-x)') 2.自适应向前欧拉公式的 MATLAB 主程序 用自适应向前欧拉公式求解常微分方程初值问题的数值解的 MATLAB 主程序 function [H,X,Y,k,h,P]=QEuler(funfcn,x0,b,y0,tol) %初始化. pow=1/3; if nargin & 5 | isempty(tol), tol = 1.e-6; if nargin & 6 | isempty(trace), trace = 0; x=x0; h=0.0078125*(b-x); y=y0(:);p=128; H=zeros(p,1); X=zeros(p,1); Y=zeros(p,length(y)); k=1; X(k)=x; Y(k,:)=y'; % 绘图. clc,x,h,y end % 主循环. while (x&b)&(x+h&x) if x+h&b h=b-x; end %计算斜率. fxy=feval(funfcn,x,y); fxy=fxy(:); %计算误差,设定可接受误差. delta=norm(h*fxy,'inf'); wucha=tol*max(norm(y,'inf'),1.0); % 当误差可接受时重写解.37 if delta&=wucha x=x+h; y=y+h* k=k+1; if k&length(X) X=[X;zeros(p,1)]; Y=[Y;zeros(p,length(y))]; H=[H;zeros(p,1)]; end H(k)=h;X(k)=x;Y(k,:)=y'; plot(X,Y,'rp'), grid xlabel('自变量 X'), ylabel('因变量 Y') title('用向前欧拉(Euler)公式计算dy/dx=f(x,y), y(x0)=y0在[x0,b]上的数值解') end %更新步长. if delta~=0.0 h=min(h*8,0.9*h*(wucha/delta)^pow); end end if (x&b) disp('Singularity likely.'), x end H=H(1:k); X=X(1:k); Y=Y(1:k,:); n=1:k; P=[n',H,X,Y] 3.向后欧拉方法的 MATLAB 程序 用向后欧拉方法求解常微分方程初值问题的数值解的 MATLAB 主程序 function [X,Y,n,P]=Heuler1(funfcn,x0,b,y0,h,tol) n=fix((b-x0)/h); X=zeros(n+1,1); Y=zeros(n+1,1); k=1; X(k)=x0; Y(k,:)=y0; Y1(k,:)=y0; % 绘图. clc,x0,h,y0 % 产生初值. for i=2:n+1 X(i)=x0+h; Y(i,:)=y0+h*feval(funfcn,x0,y0); Y1(i,:)=y0+h*feval(funfcn,X(i),Y(i,:)); % 主循环. Wu=abs(Y1(i,:)-Y(i,:)); while Wu&tol p=Y1(i,:); Y1(i,:)=y0+h*feval(funfcn,X(i),p); Y(i,:)=p; end x0=x0+h; y0=Y1(i,:); Y(i,:)=y0; plot(X,Y,'ro') grid on xlabel('自变量 X'), ylabel('因变量 Y') title('用向后欧拉公式计算dy/dx=f(x,y),y(x0)=y0在[x0,b]上 的数值解')38 end X=X(1:n+1); Y=Y(1:n+1,:); n=1:n+1; P=[n',X,Y] dy 例 5.2 用 向 后 欧 拉 公 式 求 解 区 间 [0,2] 上 的 初 值 问 题 = ? 3 y + 8 x ? 7, dxy (0) = 1 的数值解,取步长 h = 0.05 ,并与精确解作比较,在同一个坐标系中作出图形.然后再取 h = 0.01 , 观察数值解与精确解误差的变化, 说明 h 与误差的关系。 解:输入程序 &&S1=dsolve('Dy=8*x-3*y-7','y(0)=1','x') && x0=0;y0=1; b=2;tol=1.e-1; subplot(2,1,1) h1=0.01; [X1,Y1,n,P1]=Heuler1(@funfcn,x0,b,y0,h1,tol) hold on S2= 8/3*X1-29/9+38/9*exp(-3*X1), plot(X1,S2,'b-') legend('h=0.01用向后欧拉公式计算dy/dx=8x-3y-7,y(0)=1 在[0,2]上的数值解','dy/dx=8x-3y-7,y(0)=1在[0,2]上的精 确解') hold off juwY1=S2-Y1; xiwY1=juwY1./Y1; L=[P1,S2,juwY1,xiwY1] subplot(2,1,2) h=0.05; [X,Y,n,P]=Heuler1(@funfcn,x0,b,y0,h,tol) hold on S1 = 8/3*X-29/9+38/9*exp(-3*X), plot(X,S1,'b-') legend('h=0.05用向后欧拉公式计算dy/dx=8x-3y-7,y(0)=1 在[0,2]上的数值解','dy/dx=8x-3y-7,y(0)=1在[0,2]上的精 确解') hold off juwY=S1-Y; xiwY=juwY./Y; L=[P,S1,juwY,xiwY] 运行后屏幕显示用向后欧拉公式计算此初值问题在[0,2]上的自变量 X 处数值解 Y 和精确解 S1 及其图形,步长 H, Y 的相对误差 xiwY 和绝对误差 juwY(略)。 4.改进的欧拉公式的 MATLAB 程序 用自适应改进的欧拉公式求解常微分方程初值问题的数值解的 MATLAB 主程 序 function [H,X,Y,k,h,P]=gaiEuler(funfcn,x0,b,y0,tol) %初始化.39 pow=1/3; if nargin & 5 | isempty(tol), tol = 1.e-6; if nargin & 6 | isempty(trace), trace = 0; x=x0; h=0.0078125*(b-x); y=y0(:);p=128; n=fix((b-x0)/h); H=zeros(p,1); X=zeros(p,1); Y=zeros(p,length(y)); k=1; X(k)=x; Y(k,:)=y'; % 主循环. while (x&b)&(x+h&x) if x+h&b h=b-x; end %计算斜率. fxy=feval(funfcn,x,y); fxy=fxy(:); %计算误差,设定可接受误差. delta=norm(h*fxy,'inf'); wucha=tol*max(norm(y,'inf'),1.0); % 当误差可接受时重写解. if delta&=wucha x=x+h; y1=y+h* fxy1=feval(funfcn,x,y1); fxy=fxy(:);y2=(fxy+fxy1)/2; y=y+h*y2; k=k+1; if k&length(X) X=[X;zeros(p,1)]; Y=[Y;zeros(p,length(y))]; H=[H;zeros(p,1)]; end H(k)=h;X(k)=x;Y(k,:)=y'; plot(X,Y,'mh'), grid xlabel('自变量 X'), ylabel('因变量 Y') title('用改进的欧拉公式计算dy/dx=f(x,y),y(x0)=y0 在[x0,b]上的数值解') end %更新步长. if delta~=0.0 h=min(h*8,0.9*h*(wucha/delta)^pow); end end if (x&b) disp('Singularity likely.'), x end H=H(1:k); X=X(1:k); Y=Y(1:k,:); n=1:k; P=[n',H,X,Y] 例 5.3 分别用梯形公式和改进的欧拉公式求解区间 [0,2] 上的初值问题dy = ?3 y + 8 x ? 7, y (0) = 1 ,取精度为 10 ?1 ,与精确解作比较,在同一个坐标系中 dx40 作出图形. 解:输入程序 && x0=0;y0=1; b=2;tol=1.e-1; [Ht,X,Yt,k,h,Pt]=odtixing2(@funfcn,x0,b,y0,tol) hold on S1 = 8/3*X-29/9+38/9*exp(-3*X), plot(X,S1,'b-') hold off hold on [H,X,Y,k,h,P]=gaiEuler(@funfcn,x0,b,y0,tol) hold off legend('用梯形公式计算dy/dx=8x-3y-7,y(0)=1在[0,2]上的 数值解','dy/dx= 8x-3y-7,y(0)=1在[0,2]上的精确解', '用改进的欧 拉公式计算dy/dx=8x-3y-7,y(0)=1在[0,2]上的数值解') ,juwY=S1-Y; xiwY=juwY./Y; L=[P,S1,juwY,xiwY] 运行后屏幕显示取精度为 10 ?1 , 分别用梯形公式和改进的欧拉公式求此解初值问 题在区间 [0,2] 上的自变量 X 处数值解 Yt, Y 和精确解 S1 及其图形,步长 H, Y 的相对误差 xiwY 和绝对误差 juwY(略)。 5.四阶龙格-库塔方法及其 MATLAB 程序 用一般四阶龙格-库塔方法求解常微分方程初值问题的数值解的 MATLAB 主程 序1 function[k,X,Y,fxy,wch,wucha,P]=RK4(funfcn,fun,x0,b,C,y0, h) x=x0; y=y0;p=128; n=fix((b-x0)/h); fxy=zeros(p,1); wucha=zeros(p,1); wch=zeros(p,1); X=zeros(p,1); Y=zeros(p,length(y)); k=1; X(k)=x; Y(k,:)=y'; % 绘图. clc,x,h,y %计算 %fxy=fxy(:); for k=2:n+1 x=x+h;a2=C(5); a3=C(6); a4=C(7);b21=C(8); b31=C(9); b32=C(10); b41=C(11); b42=C(12); b43=C(13);c1=C(1); c2=C(2); c3=C(3); c4=C(4); x1=x+a2*h; x2=x+a3*h; x3=x+a4*h; k1=feval(funfcn,x,y); y1=y+b21*h*k1; k2=feval(funfcn,x1,y1); y2=y+b31*h*k1+b32*h*k2; k3=feval(funfcn,x2,y2);41 y3=y+b41*h*k1+b42*h*k2+b43*h*k3; k4=feval(funfcn,x3,y3); fxy(k)=feval(fun,x); y=y+h*(c1*k1+c2*k2+c3*k3+c4*k4); X(k)=x; Y(k,:)=y; k=k+1; plot(X,Y,'rp',X,fxy,'bo'), grid xlabel('自变量 X'), ylabel('因变量 Y') legend('用四阶龙格-库塔方法计算dy/dx=f(x,y), y(x0)=y0在 [x0,b]上的数值解','y/dx=f(x,y),y(x0)=y0的精确解 y=f(x)') end %计算误差. for k=2:n+1 wucha(k)=norm(Y(k-1)-Y(k)); wch(k)=norm(fxy(k)-Y(k)); end X=X(1:k); Y=Y(1:k,:);fxy=fxy(1:k,:); n=1:k;wucha=wucha(1:k,:); wch=wch(1:k,:); P=[n',X,Y,fxy,wch,wucha]; 用常用四阶龙格-库塔方法求解常微分方程初值问题的数值解的 MATLAB 主程 序2 function [x,y]=RKc4(x0,b,y0,h) for x=x0:h:b k1=funfcn(x0,y0); k2=funfcn(x0+h/2,y0+h*k1/2); k3=funfcn(x0+h/2,y0+h*k2/2); k4=funfcn(x0+h,y0+h*k3); y=y0+h*(k1+2*k2+2*k3+k4)/6; x=x0+h;[x,y], x0=x;y0=y; end [x,y]; 例 5.4 用常用的四阶龙格-库塔公式求初值问题xy ?dy 2 , ? ? =1 2 , 0≤x≤2 ?dx 1+x ? yx=0 =0 ?的数值解,h=1/4,并计算与精确解的误差,在同一图形窗口画出例 5.1、例 5.2 和例 5.3 精确解和数值解的图形。 解:方法 1 在 MATLAB 工作窗口输入下面的程序 && x0=0;b=2; y0=0;h=1/4; subplot(3,1,1) C=[1/4,3/4,2/3,2/3];42 [k,X,Y,fxy,wch,wucha,P]=RK2(@funfcn,@fun,x0,b,C,y0,h) subplot(3,1,2) c1=1/6;c2=4/6;c3=1/6;a2=1/2; a3=1;b21=1/2;b31=-1;b32=2; C=[c1,c2,c3,a2, a3,b21,b31,b32]; [k,X,Y,fxy,wch,wucha,P]=RK3(@funfcn,@fun,x0,b,C,y0,h) subplot(3,1,3) c1=1/6;c2=2/6;c3=2/6;c4=1/6;a2=1/2; a3=1/2; a4=1;b21=1/2;b31=0;b32=1/2; b41=0;b42=0;b43=1; C=[c1,c2,c3, c4,a2, a3, a4,b21,b31,b32,b41,b42,b43]; [k,X,Y,fxy,wch,wucha,P]=RK4(@funfcn,@fun,x0,b,C,y0,h) 将运行后计算的结果(略) ,画出精确解和数值解的图形。 方法 2 在 MATLAB 工作窗口输入下面的程序&& x0=0;b=2; y0=0;h=1/4; [x,y]=RKc4(x0,b,y0,h) 运行后输出结果(略) 。 6. 亚当斯(Adams)显式公式及其 MATLAB 程序 用四阶亚当斯显式公式求解常微分方程初值问题的数值解的MATLAB主程序 function [k,X,Y,wucha,P]= Adams4x(funfcn,x0,b,y0,h) x=x0; y=y0;p=128; n=fix((b-x0)/h); if n&5,return, X=zeros(p,1); Y=zeros(p,length(y)); f=zeros(p,1); k=1; X(k)=x; Y(k,:)=y'; for k=2:4 c1=1/6;c2=2/6;c3=2/6; c4=1/6;a2=1/2; a3=1/2; a4=1;b21=1/2;b31=0; b32=1/2; b41=0;b42=0;b43=1; x1=x+a2*h; x2=x+a3*h; x3=x+a4*h; k1=feval(funfcn,x,y); y1=y+b21*h*k1; x=x+h; k2=feval(funfcn,x1,y1); y2=y+b31*h*k1+b32*h*k2; k3=feval(funfcn,x2,y2); y3=y+b41*h*k1+b42*h*k2+b43*h*k3; k4=feval(funfcn,x3,y3); y=y+h*(c1*k1+c2*k2+c3*k3+c4*k4); X(k)=x; Y(k,:)=y; end X;Y;f(1:4)=feval(funfcn,X(1:4),Y(1:4)); for k=4:n f(k)=feval(funfcn,X(k),Y(k)); X(k+1)=X(1)+h*k; Y(k+1)=Y(k)+(h/24)*((f(k-3:k))'*[-9 37 -59 55]'); f(k+1)= feval(funfcn,X(k+1),Y(k+1));f(k)=f(k+1); k=k+1;43 end for k=2:n+1 wucha(k)=norm(Y(k)-Y(k-1)); k=k+1; end X=X(1:n+1); Y=Y(1:n+1,:); n=1:n+1, wucha=wucha(1:n,:); P=[n',X,Y,wucha']; 例 5.4 先利用常用的四阶龙格-库塔公式求初值问题2 xy ? dy , 0 ≤ x ≤ 2, ? = 1? ? dx 1+ x 2 ? y x = 0 = 0, ?的几个点的数值解,再利用四阶亚当斯显式公式求解常微分方程初值问题, h=1/15,并计算它与精确解的误差, 在同一图形窗口画出精确解和数值解的图形。 解:在 MATLAB 工作窗口输入下面的程序 && y=dsolve('Dy=1-(2*x*y)/(1+x^2)','x') && x0=0;b=2;y0=0;h=1/15; [k,X,Y,wucha,P]=Adams4x(@funfcn,x0,b,y0,h), y=(X+1/3*X.^3)./(1+X.^2); b31=0; b41=0;b42=0;b43=1; c1=1/6;c2=2/6;c3=2/6;c4=1/6;a2=1/2; a3=1/2; a4=1;b21=1/2; b32=1/2; C=[c1,c2,c3, c4,a2, a3, a4,b21,b31,b32,b41,b42,b43]; [k,X,Y1,fxy,wch,wucha,P]=RK4(@funfcn,@fun,x0,b,C,y0,h) plot(X,Y,'gh',X,Y1,'mp',X,y,'bo'), grid,xlabel('自变量 X'), ylabel('因变量 Y') legend('用四阶亚当斯显式公式计算dy/dx=1-(2xy)/(1+x^2), y(0)=0在[0,2]上的数值解','用常用的四阶龙格-库塔公式计算 dy/dx=1-(2xy)/(1+x^2),y(0)=0在[0,2]上的数值解 ','dy/dx=1-(2xy)/(1+x^2)的精确解 y=(x+1/3x^3)/(1+x^2)') wchY=abs(y-Y), wchY1=abs(y-Y1), m=zeros(1,k), for n=1:k,m(1,n)=n-1,end, [m',X,y,Y,Y1,wchY,wchY1], 运行后屏幕显示图和计算结果(略) 。 7.亚当斯隐式公式及其 MATLAB 程序 例 5.5 先利用常用的四阶龙格-库塔公式求初值问题? dy = x ? y , 0 ≤ x ≤ 1, ? ? dx ? y x =0 = 0, ?的几个点的数值解,再利用四阶亚当斯隐式公式求解常微分方程初值问题, h=1/10,并计算它与精确解 y = x ? 1 + e 数值解的图形。?x的误差,在同一图形窗口画出精确解和44 解:编写并保存名为 Adams4y.m 的 MATLAB 程序 function [k,X,Y,wucha,P]=Adams4y(x0,b,y0,h) x=x0; y=y0;p=128; n=fix((b-x0)/h); if n&5, return, X=zeros(p,1); Y=zeros(p,length(y)); f=zeros(p,1); k=1; X(k)=x; Y(k,:)=y'; for k=2:3 x1=x+h/2; x2=x+h/2; x3=x+h;k1=x-y; y1=y+h*k1/2; x=x+h;k2=x1-y1; y2=y+h*k2/2;k3=x2-y2; y3=y+h*k3;k4=x3-y3; y=y+h*(k1+2*k2+2*k3+k4)/6; X(k)=x;Y(k,:)=y; k=k+1; end X,Y, for k=3:n X(k+1)=X(1)+h*k; Y(k+1)=(1/24.9)*(0.24*k+0.12+(Y(k-2:k))'*[-0.1 0.5 22.1]'), k=k+1, end for k=2:n+1 wucha(k)=norm(Y(k)-Y(k-1)); end X=X(1:n+1);Y=Y(1:n+1,:);n=1:n+1, wucha=wucha(1:n,:);P=[n',X,Y,wucha']; 在 MATLAB 工作窗口输入下面的程序 && x0=0;b=1;y0=0;h=1/10; [k,X,Y,wucha,P]= Adams4y (x0,b,y0,h) y=X-1+exp(-X); b31=0; b41=0; b42=0;b43=1; c1=1/6;c2=2/6; c3=2/6;c4=1/6; a2=1/2; a3=1/2; a4=1;b21=1/2; b32=1/2; C=[c1,c2,c3, c4,a2, a3, a4,b21,b31,b32,b41,b42,b43]; [k,X,Y1,fxy,wch,wucha,P]=RK4(@funfcn,@fun,x0,b,C,y0,h) plot(X,Y,'gh',X,Y1,'mp',X,y,'bo'), grid xlabel('自变量 X'), ylabel('因变量 Y') legend('用四阶亚当斯隐式公式计算dy/dx=x-y,y(0)=0在[0,1]45 上的数值解','用常用的四阶龙格-库塔公式计算dy/dx=x-y,y(0)=0在[0,1] 上的数值解',' dy/dx=x-y,y(0)=0的精确解y=x-1+exp(-x)') wchY=abs(y-Y), wchY1=abs(y-Y1), m=zeros(1,k), for n=1:k m(1,n)=n-1 end [m',X,y,Y,Y1,wchY,wchY1], 运行后屏幕显示图和计算结果(略)。三、实验任务1、用改进欧拉法解? y ' = ? xy 2 ? ? y (0) = 22、用龙格-库塔方法求解0≤ x≤5.? y ' = ? xy 2 ? ? y (0) = 20≤ x≤5.四、思考题1、 何谓常微分方程的数值解法?2、 一阶常微分方程初值问题有哪些数值解法?比较各种方法的优缺点。46 实验六、 实验六、非线性方程求根在科学研究与工程技术中常会遇到求解非线性方程的问题。二分法简单易 行,但收敛较慢,仅有线性收敛速度。而且该方法不能用于求偶数重根或复根, 但可以用来确定迭代法的初始值。牛顿法是方程求根中常用的一种迭代方法,它 除了具有简单迭代法的优点外,还具有二阶收敛速度(在单根邻近处)的特点, 但牛顿法对初始值选取比较苛刻(必须充分靠近方程的根) ,否则牛顿法可能不 收敛。弦截法是牛顿法的一种修改,虽然比牛顿法收敛慢,但因它不需计算函数 的导数,故有时宁可用弦截法而不用牛顿法,弦截法也要求初始值必须选取得充 分靠近方程的根,否则也可能不收敛。一、实验目的1、掌握非线性方程(组)的各种解法,包括二分法、牛顿迭代法等,并通过编 程练习与上机运算,体会二分法与牛顿迭代法的不同特点; 2、掌握解非线性方程的弦截法,并与牛顿迭代法作比较;3、 了解各种方法的收敛性。二、算法实例1.二分法及其 MATLAB 程序 function [k,x,wuca,yx]=erfen(a,b,abtol) a(1)=a; b(1)=b; ya=fun(a(1)); yb=fun(b(1)); %程序中调用的fun.m 为函数 if ya* yb&0, disp('注意:ya*yb&0,请重新调整区间端点a和b.'), return end max1=-1+ceil((log(b-a)- log(abtol))/ log(2)); % ceil是向 + ∞ 方向取整 for k=1: max1+1ya=fun(a);yb=fun(b); x=(a+b)/2; yx=fun(x); wuca=abs(b-a)/2; k=k-1; [k,a,b,x,wuca,ya,yb,yx] if yx==0 a=x; b=x; elseif yb*yx&0 b=x;yb= else a=x; ya= end47 if b-a& abtol , return, end end k=max1; yx=fun(x); 2.迭代法的 MATLAB 程序 function [k,piancha,xdpiancha,xk]=diedai1(x0,k) % 输入的量--x0是初始值,k是迭代次数 x(1)=x0; for i=1:k x(i+1)=fun1(x(i));%程序中调用的fun1.m为函数y=φ(x) piancha= abs(x(i+1)-x(i)); xdpiancha=piancha/( abs(x(i+1))+eps); i=i+1;xk=x(i);[(i-1) piancha xdpiancha xk] end if (piancha &1)&(xdpiancha&0.5)&(k&3) disp('请用户注意:此迭代序列发散,请重新输入新的迭代公式') end if (piancha & 0.001)&(xdpiancha& 0.0000005)&(k&3) disp('祝贺您!此迭代序列收敛,且收敛速度较快') end p=[(i-1) piancha xdpiancha xk]'; 例 6.1 求方程 f ( x) = x 2 + 2 x ? 10 的一个正根。 解 在 MATLAB 工作窗口输入程序&& [k,piancha,xdpiancha,xk]= diedai1(2,5) 运行后输出用迭代公式 xk +1 = (10 ? x k2 ) / 2 的结果 [k,piancha,xdpiancha,xk]=1.00 1.00 0.33 3.00 2.00 2.00 5.00 0.00 3.00 4.00 0.90 4.00 4.00 11.00 1.51 -6.00 5.00 11.13 0.97 -18.13 请用户注意:此迭代序列发散,请重新输入新的迭代公式 k=5 , piancha = 11.13 , xdpiancha = 0.97,xk = -18.13 由以上运行后输出的迭代序列与根 x =2.316 624 790 355 40 相差越来越大, 即迭代序列 {xk } 发散,此迭代法就失败.这时偏差 piancha 逐渐增大且偏差的相

我要回帖

更多关于 dy dx怎么求 的文章

 

随机推荐