计算方法B 上机报告第1题某通信公司在一次施工中,需要在水面宽度为20米的河沟底部沿直线走向铺设一条沟底光缆。
在铺设光缆之前需要对沟底的地形进行初步探测,从而估计所需光缆的长度,为工程预算提供依据。
已探测到一组等分点位置的深度数据(单位:米)如下表所示:(1)请用合适的曲线拟合所测数据点;(2)估算所需光缆长度的近似值,并作出铺设河底光缆的曲线图; 问题分析和算法思想:本题的主要目的是对21个测量数据进行拟合,同时对拟合曲线进行线积分即可得到河底光缆长度的近似值,可以用的插值方法很多:多项式插值、Lagrange 插值、Newton 插值、三次样条插值等。
由于数值点较多时,采用高次多项式插值将产生很大的误差,用拉格朗日插值多项式会出现龙格现象。
故为了将所有的数据点都用上,且题中光缆为柔性,可光滑铺设于水底,鉴于此特性,采用三次样条插值的方法较为合适。
计算光缆长度近似值,只需将每两点之间的距离算出,然后依次相加,所得的折线长度,即为光缆长度的近似值。
光缆长度计算公式:191k kk l +===∑⎰⎰⎰算法结构:三次样条算法结构见《计算方法教程》P110。
源程序: clear;clc; x=0:20;y=[9.01 8.96 7.96 7.97 8.02 9.05 10.13 11.18 12.26 13.28 13.32 12.61 11.29 10.22 9.15 7.90 7.95 8.86 9.81 10.80 10.93];d=y;plot(x,y,'k.','markersize',15)hold on%%%计算二阶差商for k=1:2for i=21:-1:(k+1)d(i)=(d(i)-d(i-1))/(x(i)-x(i-k));endend%%%假定d的边界条件,采用自然三次样条for i=2:20d(i)=6*d(i+1);endd(1)=0;d(21)=0;%%%追赶法求解带状矩阵的m值a=0.5*ones(1,21);b=2*ones(1,21);c=0.5*ones(1,21);a(1)=0;c(21)=0;u=ones(1,21);u(1)=b(1);r=c;yy(1)=d(1);%%%追的过程for k=2:21l(k)=a(k)/u(k-1);u(k)=b(k)-l(k)*r(k-1);yy(k)=d(k)-l(k)*yy(k-1);end%%%赶的过程m(21)=yy(21)/u(21);for k=20:-1:1m(k)=(yy(k)-r(k)*m(k+1))/u(k);end%%%利用插值点画出拟合曲线k=1;nn=100;xx=linspace(0,20,nn);l=0;for j=1:nnfor i=2:20if xx(j)<=x(i)k=i;break; elsek=i+1; end end h=1;xbar=x(k)-xx(j); xmao=xx(j)-x(k-1);s(j)=(m(k-1)*xbar^3/6+m(k)*xmao^3/6+(y(k-1)-m(k-1)*h^2/6)*xbar+(y(k)-m(k)*h^2/6)*xmao)/h;sp(j)=-m(k-1)*(x(k)-xx(j))^2/(2*h)+m(k)*(xx(j)-x(k-1))^2/(2*h)+(y(k)-y(k-1))/h-(m(k)-m(k-1))*h/6;l(j+1)=(1+sp(j)^2)^0.5*(20/nn)+l(j);%利用第一类线积分求河底光缆的长度 end %%%绘图title('光缆插值曲线') xlabel('分点') ylabel('深度')plot(xx,s,'r-','linewidth',1.5) griddisp(['所需光缆长度为',num2str(l(nn+1)),'米']) 运行结果:光缆插值曲线分点深度第2题假定某天的气温变化记录如下表所示,试用数据拟合的方法找出这一天的气温变化的规律;试计算这一天的平均气温,并试估计误差。
问题分析及算法思路:由于题中所给数据点有25个,此时采用多项式插值的方法做数据近似需要用较高次的多项式,这不仅给计算带来困难,而且有余项带来的误差很大;若采用样条插值计算量虽然不大,但是参数的个数很多,而且没有一个统一的数学公式来表示,对计算带来了很大的麻烦。
所以可考虑使用最小二乘法进行拟合。
在本题中,采用最小二乘法找出这一天的气温变化的规律,依次使用二次函数、三次函数以及四次函数进行拟合,计算其相应的系数,估算误差,并作图比较三个函数之间的区别。
算法结构:最小二乘法算法结构见《计算方法教程》P123。
源程序: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];m=length(x);n=input('请输入函数的次数 ');plot(x,y,'k.',x,y,'-')grid;hold on;n=n+1;G=zeros(m,n+1);G(:,n+1)=y';c=zeros(1,n); %建立c来存放σq=0;f=0;b=zeros(1,m); %建立b用来存放β%%%形成矩阵Gfor j=1:nfor i=1:mG(i,j)=x(1,i)^(j-1);endend%%%建立矩阵Qkfor k=1:nfor i=k:mc(k)=G(i,k)^2+c(k);endc(k)=-sign(G(k,k))*(c(k)^0.5);w(k)=G(k,k)-c(k); %建立w来存放ωfor j=k+1:mw(j)=G(j,k);endb(k)=c(k)*w(k);%%%变换矩阵Gk-1到GkG(k,k)=c(k);for j=k+1:n+1q=0;for i=k:mq=w(i)*G(i,j)+q;ends=q/b(k);for i=k:mG(i,j)=s*w(i)+G(i,j);endendend%%%求解三角方程 Rx=h1a(n)=G(n,n+1)/G(n,n);for i=n-1:(-1):1for j=i+1:nf=G(i,j)*a(j)+f;enda(i)=(G(i,n+1)-f)/G(i,i); % %%a(i)存放各级系数 f=0;end%%%拟合后的回代过程p=zeros(1,m);for j=1:mfor i=1:np(j)=p(j)+a(i)*x(j)^(i-1);endendplot(x,p,'r*',x,p,'-');E2=0;%用E2来存放误差%%%误差求解for i=n+1:mE2=G(i,n+1)^2+E2;endE2=E2^0.5;disp('误差为');disp(E2);t=0for i=1:mt=t+p(i);endt=t/m; %%%平均温度disp(['平均温度为',num2str(t),'℃'])运行结果:二次函数时,系数a0=8.3063,a1=2.6064,a2=-0.0938,误差为16.7433,平均温度为21.2℃。
函数形式为:2 ()8.3063 2.60640.0938 p x x x =+-三次函数时,系数a0=13.3880,a1=-0.2273,a2=0.2075,a3=-0.0084,误差为11.4482,平均温度为21.2℃。
函数形式:23 ()13.38800.22730.20750.0084 p x x x x =-+-四次函数时,系数a0=16.7939,a1=-3.7050,a2=0.8909,a3=-0.0532,a4=0.0009,误差为7.6838,平均温度为21.2℃。
函数形式为:234 ()16.7939 3.70500.89090.05320.0009 p x x x x x =-+-+第3题已知非线性方程)sincos(1=⎰πθθπdx在[2,3]中有根。
请设计算法,求出该根,并使求出的根的误差不超过410-。
问题分析以及算法思路:本题采用复化梯形求积公式计算方程根,可令()1()cos sinf x x dπθθπ=⎰。
算法结构:牛顿迭代法算法结构见《计算方法教程》P196。
源程序:clear;clc;x0=2; %设置求解区间x1=3;n=20; %复化梯形求积公式的步数e=0.0004;f0=T3Sub(x0,n);f1=T3Sub(x1,n);if (f0*f1)>0 %判断在区间是否有error('No answer,because f0*f1>0');endfor i=1:201x=(x0+x1)/2;if abs(x1-x)<e %判断解是否符合误差disp(['方程的解',num2str(x)]);disp(['迭代步数',num2str(i)]);disp(['误差',num2str(abs(x1-x))]); break;endf=T3Sub(x,n);if (f*f0)<0x1=x;f1=f;elsex0=x;f0=f;endendfunction [f]=T3Sub(x,n)%复化梯形求积公式h=pi/n;f=0;for i=1:nu=i*h;f=f+cos(x*sin(u-h))+cos(x*sin(u));endf=(h*f)/(2*pi);end运行结果:第4题线性方程组求解(1)编写程序实现大规模方程组的高斯消去法程序,并对所附的方程组进行求解。
所附方程组的类型为对角占优的带状方程组。
(2)针对本专业中所碰到的实际问题,提炼一个使用方程组进行求解的例子,并对求解过程进行分析、求解。
算法思想:高斯消去法是利用现行方程组初等变换中的一种变换,将一个不为零的数乘到一个方程后加到另一个方程,使方程组变成同解的上三角方程组,然后再自下而上对上三角方程组求解。
算法结构:1.读取二进制文件,存入计算矩阵2.对矩阵进行初等变换,然后求解(计算方法教程高斯消去法及列主元高斯消去法算法)源代码:clear;clc;%% 读取系数矩阵[f,p]=uigetfile('*.dat','选择数据文件'); %读取数据文件num=5; %输入系数矩阵文件头的个数name=strcat(p,f);file=fopen(name,'r');head=fread(file,num,'uint'); %读取二进制头文件id=dec2hex(head(1)); %读取标识符fprintf('文件标识符为:');idver=dec2hex(head(2)); %读取版本号fprintf('文件版本号为:');vern=head(3); %读取阶数fprintf('矩阵A的阶数:');nq=head(4); %上带宽fprintf('矩阵A的上带宽:');qp=head(5); %下带宽fprintf('矩阵A的下带宽:');pdist=4*num;fseek(file,dist,'bof'); %把句柄值转向第六个元素开头处[A,count]=fread(file,inf,'float'); %读取二进制文件,获取系数矩阵fclose(file); %关闭二进制头文件%% 对非压缩带状矩阵进行求解if ver=='102',a=zeros(n,n);for i=1:n,for j=1:n,a(i,j)=A((i-1)*n+j); %求系数矩阵a(i,j)endendb=zeros(n,1);for i=1:n,b(i)=A(n*n+i);endfor k=1:n-1, %列主元高斯消去法m=k;for i=k+1:n, %寻找主元if abs(a(m,k))<abs(a(i,k))m=i;endendif a(m,k)==0 %遇到条件终止disp('错误!')returnendfor j=1:n, %交换元素位置得主元t=a(k,j);a(k,j)=a(m,j);a(m,j)=t;t=b(k);b(k)=b(m);b(m)=t;endfor i=k+1:n, %计算l(i,k)并将其放到a(i,k)中a(i,k)=a(i,k)/a(k,k);for j=k+1:na(i,j)=a(i,j)-a(i,k)*a(k,j);endb(i)=b(i)-a(i,k)*b(k);endendx=zeros(n,1); %回代过程x(n)=b(n)/a(n,n);for k=n-1:-1:1,x(k)=(b(k)-sum(a(k,k+1:n)*x(k+1:n)))/a(k,k);endend%% 对压缩带状矩阵进行求解if ver=='202', %高斯消去法m=p+q+1;a=zeros(n,m);for i=1:1:nfor j=1:1:ma(i,j)=A((i-1)*m+j);endendb=zeros(n,1);for i=1:1:nb(i)=A(n*m+i); %求b(i)endfor k=1:1:(n-1) %开始消去if a(k,(p+1))==0disp('错误!');break;endst1=n;if (k+p)<nst1=k+p;endfor i=(k+1):1:st1a(i,(k+p-i+1))=a(i,(k+p-i+1))/a(k,(p+1)); for j=(k+1):1:(k+q)a(i,j+p-i+1)=a(i,j+p-i+1)-a(i,k+p-i+1)*a(k,j+p-k+1);endb(i)=b(i)-a(i,k+p-i+1)*b(k);endendx=zeros(n,1); %回代x(n)=b(n)/a(n,p+1);sum=0;for k=(n-1):-1:1sum=b(k);st2=n;if (k+q)<nst2=k+q;endfor j=(k+1):1:st2sum=sum-a(k,j+p-k+1)*x(j);endx(k)=sum/a(k,p+1);sum=0;endenddisp('方程组的的解为:') %输出解disp(x)运行结果:首先是对测试文件dat20171/ dat20172的求解结果,具体如下:经过测试矩阵的初步测试,利用程序对接下来的两个数据文件进行处理,由于dat20173/ dat20174解的个数较多,在这里只截取不分解作为示意,具体求解如下:本专业算例一底边绝热的形导热物体,无热源,其余三边温度如下,求解该形节点1、2、3、4的温度。