计算方法B上机报告.docx

上传人:b****7 文档编号:15548059 上传时间:2023-07-05 格式:DOCX 页数:36 大小:303.18KB
下载 相关 举报
计算方法B上机报告.docx_第1页
第1页 / 共36页
计算方法B上机报告.docx_第2页
第2页 / 共36页
计算方法B上机报告.docx_第3页
第3页 / 共36页
计算方法B上机报告.docx_第4页
第4页 / 共36页
计算方法B上机报告.docx_第5页
第5页 / 共36页
计算方法B上机报告.docx_第6页
第6页 / 共36页
计算方法B上机报告.docx_第7页
第7页 / 共36页
计算方法B上机报告.docx_第8页
第8页 / 共36页
计算方法B上机报告.docx_第9页
第9页 / 共36页
计算方法B上机报告.docx_第10页
第10页 / 共36页
计算方法B上机报告.docx_第11页
第11页 / 共36页
计算方法B上机报告.docx_第12页
第12页 / 共36页
计算方法B上机报告.docx_第13页
第13页 / 共36页
计算方法B上机报告.docx_第14页
第14页 / 共36页
计算方法B上机报告.docx_第15页
第15页 / 共36页
计算方法B上机报告.docx_第16页
第16页 / 共36页
计算方法B上机报告.docx_第17页
第17页 / 共36页
计算方法B上机报告.docx_第18页
第18页 / 共36页
计算方法B上机报告.docx_第19页
第19页 / 共36页
计算方法B上机报告.docx_第20页
第20页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

计算方法B上机报告.docx

《计算方法B上机报告.docx》由会员分享,可在线阅读,更多相关《计算方法B上机报告.docx(36页珍藏版)》请在冰点文库上搜索。

计算方法B上机报告.docx

计算方法B上机报告

西安交通大学

计算方法B上机报告

 

 

班级:

XXXXXXXX

姓名:

XXX

学号:

XXXXXXXX

 

2015/12/13Sunday

目录

1题目一1

1.数值计算1

2.实现思想1

3.源程序1

4.计算结果2

5.分析总结2

2题目二3

1.数据近似3

2.实现思想3

3.源程序5

4.计算结果6

5.分析总结7

3题目三8

1.数据拟合8

2.实现思想8

3.源程序9

4.计算结果12

5.分析总结14

4题目四15

1.非线性方程求解15

2.实现思想15

3.源程序16

4.计算结果17

5.分析总结17

5题目五18

1.线性方程组求解。

18

2.文件格式说明18

3.实现思想19

4.源程序20

5.计算结果23

6.分析总结25

7.实际问题25

1题目一

1.数值计算

计算以下和式:

,要求:

(1)若保留11个有效数字,给出计算结果,并评价计算的算法;

(2)若要保留30个有效数字,则又将如何进行计算。

2.实现思想

对于

(1)可用迭代的方法进行处理。

通过do-while循环使和式从0开始计算直到结果满足有效数字即可。

在循环中通过比较本次和上一次结果之差的绝对值与相应有效数字的大小的1/2,即可构成循环中止条件。

对于

(2)可用同样的方法进行计算,然而由于所保留的有效数字较大,此时若不对上述算法进行改善的话,由于每一步所得计算结果都是其真实值,此时可能会存在有效数字丢失的情况,从而影响计算的准确性。

因此我们需要对程序中的计算精度进行控制。

在Maltlab中可利用digits()函数对运算精度进行规定,为防止出现有效位的损失,在实际程序中需将精度提高几位。

而对迭代中每一步所得到的结果则利用vpa()函数进行限定,这样一来我们对每一个运算都控制了精度,而不只是单纯控制了结果的精度

3.源程序

使用Matlab所编写程序如下所示:

(1)

clear;clc;

sd=11;%所要保留有效数字

n=0;%迭代次数

S1=0;%当前n时计算结果

S2=0;%n-1时计算结果

while1

eq=(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6))/16^n;

S1=S1+eq;

ifabs(S1-S2)<0.5*10^(-(sd-1))%迭代是否终止判断条件

break

end

S2=S1;

n=n+1;

end

S=vpa(S1,sd)

(2)

clear;clc;

sd=30;%所要保留有效数字

digits(sd+2);%控制精度

n=0;%迭代次数

S1=vpa(0);%当前n时计算结果

S2=vpa(0);%n-1时计算结果

