西安交大 计算方法B上机作业

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计算方法(B)上机作业一、三次样条拟合某通信公司在一次施工中,需要在水面宽度为20米的河沟底部沿直线走向铺设一条沟底光缆。在铺设光缆之前需要对沟底的地形进行初步探测,从而估计所需光缆的长度,为工程预算提供依据。已探测到一组等分点位置的深度数据(单位:米)如下表所示:分点0123456深度9.018.967.967.978.029.0510.13分点78910111213深度11.1812.2613.2813.3212.6111.2910.22分点14151617181920深度9.157.907.958.869.8110.8010.93(1)请用合适的曲线拟合所测数据点;(2)估算所需光缆长度的近似值,并作出铺设河底光缆的曲线图;解:1、算法实现的思想及依据题目(1)为曲线拟合问题多项式插值、分段插值和最小二乘法。多项式插值,随着插值数据点的数目增多,误差也会随之增大,因此不选用。最小二乘法适于数据点较多的场合,在此也不适用。故选用分段插值。分段插值又分为分段线性插值、分段二次插值、三次样条插值及更高阶的多项式插值。由本题的物理背景知,光缆正常工作时各点应该是平滑过渡,因此至少选用三次样条插值法。对于更高阶的多项式插值,由于“龙格现象”而不选用。题目(2)求光缆长度,即求拟合曲线在0到20的长度,对弧长进行积分即可。光缆长度的第一型线积分表达式为191'201()kkklfxdx。2、算法实现的结构参考教材给出的SPLINEM算法和TTS算法,在选定边界条件和选定插值点等距分布后,可以先将数据点的二阶差商求出来并赋值给右端向量d,再根据TSS解法求解M。光缆长度的第一型线积分表达式为191'201()kkklfxdx。3、程序运行结果及分析图1.1三种边界条件下三次样条插值图1.2光缆长度4、MATLAB代码:1)自己编程实现代码clear;clc;I=input('你想使用第几种边界条件?请输入1、2、3之一:');x=0:20;y=[9.018.967.967.978.029.0510.1311.1812.2613.2813.3212.6111.2910.229.157.907.958.869.8110.810.93];plot(x,-y,'k.','markersize',15)%y为深度,取负号holdon%%计算一阶差商y1=ones(1,21);fori=2:1:21y1(i)=(y(i)-y(i-1))/(x(i)-x(i-1));end%%计算二阶差商y2=ones(1,21);fori=3:1:21y2(i)=(y1(i)-y1(i-1))/(x(i)-x(i-2));end%%计算三阶差商y3=ones(1,21);fori=4:1:21y3(i)=(y2(i)-y2(i-1))/(x(i)-x(i-3));end%%选择边界条件(I)ifI==1d(1)=0;d(21)=0;a(21)=0;c(1)=0;%第一个点和最后一个点的二阶差商为0endifI==2d(1)=6*y1(1);d(21)=-6*y1(21);a(1)=1;c(1)=1;endifI==3d(1)=-12*y3(1);d(21)=-12*y3(21);a(21)=-2;c(1)=-2;%endfori=2:20d(i)=6*y2(i+1);end%%构造带状矩阵求解(追赶法)b=2*ones(1,21);a=0.5*ones(1,21);%a(21)=-2;c=0.5*ones(1,21);%c(1)=-2;u(1)=b(1);r(1)=c(1);%%追yz(1)=d(1);fori=2:21l(i)=a(i)/u(i-1);u(i)=b(i)-l(i)*r(i-1);r(i)=c(i);yz(i)=d(i)-l(i)*yz(i-1);end%%赶xg(21)=yz(21)/u(21);fori=20:-1:1xg(i)=(yz(i)-r(i)*xg(i+1))/u(i);endM=xg;%%所有点的二阶导数值%%求函数表达式并积分t=1;h=1;N=1000x1=0:20/(N-1):20;length=0;fori=1:Nforj=2:20ifx1(i)=x(j)t=j;break;elset=j+1;endendf1=x(t)-x1(i);f2=x1(i)-x(t-1);S(i)=(M(t-1)*f1^3/6/h+M(t)*f2^3/6/h+(y(t-1)-M(t-1)*h^2/6)*f1+(y(t)-M(t)*h^2/6)*f2)/h;Sp(i)=-M(t-1)*f1^2/2/h+M(t)*f2^2/2/h+(y(t)-y(t-1))/h-(M(t)-M(t-1))*h/6;length(i+1)=sqrt(1+Sp(i)^2)*(20/(N-1))+length(i);%第一类线积分endfigure(1);plot(x1,-S,'r-')%深度曲线griddisp(['第',num2str(I),'种边界条件下长度',num2str(length(N+1)),'米'])axisfill;xlabel('测点/米');ylabel('深度/米');title('三次样条曲线拟合');legend('数据点','拟合曲线',3);二、最小二乘近似假定某天的气温变化记录如下表所示,试用数据拟合的方法找出这一天的气温变化的规律;试计算这一天的平均气温,并试估计误差。时刻0123456789101112平均气温15141414141516182020232528时刻131415161718192021222324平均气温313431292725242220181716解:1、算法实现的思想及依据本题共有25个数据点,数据量较大,因此选用多项式插值会导致较大的误差,插值样条函数虽然有较好的数值性质,但是Mi的计算量不小,而且没有统一的公式来表示。另外,本题要求找出温度变化规律,插值方法要求p(x)必须通已知数据点,只会导致拟合曲线失去本有的数据所表示的规律;从表中的数据点可以看出,温度并不准确(温度只测量到整数位),因此没有必要要求拟合曲线通过数据点。因此,选取最小二乘近似。2、算法实现的结构算法参考课本LSS算法。利用已有数据来生成了G,将y作为其最后一列(第n+1列)存放。先形成矩阵Qk,再变换Gk-1到Gk;求解三角方程Rx=h1;最后根据定义计算误差。平均温度采用数据点相加求和求平均,避免数值积分的繁琐。3、程序运行结果及分析4、MATLAB代码%%最小二乘法拟合气温变化规律clear;clc;x=0:24;y=[15,14,14,14,14,15,16,18,20,20,23,25,28,31,34,31,29,27,25,24,22,20,18,17,16];N=length(y);sum=0;%求一天的平均温度averagefori=1:Nsum=sum+y(i);endaverage=sum/N;fprintf('平均温度T为:%f\n',average);h=input('请输入多项式近似函数最高项的次数h:');n=h+1;%%参课本LSS算法G=zeros(N,n+1);%建立一个N行,n+1列的矩阵G%%生成矩阵G各个元素fori=1:n%矩阵G中前N列元素forj=1:NG(j,i)=x(1,j)^(i-1);endendfori=1:1:N%将y作为矩阵G中第(N+1)列元素G(i,n+1)=y(i);end%%形成矩阵Qka=zeros(1,n);%建立存放σ的矩阵ab=zeros(1,N);%建立存放β的矩阵bfork=1:nfori=k:Na(k)=G(i,k)^2+a(k);enda(k)=-sign(G(k,k))*(sqrt(a(k)));w(k)=G(k,k)-a(k);%建立存放ω的矩阵wforj=k+1:1:Nw(j)=G(j,k);endb(k)=a(k)*w(k);%%变换Gk-1到GkG(k,k)=a(k);forj=k+1:1:n+1sum_wg=0;fori=k:Nsum_wg=w(i)*G(i,j)+sum_wg;endt=sum_wg/b(k);fori=k:1:NG(i,j)=t*w(i)+G(i,j);endendend%%解三角方程Rx=h1X(n)=G(n,n+1)/G(n,n);fori=(n-1):-1:1sum_gx=0;forj=i+1:nsum_gx=G(i,j)*X(j)+sum_gx;endX(i)=(G(i,n+1)-sum_gx)/G(i,i);sum_gx=0;end%%参数X(i)的回代p=zeros(1,N);%建立一维最小二乘近似数组p(x)forj=1:Nfori=1:np(j)=p(j)+X(i)*x(j)^(i-1);endend%%显示拟合函数各阶系数disp('各项拟合系数为:');fori=1:ndisp([num2str(i-1),'次项系数',num2str(X(i))]);end%%误差E2求解E2=0;%多项式计算误差fori=n+1:NE2=G(i,n+1)^2+E2;endE2=sqrt(E2);disp('误差大小为');disp(E2);%%绘制曲线,显示结果plot(x,y,'r*',x,p,'k-','LineWidth',1.5);xlabel('时刻/h');ylabel('平均气温/°C');title('最小二乘法拟合的气温变化曲线图')xlim([024]);legend('数据点','拟合曲线')三、线性方程组求解。(1)编写程序实现大规模方程组的高斯消去法程序,并对所附的方程组进行求解。所附方程组的类型为对角占优的带状方程组。(2)针对本专业中所碰到的实际问题,提炼一个使用方程组进行求解的例子,并对求解过程进行分析、求解。解:1、算法实现的思想及依据和算法实现的结构高斯消去法主要分为两大步骤,即消去过程和回带过程。算法借鉴课本GAUSSPP算法。由于题目中给出的系数矩阵是对角占优的矩阵,因此可以不选主元直接进行高斯消去;另外在非压缩格式带状矩阵中,存在着大量的非零元素,非零元素的运算毫无意义并且占用大量机器资源和时间,因此对课本中给出的GAUSSPP算法进行优化。对于n阶、上带宽q、下带宽p的带状矩阵,选取p与q较大者(赋值给c),在第1行到第n-c行,第k列,只需要计算1,akk到,kcka,每一行也只需从,1aik到,aikq(i从k+1到k+q);在第n-c+1到n行,第k列,计算1,akk到,nka,每一行只需要从,1ika计算到,ina(i从k+1到n),这样可以减小运算量。对于压缩带状矩阵,其消去过程和非压缩带状矩阵基本一致,不同之处在于:压缩格式忽略了零元素,因此需要建立压缩格式带状矩阵与非压缩格式带状矩阵的对应关系。主元素对应关系:B(k,p+1)=A(k,k)(B是压缩格式带状矩阵,A是非压缩格式带状矩阵),编写程序时需要根据此关系建立其元素间的对应关系。2、程序运行结果对比及分析图3.1求解dat61文件结果图3.2求解dat62文件结果图3.3求解dat63文件结果图3.4求解dat64文件结果3、Matlab代码`%%改进前的程序clc;cleardata_fname='dat64.dat';%文件名file_id=fopen(data_fname,'rb');%以二进制格式打开源文件Id=fread(file_id,1,'uint32');%数据文件标示id=dec2hex(Id);ver=fread(file_id,1,'int32');%版本号n=fread(file_id,1,'int32');%方程组的阶数p=fread(file_id,1,'int32');%带状矩阵上带宽q=fread(file_id,1,'int32');%带状矩阵下带宽%%确定数据格式ifstrcmp(dec2hex(ver),'10

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功