数值分析算法的Matlab实现及应用
- 格式:ppt
- 大小:2.43 MB
- 文档页数:49
佛山科学技术学院实 验 报 告课程名称 数值分析 实验项目 插值法与数据拟合 专业班级 机械工程 姓 名 余红杰 学 号 10 指导教师 陈剑 成 绩 日 期 月 日一、实验目的1、学会Lagrange 插值、牛顿插值和三次样条插值等基本插值方法;2、讨论插值的Runge 现象3、学会Matlab 提供的插值函数的使用方法,会用这些函数解决实际问题。
二、实验原理1、拉格朗日插值多项式2、牛顿插值多项式3、三次样条插值 三、实验步骤1、用MATLAB 编写独立的拉格朗日插值多项式函数2、用MATLAB 编写独立的牛顿插值多项式函数3、用MATLAB 编写独立的三次样条函数(边界条件为第一、二种情形)4、已知函数在下列各点的值为:根据步骤1,2,3编好的程序,试分别用4次拉格朗日多项式4()L x 、牛顿插值多项式4()P x 以及三次样条函数()S x (自然边界条件)对数据进行插值,并用图给出 {(,),0.20.08,0,1,2,,10i i i x y x i i =+=},4()L x 、4()P x 和()S x 。
5、在区间[-1,1]上分别取10,20n =用两组等距节点对龙格函数21(),(11)125f x x x=-≤≤+作多项式插值,对不同n 值,分别画出插值函数及()f x 的图形。
6、下列数据点的插值可以得到平方根函数的近似,在区间[0,64]上作图。
(1)用这9个点作8次多项式插值8()L x 。
(2)用三次样条(第一边界条件)程序求()S x 。
7、对于给函数21()125f x x =+在区间[-1,1]上取10.2(0,1,,10)i x i i =-+=,试求3次曲线拟合,试画出拟合曲线并打印出方程,与第5题的结果比较。
四、实验过程与结果:1、Lagrange 插值多项式源代码:function ya=lag(x,y,xa) %x 所有已知插值点 %y 插值点对应函数值 %xa 所求点,自变量 %ya 所求点插值估计量 ya=0; mu=1; %初始化%循环方式求L 系数,并求和: for i = 1:length(y) for j = 1:length(x) if i ~= jmu = mu * (xa - x(j) ) / ( x(i) - x(j) ); else continue end endya = ya + y(i) * mu ; mu = 1; end2、Newton 源代码:function ya = newton(x,y,xa) %x 所有已知插值点 %y 插值点对应函数值 %xa 所求点,自变量 %ya 所求点插值估计量 %建立系数零矩阵D 及初始化:D = zeros(length(x)-1);ya = y(1);xi = 1;%求出矩阵D,该矩阵第一行为牛顿插值多项式系数:for i=1:(length(x)-1)D(i,1) = (y(i+1) -y(i))/(x(i+1) -x(i));endfor j=2:(length(x)-1)for i=1:(length(x)-j)D(i,j) = (D(i+1,j-1) - D(i,j-1)) / (x(i+j) - x(i)); endend%xi为单个多项式(x-x(1))(x-x(2))...的值for i=1:(length(x)-1)for j=1:ixi = xi*(xa - x(j));endya = ya + D(1,i)*xi;xi = 1;end3、三次样条插值多项式(1)(第一边界条件)源代码:function y=yt1(x0,y0,f_0,f_n,x) _____________(1)%第一类边界条件下三次样条插值;%xi 所求点;%yi 所求点函数值;%x 已知插值点;%y 已知插值点函数值;%f_0左端点一次导数值;%f_n右端点一次导数值;n = length(x0);z = length(y0);h = zeros(n-1,1);k=zeros(n-2,1);l=zeros(n-2,1);S=2*eye(n);for i=1:n-1h(i)= x0(i+1)-x0(i);endfor i=1:n-2k(i)= h(i+1)/(h(i+1)+h(i));l(i)= 1-k(i);end%对于第一种边界条件:k = [1;k]; _______________________(2)l = [l;1]; _______________________(3)%构建系数矩阵S:for i = 1:n-1S(i,i+1) = k(i);S(i+1,i) = l(i);end%建立均差表:F=zeros(n-1,2);for i = 1:n-1F(i,1) = (y0(i+1)-y0(i))/(x0(i+1)-x0(i));endD = zeros(n-2,1);for i = 1:n-2F(i,2) = (F(i+1,1)-F(i,1))/(x0(i+2)-x0(i));D(i,1) = 6 * F(i,2);end%构建函数D:d0 = 6*(F(1,2)-f_0)/h(1); ___________(4)dn = 6*(f_n-F(n-1,2))/h(n-1); ___________(5)D = [d0;D;dn]; ______________(6)m= S\D;%寻找x所在位置,并求出对应插值:for i = 1:length(x)for j = 1:n-1if (x(i)<=x0(j+1))&(x(i)>=x0(j))y(i) =( m(j)*(x0(j+1)-x(i))^3)/(6*h(j))+...(m(j+1)*(x(i)-x0(j))^3)/(6*h(j))+...(y0(j)-(m(j)*h(j)^2)/6)*(x0(j+1)-x(i))/h(j)+... (y0(j+1)-(m(j+1)*h(j)^2)/6)*(x(i)-x0(j))/h(j) ; break;else continue;endendend(2)(自然边界条件)源代码:仅仅需要对上面部分标注的位置做如下修改:__(1):function y=yt2(x0,y0,x)__(2):k=[0;k]__(3):l=[l;0]__(4)+(5):删除—(6):D=[0:D:0]4、——————————————PS:另建了一个f方程文件,后面有一题也有用到。
数值分析第四章外推法计算数值微分MATLAB计算实验报告数值分析MATLAB计算实验报告姓名班级学号⼀、实验名称⽤MATLAB编程实现数值微分的外推法计算。
⼆、实验⽬的1.掌握数值微分和定义和外推法的计算过程;2.了解数值微分外推法的计算⽅法并且编写出与其算法对应的MATLAB程序代码;3.体会利⽤MATLAB软件进⾏数值计算。
三、实验内容⽤外推法计算f(x)=x2e?x在x=0.5的导数。
四、算法描述1.命名函数。
2.如果输⼊未知数少于四个,默认精度10^-33.描述T表矩阵坐标4.依次赋值计算 T表第⼀列5.根据数值微分计算公式求出T表矩阵的值6.若达到精度则运算结束,若未达到循环计算7.输出T表,得出的值就是导数值五、实验结果六、实验结果分析此实验通过MATLAB实现外推法数值微分计算,得到相应的数据,⽅便对数据进⾏分析。
从结果可以看出,当步长h=0.025时⽤中点微分公式只有3位有效数字,外推⼀次达到5位有效数字,外推两次达到9位有效数字。
七、附录(程序)function g=waituifa(fname,x,h,e)if nargin<4,e=1e-3;end;i=1;j=1;G(1,1)=(feval(fname,x+h)-feval(fname,x-h))/(2*h);G(i+1,1)=(feval(fname,x+h/2)-feval(fname,x-h/2))/h;G(i+1,j+1)=(4^j*G(i+1,j)-G(i,j))/(4^j-1);while abs(G(i+1,i+1)-G(i+1,i))>ei=i+1;G(i+1,1)=(feval(fname,x+h/2^i)-feval(fname,x-h/2^i))/(2*h/2^i); for j=1:iG(i+1,j+1)=((4^j)*G(i+1,j)-G(i,j))/(4^j-1);endendGg=G(i+1,i+1);。
(Hilbert 矩阵)病态线性方程组的求解理论分析表明,数值求解病态线性方程组很困难。
考虑求解如下的线性方程组的求解Hx = b ,期中H 是Hilbert 矩阵,()ij n n Hh ,11ij h i j ,i ,j = 1,2,…,n 1.估计矩阵的2条件数和阶数的关系2.对不同的n ,取(1,1,,1)nx K ?,分别用Gauss 消去,Jacobi 迭代,Gauss-seidel 迭代,SOR 迭代和共轭梯度法求解,比较结果。
3.结合计算结果,试讨论病态线性方程组的求解。
第1小题:condition.m %第1小题程序t1=20;%阶数n=20x1=1:t1;y1=1:t1;for i=1:t1H=hilb(i);y1(i)=log(cond(H));endplot(x1,y1);xlabel('阶数n');ylabel('2-条件数的对数(log(cond(H))');title('2-条件数的对数(log(cond(H))与阶数n 的关系图');t2=200;%阶数n=200x2=1:t2;y2=1:t2;for i=1:t2H=hilb(i);y2(i)=log(cond(H));endplot(x2,y2);xlabel('阶数n');ylabel('2-条件数的对数(log(cond(H))');title('2-条件数的对数(log(cond(H))与阶数n 的关系图');画出Hilbert 矩阵2-条件数的对数和阶数的关系n=200时n=20时从图中可以看出,1)在n小于等于13之前,图像近似直线log(cond(H))~1.519n-1.8332)在n大于13之后,图像趋于平缓,并在一定范围内上下波动,同时随着n的增加稍有上升的趋势第2小题:solve.m%m第2小题主程序N=4000;xGauss=zeros(N,1);xJacobi=zeros(N,1);xnJ=zeros(N,1);xGS=zeros(N,1);xnGS=zeros(N,1);xSOR=zeros(N,1);xnSOR=zeros(N,1);xCG=zeros(N,1);xnCG=zeros(N,1);for n=1:N;x=ones(n,1);t=1.1;%初始值偏差x0=t*x;%迭代初始值e=1.0e-8;%给定的误差A=hilb(n);b=A*x;max=100000000000;%可能最大的迭代次数w=0.5;%SOR迭代的松弛因子G=Gauss(A,b);[J,nJ]=Jacobi(A,b,x0,e,max);[GS,nGS]=G_S(A,b,x0,e,max);[S_R,nS_R]=SOR(A,b,x0,e,max,w);[C_G,nC_G]=CG(A,b,x0,e,max);normG=norm(G'-x);xGauss(n)=normG;normJ=norm(J-x);nJ;xJacobi(n)=normJ;xnJ(n)=nJ;normGS=norm(GS-x);nGS;xGS(n)=normGS;xnGS(n)=nGS;normS_R=norm(S_R-x);nS_R;xSOR(n)=normS_R;xnSOR(n)=nS_R;normC_G=norm(C_G-x);nC_G;xCG(n)=normC_G;xnCG(n)=nC_G;endGauss.m%Gauss消去法function x=Gauss(A,b)n=length(b);l=zeros(n,n);x=zeros(1,n);%消去过程for i=1:n-1for j=i+1:nl(j,i)=A(j,i)/A(i,i);for k=i:nA(j,k)=A(j,k)-l(j,i)*A(i,k);endb(j)=b(j)-l(j,i)*b(i);endend%回代过程x(n)=b(n)/A(n,n);for i=n-1:-1:1c=A(i,:).*x;x(i)=(b(i)-sum(c(i+1:n)))/A(i,i);endJacobi.m%Jacobi迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m 可能最大的迭代次数function [x,n]=Jacobi(A,b,x0,e,m)n=length(A);D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);B=D\(L+U);f=D\b;x=B*x0+f;n=1;while norm(x-x0)>ex0=x;x=B*x0+f;n=n+1;if n>mdisp('Jacobi迭代次数过多,迭代可能不收敛');break;endendG_S.m%Gauss-Seidel迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数function [x,n]=G_S(A,b,x0,e,m)n=length(A);D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);B=(D-L)\U;f=(D-L)\b;x=B*x0+f;n=1;while norm(x-x0)>ex0=x;x=B*x0+f;n=n+1;if n>mdisp('Gauss-Seidel迭代次数过多,迭代可能不收敛');break;endendSOR.m%SOR超松弛迭代,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数,w松弛因子function [x,n]=SOR(A,b,x0,e,m,w)n=length(A);D=diag(diag(A));U=-triu(A,1);L=-tril(A,-1);B=(D-w*L)\((1-w)*D+w*U);f=(D-w*L)\b*w;x=B*x0+f;n=1;while norm(x-x0)>ex0=x;x=B*x0+f;n=n+1;if n>mdisp('SOR超松弛迭代次数过多,迭代可能不收敛');break;endendCG.m%CG共轭梯度法,x0表示迭代初值,e表示允许误差(迭代停止条件),n表示迭代次数,m可能最大的迭代次数function [x,n]=CG(A,b,x0,e,m)r=b-A*x0;p=r;alpha=(r'*r)/(p'*(A*p));x=x0+alpha*p;r1=b-A*x;n=1;while norm(r1)>ebelta=(r1'*r1)/(r'*r);p=r1+belta*p;r=r1;x0=x;alpha=(r'*r)/(p'*(A*p));x=x0+alpha*p;r1=b-A*x;n=n+1;if n>mdisp('CG共轭梯度法迭代次数过多,迭代可能不收敛');break;endend。
第2章牛顿插值法实现参考文献:[1]岑宝俊. 牛顿插值法在凸轮曲线修正设计中的应用[J]. 机械工程师,2009,10:54-55.求牛顿插值多项式和差商的MA TLAB 主程序:function[A,C,L,wcgs,Cw]=newpoly(X,Y)n=length(X);A=zeros(n,n);A(:,1) =Y';s=0.0;p=1.0;q=1.0;c1=1.0;for j=2:nfor i=j:nA(i,j)=(A(i,j-1)-A(i-1,j-1))/(X(i)-X(i-j+1));endb=poly(X(j-1));q1=conv(q,b);c1=c1*j;q=q1;endC=A(n,n);b=poly(X(n));q1=conv(q1,b);for k=(n-1):-1:1C=conv(C,poly(X(k)));d=length(C);C(d)=C(d)+A(k,k);endL(k,:)=poly2sym(C);Q=poly2sym(q1);syms Mwcgs=M*Q/c1;Cw=q1/c1;(1)保存名为newpoly.m 的M 文件(2)输入MA TLAB 程序>> X=[242,243,249,250];>> Y=[13.681,13.526,13.098,13.095];>> [A,C,L,wcgs,Cw]=newpoly(X,Y)输出3阶牛顿插值多项式L 及其系数向量C 差商的矩阵A ,插值余项wcgs 及其)()()1(ξ+n n f x R 的系数向量Cw 。
A =13.6810 0 0 013.5260 -0.1550 0 013.0980 -0.0713 0.0120 013.0950 -0.0030 0.0098 -0.0003C =1.0e+003 *-0.0000 0.0002 -0.0551 4.7634L =- (23*x^3)/84000 + (2981*x^2)/14000 - (7757472138947345*x)/140737488355328 + 5237382665812919/1099511627776wcgs =(M*(x^4 - 984*x^3 + 363071*x^2 - 59535444*x + 3660673500))/24Cw =1.0e+008 *0.0000 -0.0000 0.0002 -0.0248 1.5253输入MATLAB程序>> x=244;>> y=- (23*x^3)/84000 + (2981*x^2)/14000 - (7757472138947345*x)/140737488355328 + 5237382665812919/1099511627776y =13.3976输入MATLAB程序>> x=[244,245,246,247,248];>> y=- (23.*x.^3)./84000 + (2981.*x.^2)./14000 - (7757472138947345.*x)./140737488355328 + 5237382665812919./1099511627776y =13.3976 13.2943 13.2143 13.1560 13.1178第4章 高斯-勒让德积分公式实现用高斯-勒让德积分公式计算dx e I x ⎰--=112221π,取代数精度为3和5,再根据截断误差公式写出误差公式,并将计算结果与精确值进行比较。
matlab语言及应用Matlab是一种高级的、交互式的数学和科学计算语言。
有别于其他编程语言,Matlab语言主要用于数值分析、统计分析和数据可视化等领域。
在科研、工程应用中有着广泛的使用。
一、Matlab的基本语法和函数Matlab的基本语法和其他编程语言非常相似,可以进行变量的定义、条件判断、循环等操作。
同时,Matlab提供了非常丰富的各种函数库,可以快速、简单地实现很多数值计算和科学计算任务。
例如,Matlab中可以运用线性代数的知识,使用矩阵来进行数值计算。
二、Matlab的应用场景1.信号处理Matlab支持音频信号处理、图像处理、视频处理等领域,可以进行数据前处理、数据去噪等相关处理操作。
在语音识别、图像识别和计算机视觉等领域都有着广泛的应用。
2.数据可视化Matlab拥有很多绘图函数和工具箱,可以绘制二维和三维的图像,制作图像、视频和动画,帮助用户更好地理解和分析数据。
3.机器学习Matlab提供了非常丰富的机器学习工具箱,例如:神经网络、决策树等,可以用于深度学习、聚类分析等领域。
三、Matlab的优势1.易于学习和入门Matlab提供了很多在线工具,包括文档、范例、演示程序等等。
特别是对于新手,可以通过在线课程、教程、交互计算工具等多种方式进行学习。
2.高效的处理能力和速度Matlab内部使用了许多优化算法,可以通过并行计算和高效的内存管理来实现快速的计算和分析。
3.丰富的工具箱和功能Matlab提供了丰富的工具箱和函数库,以满足不同领域用户的需求。
四、Matlab的未来随着计算机运算能力的不断提高,以及科学技术的迅速发展,Matlab 的应用范围也在不断扩大并且深入到各个领域。
Matlab的发展方向将更多地集中在人工智能、深度学习、大数据分析等方面,对于工业、金融、科研学术等领域都有着广泛的应用前景。
总之,Matlab是一种高度可扩展的语言,在数值计算、科学计算和工程应用中有着广泛的应用。
matlab语言及应用案例
Matlab(矩阵实验室)是一种优秀的数学建模软件,可以用来做复杂的科学计算、数据处理和模拟分析。
它是目前应用最为广泛的数值计算工具之一,被各类科学工作者和工程师们所利用,并且在实际应用中发挥了重要作用。
一、Matlab语言概述
Matlab语言是一种通用的高级编程语言,该语言主要用于矩阵、向量和数组处理,它具有优美的程序结构、自动内存管理和其他丰富的编程特性,是现代数值分析的理想工具。
Matlab的特点之一是由多种命令集构成,可以做出计算、数据处理、可视化和模拟等等功能,其语法极简洁,正则表达式的使用让操作变得更加直观,还可以通过自定义函数来节约代码量。
二、Matlab应用案例
Matlab可用于很多领域,包括信号处理、图像处理和机器学习等,在实际应用中也取得了不小的成功。
(1)信号处理
Matlab可以快速处理数字信号,可以检测信号的锯齿状和抖动,并用滤波器进行消除,也可以分析信号的频谱,提取其中有用的特征,进一步用于信号识别等操作。
(2)图像处理
Matlab提供了大量的图像处理函数,以及相应的图像处理工具,可以处理图像的灰度变换、去噪处理等,也可以实现图像分割、特征
提取和图像分类等操作。
(3)机器学习
Matlab拥有强大的机器学习功能,可以用来实现数据挖掘、模式识别和人工神经网络的原型设计等,成功应用于停车场感知和智能控制等领域。
三、结论
Matlab语言是一种功能强大的编程语言,它可以用于多种应用场景,并取得了巨大的成功。
今天,Matlab仍是数学建模、可视化、数据处理和机器学习领域的首选工具,并将继续发挥重要作用。