while1

eq=vpa((4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6))/16^n);

S1=vpa(S1+eq);

ifabs(S1-S2)

break

end

S2=S1;

n=n+1;

end

S=vpa(S1,sd)

4.计算结果

(1)

S=3.1415926536

(2)

S=3.14159265358979323843571167922

5.分析总结

从计算结果可以看出与准确值3.1415926535897932384357116792180407…相比

(1)和

(2)所得结果分别是准确值保留11位和30位有效数字的结果,即利用本程序所得结果准确。

而如果直接利用程序

(1)对

(2)进行求解,即只是单独修改有效数字位数sd而没有对运算精度加以限制所得结果为:

3.14159265358979323846264338328。

我们可以看出该结果与程序

(2)所得结果以及准确值相差较大。

这是由于未对计算过程中的每一步运算的运算精度进行控制造成有效数字的损失。

当所需保留的有效数字较低时,该影响尚不明显,而当计算量较大时会对计算结果产生较大影响,使最终结果和准确值偏离较大。

因此,在进行运算所要求保留的有效数字较大时要对计算结果的运算精度进行控制,防止运算结果产生较大误差。

2题目二

1.数据近似

某通信公司在一次施工中,需要在水面宽度为20米的河沟底部沿直线走向铺设一条沟底光缆。

在铺设光缆之前需要对沟底的地形进行初步探测,从而估计所需光缆的长度,为工程预算提供依据。

已探测到一组等分点位置的深度数据(单位:

米)如下表所示:

分点

0

1

2

3

4

5

6

深度

9.01

8.96

7.96

7.97

8.02

9.05

10.13

分点

7

8

9

10

11

12

13

深度

11.18

12.26

13.28

13.32

12.61

11.29

10.22

分点

14

15

16

17

18

19

20

深度

9.15

7.90

7.95

8.86

9.81

10.80

10.93

(1)请用合适的曲线拟合所测数据点;

(2)估算所需光缆长度的近似值,并作出铺设河底光缆的曲线图;。

2.实现思想

本题首先要对所测量的21个点进行数据拟合,再对拟合的曲线进行线积分运算即可得到所需光缆长度的近似值。

数据近似的方法一般有两种,一个是多项式插值,另一种是分段插值。

如果将所有的测量点都用上,采用多项式插值时,由于龙格现象的存在,随着点数的增大,有时会在两端产生激烈的震荡,使函数不收敛。

因此,为了将所有的测量点都用上,本题应采用分段插值方法求解。

而为了改善分段插值所引起的曲线的光滑性不够的问题,常采用较高的分段多项式改善曲线的光滑性质。

故本题采用三次样条插值。

三次样条插值算法结构如下所示:

算法

1.

1.1

2.

2.1

2.1.1

3.

4.

4.1

4.2

4.3

5.

6.将M矩阵中的元素个数存入m中

7.

8.

8.1

8.2

8.3

9.

10.

10.1

11.将x中的元素个数存入r中

12.

13.

13.1

14.

其中

记在

处的二阶导数

,在自然样条插值中

得到河底光缆曲线的函数

后,可利用第一类线积分计算光缆长度l为:

3.源程序

按照上述算法所编写的MATLAB程序如下所示:

clear;clc;

x=0:

1:

20;%等分点数组

X=0:

0.2:

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];%深度数组

n=length(x);%等分点数目

N=length(X);%插值点数目

%计算三次样条函数s(x)

M=y;%计算y的二阶差商并存储在矩阵M中

fork=2:

3;

fori=n:

-1:

k;

M(i)=(M(i)-M(i-1))/(x(i)-x(i-k+1));

end

end

%计算三对角阵系数a,b,c及右端向量d

h

(1)=x

(2)-x

(1);

fori=2:

n-1;

h(i)=x(i+1)-x(i);c(i)=h(i)/(h(i)+h(i-1));

a(i)=1-c(i);b(i)=2;d(i)=6*M(i+1);

end

%选择自然边界条件

M

(1)=0;M(n)=0;b

(1)=2;b(n)=2;c

(1)=0;a(n)=0;d

(1)=0;d(n)=0;

%追赶法计算样条参数M

u

(1)=b

(1);

ynew

(1)=d

(1);

%追

fork=2:

n;

len(k)=a(k)/u(k-1);

u(k)=b(k)-len(k)*c(k-1);

