一、实验目的
本次实验通过上机实习,了解迭代法求解非线性方程数值解的过程和步骤。
二、实验要求
1、用迭代法求方程的根。
要求:确定迭代函数(x),使得x=(x),并求一根。提示:构造迭代函数。
2、对上面的方程用牛顿迭代计算。
3、用割线法求方程在附近的根。误差限为,取。
三、实验内容
1、(1)首先编写迭代函数,记为iterate.m
function y=iterate(x)
x1=g(x); % x为初始值。
n=1;
while(abs(x1-x)>=1.0e-6)&(n<=1000) % 迭代终止的原则。
x=x1;
x1=g(x);
n=n+1;
end
x1 %近似根
n %迭代步数
(2)后编制函数文件(x),记为g.m
function y=g(x)
y=log(3*x.^2);
(3)设初始值为0、3、-3、1000,观察初始值对求解的影响。将结果记录在文档中。
>>iterate(0)
>>iterate(3) 等等
2、(1)首先编制牛顿迭代函数如下,记为newton.m
function y=newton(x0)
x1=x0-fc(x0)/df(x0); % 牛顿迭代格式
n=1;
while(abs(x1-x0)>=1.0e-6)&(n<=1000000) % 迭代终止的原则。
x0=x1;
x1=x0-fc(x0)/df(x0);
n=n+1;
end
x1 %近似根
n %迭代步数
(2)对题目中的方程编制函数文件,记为fc.m
function y=fc(x)
y=3*x.^2-exp(x)
编制函数的导数文件,记为df.m
function y=df(x)
y=6*x-exp(x)
(3)在MATLAB命令窗计算,当设初始值为0时, newton(0);给定不同的初始值,观察用牛顿法求解时所需要的迭代步数,并与上面第一题的迭代步数比较。将得到的结果记录下来。
3、参考上面两题的程序,编写割线法的MATLAB程序,并求解问题的近似根。
四、课外练习
1.迭代函数对收敛性的影响
实验题目
用迭代法求方程的根。
方案1 化方程为等价方程
取初值,迭代10次。
方案2 化为等价方程
取初值,迭代10次,观察其计算值,并加以分析。
2.初值的选取对迭代法的影响
实验题目
用牛顿法求方程在附近的根。
方案1 使用牛顿法并取,由
得
迭代10次。
方案2 取,使用同样的公式
迭代10次,观察比较并分析原因。
3.收敛性与收敛速度的比较
实验题目
求方程的全部实根,.
方案1.用牛顿法求解;
方案2.用简单迭代法;
取相同迭代法初值,比较各方法的收敛速度。
线性方程组的数值解法
实验一
实验目的:
练习引入迭代和矩阵的形式来解决方程组问题。巩固方程与矩阵相互关系的概念。
实验要求:
学会用矩阵的形式来解决方程组问题在计算机上的实现。分析雅可比迭代与其它迭代的异同。
实验内容:
题目:用雅可比迭代求方程组: AX=B
已知:A、B如下:
A = B =
-4 -1 0 -1 0 0 0
-1 4 -1 0 -1 0 5
0 -1 4 0 0 -1 0
-1 0 0 4 -1 0 6
0 -1 0 -1 4 -1 2
0 0 -1 0 -1 4 6
原理: 先找出下三角阵-L,再找出上对角阵-U,还有主对角阵D。
迭代公式x=inv(D)*(L+U)*x+inv(D)*B
设计思想: 利用迭代即可在循环中实现的原则来完成此方程组的求解,所用的迭代公式为:x=inv(D)*(L+U)*x+inv(D)*B
实验二
实验目的:加强编程能力和编程技巧,练习从数值分析的角度看问题。同时用Matlab编写代码。如果编程有困难,就利用已经给出的命令来求解。
实验要求: 用选主元素法和高斯消去法两种方法解方程组。熟悉直接求解的方法。
实验内容:
题目:用选主元素法和高斯消去法求解下列方程组:
已知方程增广矩阵:a =
2 -1 0 0 6
-1 -3 -2 0 1
-1 3 -2 0 0
0 0 -3 5 1
原理: (1)高斯消去法:相对于约当消去法而言,总的来说就是将增广矩阵化为下三角阵。
(2) 选主元素法:相对于高斯消去法的唯一不同是每次将对角线元素化为1前,要先按当前要排列元素所在列大小进行排列。
设计思想: (1)高斯消去法:首先让每一行的元素除以该行的主对角线元素。然后利用此行使位于下一行主对角线以前的元素变为0,依次类推。
(2)选主元素法:在高斯消去法的基础上,每次进行化上三角阵之前,重新排列各方程的位置。
三、课外练习题
1、用雅可比迭代、高斯-塞德尔迭代求方程组:A*X= B
A=[5 2 1 ;-1 4 2 ;2 -3 10], B=[-12 ;20 ;3]
给定初始值 X=[0 ;0 ;0]
并给出满足一定精度时迭代终止的步数。
2、设A=[1 2 3;2 3 4;3 4 7],b=[6 9 14],用直接法求解方程组的解。
3、熟悉矩阵范数的求法,生成n阶的Hilbert矩阵,并计算其条件
数,了解病态矩阵。
附:求解线性方程组的相关资料
一、直接法—矩阵除法
关于线性方程组的直接求解,如高斯消去法、选主元消去法、追赶法等,只需要矩阵左除、右除即可。求Ax=b,一般x=A\\b。
另外,有关直接解法及处理大型矩阵的运算和编程需要,还需要了解几种矩阵分解。
(1)LU分解 lu(A)
(2)Cholesky分解 chol(A)
(3)奇异值分解 svd(A)
(4)QR分解
(5)有时需要用到系数矩阵的对角部分等等,有
上三角变换:由triu实现
下三角变换:由tril实现
对角变换: 由diag实现
二、迭代解法的几种形式
1、Jacobi迭代
2、G-S迭代
3、SOR迭代
插值法
一、实验目的
本次实验通过上机实习,了解函数逼近的拉格朗日插值、分段插值、三次样条插值、最小二乘算法等。分析并比较它们的优缺点,深刻理解这些算法。
二、实验要求
1、已知f(xn)=yn ,n=0,1,2,…,N;求通过这N+1个节点{(xn,yn)| n=0,1,2,…,N }的插值函数Pn (x)。 设计出具体的程序,使用拉格朗日插值算法绘制出相应的插值曲线。对于给出的实例,理解Lagrange插值的龙格现象。并熟悉分段线性插值算法。
2、使用Matlab已有的函数,掌握分段线性插值、样条插值、最小二乘拟合等。
三、实验内容
1、Lagrange插值多项式
实验题:取函数
目的:学会Lagrange插值算法,并应用算法于实际问题;观察 Lagrange插值的龙格现象。
它在区间上的各阶导数存在,但在此区间上取n个节点所构造的 Lagrange插值多项式在全区间内并非都收敛,而且分散的很厉害.
要求:取n=10,用Lagrange插值法进行插值计算.在同一图形窗口中比较原函数和插值函数.应该可以看到,插值曲线已经严重偏离了原曲线。
2、为了解决上面这个问题,引入分段线性插值。用interp1函数来计算上例的函数插值。interp1函数具体用法可以参考《数学实验与软件》或Matlab帮助文件。
3、熟悉样条插值。
实验题:给定如下数据,试求满足自然边界条件的三次样条插值函数:
x=28.7,28,29,30,对应的函数值为4.1,4.3,4.1,3.0,
在图形窗口中给出拟合图形。
4、曲线拟合——最小二乘法拟合
在Matlab中实现最小二乘法拟合可以利用polyfit函数进行多项式拟合。
实验题:设y=span{1,x,x2},用最小二乘法拟合如下数据:
x=0.5, 1.0, 1.5, 2.0, 2.5, 3.0;
y=1.75,2.45,3.81,4.80,8.00,8.60;
并给出拟合图形。
四、课外练习题
给定数据x=1:6; y=[16 18 21 17 15 12];将 Lagrange插值、样条插值、线性插值曲线在一个图形窗口中用不同的颜色显示出来。
数值积分
一、实验目的
(1)学会复化梯形、复化Simpson、复化Cotes求积公式的编程与使用。
(2)了解高精度求积公式的方法,如Gauss求积公式。
(3)学会运用Matlab提供的积分函数求给定区间上的积分。
二、实验要求
(1)按照题目要求完成实验内容。
(2)写出相应的Matlab程序。
(3)给出实验结果,与精确积分值相比较。
三、实验内容
1、用复化梯形公式、复化Simpson公式计算下列积分,并与精确值比较,探讨两种积分公式的精度。
(1),将区间8等分。
(2),将区间4等分。
(3),将区间6等分
2、用复合梯形公式、复合抛物线公式、龙贝格公式求定积分
;
.
要求绝对误差为,将计算结果与精确解做比较,并对计算结果进行分析。
3、了解高精度求积公式的方法,如Gauss求积公式,试按照教材内容求出近似积分值。
附:数值积分的相关资料
一、关于数值积分,Matlab有以下函数:
trapz 梯形求积法
quad Simpson求积法
quadl Lobatto求积法
dblquad 二重积分
triplequad 三重积分
本节课主要介绍前两种函数的用法,另外的函数同学们有兴趣,可以查看帮助文件了解其用法。
(1) trapz 函数 梯形求积法
例1:试取9个节点分别用复化梯形公式计算.
解:输入x=0:1/8:1;
y=1./(1+x.^2);
I=trapz(x,y)
得到 I=0.7847
(2) quad 函数
quad ()函数采用自适应步长的Simpson求积法,其应用格式为:
I=quad(fun,a,b,tol)
其中fun是被积函数,有两种形式,第一种用inline()命令定义函数,第二种是写出外部函数fun.m;a,b是区间两端点;tol是积分的精度要求,缺省值为10-6
例2:用quad 函数求例1中的积分值,精度要求为10-6
解:输入 fun=inline(‘1./(1+x.^2)’) ; I=quad(fun,0,1)
得到I=0.7854
或者编写外部函数fun.m
function y=fun(x)
y=1./(1+x.^2);
再使用quad ()函数求积分,有I=quad(@fun,0,1)
二、编写复化求积公式的程序来求近似积分值。
1、复化梯形法
将区间[a,b]N等分,子区间的长为,复化梯形求积公式为:
按照上式编写复化梯形求积函数。(函数名:T_quad.m)
function I=T_quad(x,y)
n=length(x);m=length(y);
if n~=m
error('The engths of X and Y must be equal');
return;
end
h=(x(n)-x(1))/(n-1);
a=[1 2*ones(1,n-2) 1];
I=h/2*sum(a.*y);
例:用复化梯形公式求积分,在积分区间中点与点的间隔取为0.1。
解:输入x=-1:0.1:1;
y=exp(-x.^2);
I=T_quad(x,y)
得到I=1.4924
2、复化Simpson法
将区间[a,b]N等分,子区间的长为,在每个子区间上使用Simpson公式,还需要将每个子区间二等分,因此有2N+1个分点。复化Simpson求积公式为:
按照上式编写复化梯形求积函数。(函数名:S_quad.m)
function I=S_quad(x,y)
n=length(x);m=length(y);
if n~=m
error('The engths of X and Y must be equal');
return;
end
if rem(n-1,2)~=0 %如果n-1不能被2整除,则调用复化梯形公式
I=T_quad(x,y);
Return;
end
N=(n-1)/2;h=(x(n)-x(1))/N;a=zeros(1,n);
for k=1:N
a(2*k-1)=a(2*k-1)+1; a(2*k)=a(2*k)+4;
a(2*k+1)=a(2*k+1)+1;
end
I=h/6*sum(a.*y);
例:用复化Simpson公式求积分,在积分区间中点与点的间隔
取为0.1。
解:输入x=-1:0.1:1;
y=exp(-x.^2);
I=S_quad(x,y)
得到I=1.4936下载本文