ynew(k)=d(k)-len(k)*ynew(k-1);

end

M(n)=ynew(n)/u(n);

%赶

fork=n-1:

-1:

1;

M(k)=(ynew(k)-c(k)*M(k+1))/u(k);

end

form=1:

N;

k=1;

fori=2:

n-1

ifX(m)<=x(i);

k=i-1;

break;

else

k=i;

end

end

%在各区间用三次样条插值函数计算X点处的值

h=x(k+1)-x(k);x1=x(k+1)-X(m);x2=X(m)-x(k);s(m)=(M(k)*(x1^3)/6+M(k+1)*(x2^3)/6+(y(k)-(M(k)*(h^2)/6))*x1+(y(k+1)-(M(k+1)*(h^2)/6))*x2)/h;

end

%计算所需光缆长度

Length=0;

fori=2:

N

Length=Length+sqrt((X(i)-X(i-1))^2+(s(i)-s(i-1))^2);

end

%河底光缆长度

Length

%绘制铺设河底光缆的曲线图

plot(x,y,'*',X,s,'-')

xlabel('宽度');ylabel('深度/m');title('铺设河底光缆的曲线图');grid;

4.计算结果

采用三次样条插值拟合后的图形如下所示:

程序运行后得所需光缆长度的近似值为26.4844m

5.分析总结

从所绘制的河底光缆的曲线图可以看出,通过采用三次样条插值能在利用到所有数据点的基础上,避免产生多项式插值中所存在的龙格现象。

且从图中可看出,通过利用较高次的分段多项式可使曲线更平滑,从而避免产生锯齿形的折线,使数据估算更准确。

在求解样条参数时,利用追赶法求解三对角矩阵时计算速度快,这是求解线性方程组一种非常有效的方法。

在编写MATLAB程序时需注意到与算法结构中所存在的差别,如,在算法中出现第i-1个元素时,由于在MATLAB中的矩阵从1开始,故此时循环的过程中不能出现某矩阵第0个元素的情况,需对循环位进行合理调整。

3题目三

1.数据拟合

假定某天的气温变化记录如下表所示,试用数据拟合的方法找出这一天的气温变化的规律;试计算这一天的平均气温,并试估计误差。

时刻

0

1

2

3

4

5

6

7

8

9

10

11

12

平均气温

15

14

14

14

14

15

16

18

20

20

23

25

28

时刻

13

14

15

16

17

18

19

20

21

22

23

24

平均气温

31

34

31

29

27

25

24

22

20

18

17

16

2.实现思想

由于本题中数据点较多,使用多项式插值时误差较大,采用分段插值会带来计算量较大的问题。

对此,我们可改变近似函数的形式,选择较高次的多项式、指数函数进行数据拟合。

利用正交化方法的最小二乘法求解各多项式的系数,以及通过将指数函数去对数的形式变成多项式的形式,来求解指数函数的各项系数。

利用n次多项式函数

进行数据拟合时的正交化最小二乘算法结构如下所示:

算法

1.利用数据生成矩阵G其中平均气温矩阵作为矩阵G的最后一列(第n+1列),各项系数结果存储在cv矩阵中,

是误差

2.

2.1[形成矩阵

]

2.1.1

2.1.2

2.1.3

2.1.3.1

2.1.4

2.2[变换矩阵

]

2.2.1

2.2.2

2.2.3

2.2.3.1

3.[解三角方程

]

3.1

3.2

3.2.1

4.[计算误差

]

4.1

利用指数函数

进行数据拟合时,将其取自然对数后变成

于是,对指数函数的数据拟合就变成了对多项式的方法了。

3.源程序

按照上述算法所编写的MATLAB程序如下所示:

clear;clc;

x=0:

1:

24;

y=[15141414141516182020232528313431292725242220181716];

m=length(x);

n=input('多项式的次数n=');

n=n+1;

plot(x,y,'.-')

grid;

holdon;

%多项式函数数据拟合

%构造矩阵G

G=zeros(m,n+1);

G(:

n+1)=y';

forj=1:

n

fori=1:

m

G(i,j)=x(1,i)^(j-1);

end

end

%形成矩阵Q(k)

fork=1:

n

sigma=--sign(G(k,k))*sqrt(sum(G(k:

m,k).^2));

w(k)=G(k,k)-sigma;

forj=k+1:

m

w(j)=G(j,k);

end

beta=sigma*w(k);

%变换Gk-1到Gk

G(k,k)=sigma;

forj=k+1:

n+1

t=sum(w(k:

m)*G(k:

m,j))/beta;

fori=k:

m;

G(i,j)=G(i,j)+t*w(i);

end

end

end

%解三角方程求多项式系数cv

cv(n)=G(n,n+1)/G(n,n);

fori=n-1:

-1:

1

cv(i)=(G(i,n+1)-sum(G(i,i+1:

n).*cv(i+1:

n)))/G(i,i);

end

%计算误差rou

rou=sum(G(n+1:

m,n+1).^2);

%结果显示

fprintf('%d次多项式函数的系数由低到高为:

',n);

disp(cv);

fprintf('使用%d次多项式函数拟合的误差是%f:

',n,rou);

cv=fliplr(cv);%将系数数组左右翻转

px=poly2sym(cv);%将系数数组转化为多项式

subs(px,'x',x);

px=double(ans);

figure

(1);

%绘制多项式函数拟合曲线

plot(x,y,'k.-',x,px,'r*-');

legend('实测平均温度温度曲线','多项式函数拟合曲线',n)

xlabel('时刻/h');ylabel('平均气温/℃');xlim([0,24]);

title([num2str(n-1),'次函数拟合曲线']);

%指数函数数据拟合

n=3;

yexp=log(y);

G=zeros(m,n+1);

G(:

n+1)=yexp';

forj=1:

n

fori=1:

m

G(i,j)=x(1,i)^(j-1);

end

end

%形成矩阵Q(k)

fork=1:

n

sigma=--sign(G(k,k))*sqrt(sum(G(k:

m,k).^2));

w(k)=G(k,k)-sigma;

forj=k+1:

m

w(j)=G(j,k);

end

beta=sigma*w(k);

%变换Gk-1到Gk

G(k,k)=sigma;

forj=k+1:

n+1

t=sum(w(k:

m)*G(k:

m,j))/beta;

fori=k:

m;

G(i,j)=G(i,j)+t*w(i);

end

end

end

%解三角方程求多项式系数cv

cvexp(n)=G(n,n+1)/G(n,n);

fori=n-1:

-1:

1

cvexp(i)=(G(i,n+1)-sum(G(i,i+1:

n).*cvexp(i+1:

n)))/G(i,i);

end

a=cvexp

(1);b=cvexp

(2);c=cvexp(3);

G(n+1:

m,n+1)=exp(sum(G(n+1:

m,n+1).^2));

%计算误差e

rou=sum(G(n+1:

m,n+1).^2);

%结果显示

fprintf('\n指数函数的系数是:

a=%f,b=%f,c=%f',a,b,c);

fprintf('\n使用指数函数拟合的误差是:

%f\n',rou);

pexp=a.*exp(-b.*(x-c).^2);

fori=1:

m

pexp(i)=exp(a+b*x(i)+c*x(i)^2);

end

figure

(2);

%绘制指数函数拟合曲线

plot(x,y,'k.-',x,pexp,'r*-');

title(['指数函数拟合曲线']);

legend('实测平均温度温度曲线','指数函数拟合曲线',n)

xlabel('时刻/h');ylabel('平均气温/℃');xlim([0,24]);

grid;

%计算平均温度

Tav=sum(y(1:

m))/m;

disp(['平均温度为',num2str(Tav),'℃']);

4.计算结果

(1)二次多项式函数拟合程序运行结果如下所示:

2次多项式函数的系数由低到高为:

8.30632.6064-0.0938

使用2次多项式函数拟合的误差是280.339547:

平均温度为21.2℃

(2)三次多项式函数拟合程序运行结果如下所示:

3次多项式函数的系数由低到高为:

13.3880-0.22730.2075-0.0084

使用3次多项式函数拟合的误差是131.061822:

平均温度为21.2℃

(3)四次多项式函数拟合程序运行结果如下所示:

4次多项式函数的系数由低到高为:

16.7939-3.70500.8909-0.05320.0009

使用4次多项式函数拟合的误差是59.041189:

平均温度为21.2℃

(4)指数函数

拟合程序运行结果如下所示:

指数函数的系数是:

a=2.383470,b=0.125093,c=-0.004442

使用指数函数拟合的误差是:

57.034644

平均温度为21.2℃

5.分析总结

通过比较不同多项式的拟合效果可以看出,随着多项式次数的增加曲线拟合效果越来越好,误差也逐渐减小。

因此,为了得到更好的拟合效果,应尽量采用较高次多项式。

当数据具有指数的性质时,采用指数函数更为合适,可在比多项式阶数更少的情况下获得更小的误差。

4题目四

1.非线性方程求解

设计算法,求出非线性方程

的所有实根,并使误差不超过

2.实现思想

本题要对非线性方程进行求解,可采用迭代法进行计算。

迭代法包括简单迭代法、牛顿法、割线法以及区间法。

虽然牛顿迭代法、割线法的收敛速度较快,但容易引起收敛性问题,以及有时方程计算结果虽然满足给定误差界但解和准确解的误差依然有可能很大的情况。

因此我们这里采用区间法进行求解。

因为区间法总是收敛的,且它的迭代过程确定了一个区间序列,使得每个区间都包含方程的某个解,只要区间长度小于给定误差界时,解和准确解的误差就满足所需误差要求。

常用的区间方法为二分法,每次迭代使区间长度减小一半,其算法结构如下所示:

算法

1.

2.

3.

4.

5.

6.

7.

8.

9.

9.1

else

9.2

10.goto5

算法中

表示相邻两侧迭代的差的误差范围,

表示某次迭代的方程的计算结果的误差范围。

依题意本题只考虑相邻两侧迭代的差的误差,即解的误差。

3.源程序

按照上述算法所编写的MATLAB程序如下所示:

clc;clear;

%确定根所在的区间

interval=[];

fori=-10:

0.1:

10

if(fx(i)*fx(i+0.1)<0)

interval=[intervali];

end

end

%确定根的个数

n=length(interval);

%对每个根区间采用二分法求解

forj=1:

n

x0=interval(j);%左端点

x1=interval(j)+1;%右端点

while(x1-x0)>10^(-4)

iffx(x0)*fx((x0+x1)/2)>0

x0=(x0+x1)/2;

else

x1=(x0+x1)/2;

end

end

root(j)=x0;

end

%方程组误差不超过10^-4的解

root

其中程序中的fx函数为:

function[y]=fx(x)

y=6*x^5-45*x^2+20;

end

4.计算结果

程序运行结果为:

root=-0.65460.68111.8707

对结果进行验证,分别将-0.6546与-0.6545、0.6811与0.6812、1.8707与1.8708代入fx函数中得。

fx(-0.6546)=-0.0031fx(-0.6545)=0.0034

fx(0.6811)=0.0032fx(0.6812)=-0.0023

fx(1.8707)=-0.0118fx(-1.8708)=0.0081

由计算结果可以看出所得解在相差10^-4时的函数的结果均为一正一负,即所得解满足题目所要求的解的误差范围。

5.分析总结

利用区间方法求解非线性方程的解时虽然其收敛速度不如牛顿迭代和割线法,但其保证了算法的收敛性,保证了解和准确解之差满足误差范围。

但从计算结果中我们同样可以看出利用区间法得到的解回代到原方程中所得解与0最大的误差相差0.01以上,如果本题还要求利用所求解运算后的方程在一定误差范围内时,此时虽然在判断条件上加上计算结果的误差限定同样得到误差范围内的解,但此时利用区间法的计算量将很大,不如采用牛顿法或割线发经济。

因此,处理不同求解非线性方程根的问题时,应具体问题具体分析,兼顾收敛速度与收敛性,选择合适的迭代方法。

5题目五

1.线性方程组求解。

(1)编写程序实现大规模方程组的高斯消去法程序,并对所附的方程组进行求解。

所附方程组的类型为对角占优的带状方程组。

(2)针对本专业中所碰到的实际问题,提炼一个使用方程组进行求解的例子,并对求解过程进行分析、求解。

2.文件格式说明

(1)数据文件的文件名后缀为.dat,形式为:

文件名.dat;

(2)数据文件中的数据均为二进制记录结构,因此必须使用二进制方式进行读取;

(3)数据文件的结构,分为以下四个部分:

a)文件标示部分,该部分用于存放数据文件的描述信息结构如下(用C语言格式进行描述):

typedefstructFileInfo{

longintid;//数据文件标示

longintver;//数据文件版本号

longintid1;//备用标志

}FILEINFO;

其中:

1id:

为该数据文件的标识,值为0xF1E

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2