《数值分析 Numerical Analysis》
课程设计
系 专:
班 级:
姓 名:
学 号:
指导老师:
实验一
1.1 水手、猴子和椰子问题:五个水手带了一只猴子来到南太平洋的一个荒岛上,发现那里有一大堆椰子。由于旅途的颠簸,大家都很疲惫,很快就入睡了。第一个水手醒来后,把椰子平分成五堆,将多余的一只给了猴子,他私藏了一堆后便又去睡了。第二、第三、第四、第五个水手也陆续起来,和第一个水手一样,把椰子分成五堆,恰多一只猴子,私藏一堆,再去入睡,天亮以后,大家把余下的椰子重新等分成五堆,每人分一堆,正好余一只再给猴子,试问原先共有几只椰子? 试分析椰子数目的变化规律,利用逆向递推的方法求解这一问题(15621)。
问题分析:设最初的椰子数为,即第一个水手所处理之前的椰子数,用分别表示五个水手对椰子动了手脚以后剩余的椰子数目,则根据问题有 。再用x表示最后每个水手平分得到的椰子数,于是有 。所以 ,利用逆向递推的方法,有 。由于椰子数为一正整数,用任意的x作为初值递推出的数据不一定是合适的。 这里用 for 循环语句结合 break语句来寻找合适的 x 和 ,对任意的 x 递推计算出,当计算结果为正整数时,结果正确,否则选取另外的 x 再次重新递推计算,直到计算出的结果 p0为正整数为止。
程序设计:
n=input('input n:');
for x=1:n
p=5*x+1;
for k=1:5
p=5*p/4+1;
end
if p==fix(p),break,end
end
disp([x,p])
运行结果:input n:122
1.0e+003 *
0.1220 1.8728
input n:1200
1023 15621
input n:4567890
1023 15621
1.2 设,
① 从尽可能精确的近似值出发,利用递推公式:
计算机从到的近似值;
解:先求出I0的精确值,再用递推公式
syms x;
I0=int(1/(5+x),x,0,1);
I0=vpa(I0);
for i=1:20
I0=-5*I0+1/i
End
经过20次迭代,最终结果为I0 =0.007997523028232163831452112940177
② 从较粗糙的估计值出发,用递推公式:
计算从到的近似值;
解:先求出的值近似精确值,再用递推公式
syms x;
I0=int(0.2*x^30,x,0,1);
I0=vpa(I0);
for i=30:-1:2
I0=-0.2*I0+0.2/i
End
经过30次迭代,最终结果为I0 = 0.088392216030226868941404253296685
③ 分析所得结果的可靠性以及出现这种现象的原因。
解:方法2比较可靠,因为方法1每次都将误差放大5倍,而方法2则将误差缩小到原来的0.2倍。
实验二
2.1 用高斯消元法的消元过程作矩阵分解。设
消元过程可将矩阵A化为上三角矩阵U,试求出消元过程所用的乘数、、并以如下格式构造下三角矩阵L和上三角矩阵U
验证:矩阵A可以分解为L和U的乘积,即A=LU。
解:
算法分析:由于matlab中含有将A分解成一个下三角矩阵和一个上三角矩阵,所以直接调 用。
程序及其运行结果: A=[20 2 3;1 8 1;2 -3 15]
[L,U]=lu(A)
A =
20 2 3
1 8 1
2 -3 15
L =
1.0000 0 0
0.0500 1.0000 0
0.1000 -0.4051 1.0000
U =
20.0000 2.0000 3.0000
0 7.9000 0.8500
0 0 15.0443
矩阵A可以分解为L和U的乘积
2.3 验证希尔伯特矩阵的病态性:对于三阶矩阵
取右端向量,验证:
(1)向量是方程组的准确解;
(2)取右端向量b的三位有效数字得,求方程组的准确解,并与X的数据作比较 。说明矩阵的病态性。
解:(1) 直接验证即可
A=[1 1/2 1/3;1/2 1/3 1/4;1/3 1/4 1/5];
B=[1;1;1];
b=sym(A*B)
结果与上述结果相同
(2) 先求出解,与数据作比较 。
A=[1 1/2 1/3;1/2 1/3 1/4;1/3 1/4 1/5];
b=[1.83;1.08;0.783];
B=A\b
结果为
B =
1.079999999999999
0.540000000000004
1.439999999999997
结果误差变化较大,说明数值的微小变化导致结果的巨大误差,矩阵A为病态的
实验三
3.1 用泰勒级数的有限项逼近正弦函数
用计算机绘出上面四个函数的图形。
解:程序:
x=0:pi/100:pi;
m=0:pi/100:pi/2;
y0=sin(x);
y1=m;
y2=m-m.^3/6;
y3=m-m.^3/6+t.^5/120;
plot(x,y0,m,y1,m,y2,m,y3)
运行结果:
3.2 绘制飞机的降落曲线
一架飞机飞临北京国际机场上空时,其水平速度为540km/h,飞行高度为1 000m。飞机从距机场指挥塔的横向距离12 000m处开始降落。根据经验,一架水平飞行的飞机其降落曲线是一条三次曲线。建立直角坐标系,设飞机着陆点为原点O,降落的飞机为动点,则表示飞机距指挥塔的距离,表示飞机的飞行高度,降落曲线为
该函数满足条件:
(1)试利用满足的条件确定三次多项式中的四个系数;
(2)用所求出的三次多项式函数绘制出飞机降落曲线。
解:
(1)程序:
A=[1 0 0 0;1 12000 12000^2 12000^3;0 1 0 0;0 1 24000 3*(12000^2)];
b=[0,1000,0,0]';
inv(A)*b
运行结果:ans =
1.0e-004 *
0
0
0.2083
-0.0000
(2)程序:x=0:50:12000;
y=0.207e-004*(x.^2)+-0.00001158e-004*(x.^3);
plot(x,y)
运行结果:
实验四
4.1 曾任英特尔公司董事长的摩尔先生早在1965年时,就观察到一件很有趣的现象:集成电路上可容纳的零件数量,每隔一年半左右就会增长一倍,性能也提升一倍。因而发表论文,提出了大大有名的摩尔定律(Moore’s Law),并预测未来这种增长仍会延续下去。下面数据中,第二行数据为晶片上晶体数目在不同年代与1959年时数目比较的倍数。这些数据是推出摩尔定律的依据:
试从表中数据出发,推导线性拟合的函数表达式。
程序设计:
y=[1 3 4 5 6];
x2=[1959 1962 1963 1964 1965];
P=polyfit(x2,y,1);
disp(P);
运行结果为: 1.0e+003 *
0.0008 -1.6255
结果分析:由运行结果可知线性拟合的函数表达式为y= 0.0008x -1.6255,由于是近似值,所以不免有误差。
实验五
5.1 用几种不同的方法求积分的值。
(1)牛顿-莱布尼茨公式;(2)梯形公式;(3)辛卜生公式;(4)复合梯形公式。
解:(1)牛顿-莱布尼茨公式
输入:
syms x;
y=4/(1+x^2);
int_y=int(y,x,0,1)
输出:
int_y =
pi
(2)梯形公式
function y=dada(x)
y=4./(1+x.^2);
以'dada.m'保存
输入:
T=(1-0)/2*(dada(1)+dada(0))
结果:
T =3
(3)辛卜生公式
输入:
S=quad('dada',0,1)
结果:
S =
3.141592682924567
(4)复合梯形公式
输入d=1/100;
x=0:d:1;
f=dada(x);
FT=trapz(f)*d
结果:
FT =
3.141575986923129
5.2 设X为标准正态随机变量,即X~N(0,1)。现分别取,试设计算法计算30个不同的概率值;,并将计算结果与概率论教科书中的标准正态分布函数表作比较。
(提示:
解:
m=0.1:0.1:3;
P=zeros(30,1);
for i=1:30
P(i)=1/sqrt(2*pi)*int(sym('exp(-x^2/2)'),m(i),4);
end
P
m=0.1:0.1:3;
P=zeros(30,1);
for i=1:30
P(i)=1/sqrt(2*pi)*int(sym('exp(-x^2/2)'),-4,m(i));
end
P
P =
0.4601
0.4207
0.3821
0.3445
0.3085
0.2742
0.2419
0.2118
0.1840
0.1586
0.1356
0.1150
0.0968
0.0807
0.0668
0.0548
0.0445
0.0359
0.0287
0.0227
0.0178
0.0139
0.0107
0.0082
0.0062
0.0046
0.0034
0.0025
0.0018
0.0013
P =
0.5398
0.5792
0.6179
0.6554
0.6914
0.7257
0.7580
0.7881
0.8159
0.8413
0.8643
0.8849
0.9032
0.9192
0.9332
0.9452
0.9554
0.9640
0.9713
0.9772
0.9821
0.9861
0.9892
0.9918
0.9938
0.9953
0.9965
0.9974
0.9981
0.9986
5.5 求空间曲线L:
弧长公式为
解:运行程序为:syms t;
a=diff(cos(t));
b=diff(sin(t));
c=diff(2-cos(t)-sin(t));
y=int((a^2+b^2+c^2)^0.5,t,0,2*pi);
vpa(y)
运行结果:ans =8.737752570984804741619351957708
实验六
6.1 用欧拉公式和四阶龙格-库塔法分别求解下列初值问题;
解:(1)程序:
欧拉公式:
function [t,x]=Euler(fun,t0,tt,x0,N)
h=(tt-t0)/N;
t=t0+[0:N]'*h;
x(1,:)=x0';
for k=1:N
f=feval(fun,t(k),x(k,:));
f=f';
x(k+1,:)=x(k,:)+h*f;
end
以'Euler.m'保存
function f=Euler_fun(t,x)
f=0.9*x./(1+2*t);
以'Euler_fun.m'保存
function main_Euler
[t,x]=Euler('Euler_fun',0,1,1,20);
fh=dsolve('Dx=0.9*x/(1+2*t)','x(0)=1');
for k=1:21
ft(k)=t(k);
fx(k)=subs(fh,ft(k));
end
[t,x]
以'main_Euler.m'保存
输入:main_Euler
ans =
0 1.0000
0.0500 1.0450
0.1000 1.0878
0.1500 1.1285
0.2000 1.1676
0.2500 1.2051
0.3000 1.2413
0.3500 1.2762
0.4000 1.3100
0.4500 1.3427
0.5000 1.3745
0.5500 1.4055
0.6000 1.4356
0.6500 1.4649
0.7000 1.4936
0.7500 1.5216
0.8000 1.5490
0.8500 1.5758
0.9000 1.6021
0.9500 1.6278
1.0000 1.6531
四阶龙格-库塔法
function R=rk4(f,a,b,ya,N)
h=(b-a)/N;
T=zeros(1,N+1);
Y=zeros(1,N+1);
T=a:h:b;
Y(1)=ya;
for j=1:N
k1=h*feval(f,T(j),Y(j));
k2=h*feval(f,T(j)+h/2,Y(j)+k1/2);
k3=h*feval(f,T(j)+h/2,Y(j)+k2/2);
k4=h*feval(f,Y(j)+h,Y(j)+k3);
Y(j+1)=Y(j)+(k1+2*k2+2*k3+k4)/6;
end
ans=[T' Y']
以'rk4.m'保存
function z=f(x,y)
z=0.9*y./(1+2*x);
以'f.m'保存
输入:rk4('f',0,1,1,20)
结果:
ans =
0 1.0000
0.0500 1.0392
0.1000 1.0765
0.1500 1.1121
0.2000 1.1463
0.2500 1.1791
0.3000 1.2108
0.3500 1.2415
0.4000 1.2712
0.4500 1.3000
0.5000 1.3281
0.5500 1.3554
0.6000 1.3821
0.6500 1.4082
0.7000 1.4337
0.7500 1.4586
0.8000 1.4831
0.8500 1.5071
0.9000 1.5306
0.9500 1.5538
1.0000 1.5765
(2)程序:欧拉公式
function [t,x]=Eulers(fun,t0,tt,x0,N)
h=(tt-t0)/N;
t=t0+[0:N]'*h;
x(1,:)=x0';
for k=1:N
f=feval(fun,t(k),x(k,:));
f=f';
x(k+1,:)=x(k,:)+h*f;
end
以'Eulers.m'保存
function f=Euler_funs(t,x)
f=-t*x/(1+t^2);
以'Euler_funs.m'保存
function mains_Euler
[t,x]=Euler('Euler_funs',0,1,2,20);
fh=dsolve('Dx=0.9*x/(1+2*t)','x(0)=1');
for k=1:21
ft(k)=t(k);
fx(k)=subs(fh,ft(k));
end
[t,x]
以'mains_Euler.m'保存
输入:mains_Euler
结果:
ans =
0 2.0000
0.0500 2.0000
0.1000 1.9950
0.1500 1.9851
0.2000 1.9706
0.2500 1.9516
0.3000 1.9287
0.3500 1.9021
0.4000 1.8725
0.4500 1.8402
0.5000 1.8058
0.5500 1.7696
0.6000 1.7323
0.6500 1.6941
0.7000 1.6554
0.7500 1.6165
0.8000 1.5777
0.8500 1.5392
0.9000 1.5012
0.9500 1.4639
1.0000 1.4274
四阶龙格-库塔法
function R=rk4s(f,a,b,ya,N)
h=(b-a)/N;
T=zeros(1,N+1);
Y=zeros(1,N+1);
T=a:h:b;
Y(1)=ya;
for j=1:N
k1=h*feval(f,T(j),Y(j));
k2=h*feval(f,T(j)+h/2,Y(j)+k1/2);
k3=h*feval(f,T(j)+h/2,Y(j)+k2/2);
k4=h*feval(f,Y(j)+h,Y(j)+k3);
Y(j+1)=Y(j)+(k1+2*k2+2*k3+k4)/6;
end
ans=[T' Y']
以'rk4s.m'保存
function z=fs(x,y)
z=-x*y/(1+x^2);
以'fs.m'保存
输入:rk4s('fs',0,1,2,20)
结果:
ans =
0 2.0000
0.0500 1.9918
0.1000 1.9795
0.1500 1.9632
0.2000 1.9433
0.2500 1.9200
0.3000 1.8936
0.3500 1.8645
0.4000 1.8331
0.4500 1.7998
0.5000 1.7650
0.5500 1.7291
0.6000 1.6923
0.6500 1.6551
0.7000 1.6176
0.7500 1.5801
0.8000 1.5429
0.8500 1.5060
0.9000 1.4697
0.9500 1.4340
1.0000 1.3990
6.2用求解常微分方程初值问题的方法计算积分上限函数
的值,实际上是将上面表达式两端求导化为常微分方程形式,并用初值条件。
试用MATLAB中的指令ode23解决定积分的计算问题。
解:odefun=@(x,y) 2*pi*exp(x)/x; %定义函数
tspan=[4 5]; %求解区间
y0=0; %初值
[x,y]=ode23(odefun,tspan,y0)
x =
4.0000
4.0000
4.0000
4.0000
4.0001
4.0007
4.0036
4.0182
4.0911
4.1911
4.2911
4.3911
4.4911
4.5911
4.6911
4.7911
4.8911
5.0000
y =
0
0.0001
0.0005
0.0025
0.0125
0.0625
0.3129
1.5732
8.0862
17.6281
27.9249
39.0424
51.0526
64.0337
78.0708
93.2571
109.6940
129.1469
当x=5时,y=129.1469
实验七
7.1用二分法求下列方程在指定区间[a,b]上的实根近似值:(要求误差不超过0.01)
(1)x-sinx-1=0,[a,b]=[1,3];
(2)xsin x=1,[a,b]=[0,1.5].
解;(1)运行程序:
a=1;b=3;k=0;
y1=a-sin(a)-1;
while(b-a)>0.01
k=k+1;
x0=(a+b)/2;x(k)=x0;
y0=x0-sin(x0)-1;y(k)=y0;
if y0*y1<0
b=x0;
else
a=x0;
y1=y0;
end
end
disp([x' y'])
运行结果:
[ 2, 408488074749405/4503599627370496]
[ 3/2, -4481036472577419/9007199254740992]
[ 7/4, -1053779023151395/4503599627370496]
[ 15/8, -712341393175443/9007199254740992]
[ 31/16, 8975041611503/2251799813685248]
[ 61/32, -85593294866561/2251799813685248]
[ 123/64, -154268929443443/9007199254740992]
[ 247/128, -7430218095237/1125899906842624]
[ 495/256, -11835035444387/9007199254740992]
[ 991/512, 93879030099/70368744177664]
[ 1981/1024, 10840787111/1125899906842624]
[ 3961/2048, -5875158237047/9007199254740992]
[ 7923/4096, -723616715653/2251799813685248]
[ 15847/8192, -701966501541/4503599627370496]
[ 31695/16384, -164654758197/2251799813685248]
(2) 运行程序:
a=0.1;b=1.5;k=0;
y1=a*sin(a)-1;
while(b-a)>0.01
k=k+1;
x0=(a+b)/2;x(k)=x0;
y0=x0 *sin(x0)-1;y(k)=y0;
if y0*y1<0
b=x0;
else
a=x0;
y1=y0;
end
end
disp([x' y'])
运行结果:
[ 4/5, -3838103856873717/9007199254740992]
[ 23/20, 55933053762297/1125899906842624]
[ 39/40, -1738305320249353/9007199254740992]
[ 17/16, -323478390340705/4503599627370496]
[ 177/160, -98943562990273/9007199254740992]
[ 361/320, 21826383383843/1125899906842624]
[ 143/128, 18951300402293/4503599627370496]
[ 1423/1280, -7626403754673/2251799813685248]
[ 495/256, -11835035444387/9007199254740992]
[ 991/512, 93879030099/70368744177664]
[ 1981/1024, 10840787111/1125899906842624]
[ 3961/2048, -5875158237047/9007199254740992]
[ 7923/4096, -723616715653/2251799813685248]
[ 15847/8192, -701966501541/4503599627370496]
[ 31695/16384, -164654758197/2251799813685248]
7.2方程xsin x=1的根实际上是两个函数y1(x)=sin x,y2(x)=的交点,用计算机绘出两个函数在区间[0.2,6]的图形如下,观察图形,分析它们的交点分布规律及特点,试写出方程的全部实根所在的隔根区间,并给出每一根的近似值。用计算机绘出区间[-6,0.2]上两个函数的图形,观察交点所在位置验证你的分析结果。
解:1,运行程序:
function [x,k]=ntf(fun,dfun,x0,eps,N)
if nargin<5
N=500;
end
if nargin<4
eps=1e-5;
end
k=1;
while k<N
x=x0-feval(fun,x0)/feval(dfun,x0);
if abs(x-x0)<eps
break;
end
x0=x;k=k+1;
end
if k==N
warning('已迭代次数上限');
end
format long
fun=inline('x*sin(x)-1');
dfun=inline('sin(x)+x*cos(x)');
[x,k]=ntf(fun,dfun,1,1e-8)
format long
fun=inline('x*sin(x)-1');
dfun=inline('sin(x)+x*cos(x)');
[x,k]=ntf(fun,dfun,1,1e-8)
运行结果:
(1)x =
1.114157140871930
k =
(2)x =
2.772604708265991
k =
5
2,画图验证
运行程序:
x=[-6:0.01*pi:0.2];
plot(x,sin(x))
hold on
syms t
fplot('1/t',[-6,0.2 -5 1])
实验八
8.1分别用直接法、雅可比迭代法、赛德尔迭代法求解线性方程组AX=b。
(1),
(2),
解:(1)a=ones(9);
c=4*ones(10);
A=diag(diag(c))+diag(diag(a),1)+diag(diag(a),-1);
b=[2;1;1;1;1;1;1;1;1;2];
B=[A,b];
直接法
A\b
ans =
0.479271991911021
0.082912032355915
0.189079878665319
0.160768452982811
0.167846309403438
0.167846309403438
0.160768452982811
0.189079878665319
0.082912032355915
0.479271991911021
Jacobi法
Jocobi.m文件
function Jacobi(A,b,X0,P,error,max1)
[n n]=size(A);
X=zeros(n,1);
for k=1:max1
for j=1:n
X(j)=(b(j)-A(j,[1:j-1,j+1:n])*X0([1:j-1,j+1:n]))/A(j,j);
end
X
errX=norm(X-X0,P);
X0=X;X1=A\b;
if(errX<error)
disp('gvgfvgvg')
k
X1
X
return
end
end
if(errX>=error)
disp('fgjsdj')
end
x0=[0;0;0;0;0;0;0;0;0;0];
Jacobi(A,b,x0,inf,0.001,100);
X =
0.479339599609375
0.083126068115234
0.189273834228516
0.161083221435547
0.168136596679688
0.168136596679688
0.161083221435547
0.189273834228516
0.083126068115234
0.479339599609375
Gauss-Seidel法
GS.m文件
function GS(A,b,X0,p,error,max1)
[n n]=size(A);
X=zeros(n,1);
for k=1:max1
for j=1:n
XX=0;
for i=1:n
if i<j
XX=XX+A(j,i)*X(i);
end
if i>j
XX=XX+A(j,i)*X0(i);
end
end
X(j)=(b(j)-XX)/A(j,j);
end
X
errX=norm(X-X0,p);
X0=X;X1=A\b;
if (errX<error)
disp('fgdfgh')
k
X1
X
return
end
end
if(errX>=error)
disp('fghdgh')
end
x0=[0;0;0;0;0;0;0;0;0;0];
GS(A,b,x0,inf,0.001,100);
X =
0.479258537292480
0.082895755767822
0.189098805189133
0.160642772912979
0.168022973462939
0.167701403144747
0.160854891291820
0.189039459481137
0.082926839553693
0.479268290111577
(2)b=[1;zeros(19,1)];
a=ones(18);
c=-2*ones(19);
d=5*ones(20);
A=diag(diag(d))+diag(diag(c),1)+diag(diag(a),2)+diag(diag(c),-1)+diag(diag(a),-2);
直接法
A\b
ans =
0.242121373548085
0.094391354624679
-0.021824158491067
-0.031362343009361
-0.006942557862112
0.004886927715767
0.003586117214438
0.000214823135181
-0.000784526508185
-0.000357861979163
0.000050437638520
0.000106309021306
0.000029232399870
-0.000014343050585
-0.000012667696430
-0.000001464361499
0.000002491258113
0.000001311981447
-0.000000093354238
-0.000000299737984
Jacobi法
x0=zeros(20,1);
Jacobi(A,b,x0,inf,0.001,100);
X =
1.0e+004 *
-0.282108278571715
0.482046406301265
-0.691953755956788
0.881266942075170
-1.052917666958734
1.201300209540189
-1.323751707356039
1.417537614867594
-1.480729230135441
1.512024114086328
-1.510826617470714
1.477238795829799
-1.412052361535888
1.316740113244093
-1.193359966404892
1.044725887301585
-0.873531574715016
0.685309155022675
-0.477119828561115
0.279134060154729
Gauss-Seidel法
GS(A,b,x0,inf,0.001,100)
X =
0.242291716096000
0.094772508426240
-0.021622113173504
-0.031486093950976
-0.007147457511424
0.004823645877699
0.003646069302467
0.000276912358545
-0.000775064735627
-0.000377224589581
0.000036657163528
0.000106214002021
0.000034034876168
-0.000011898463693
-0.000013058584947
-0.000002452084524
0.000002141863702
0.000001452223072
0.000000069366020
-0.000000262698207
青岛农业大学本科生课程论文题目数值分析课程设计姓名杨宝赟学院理学与信息科学学院专业信息与计算科学专业班级20xx级2班学号20xx…
课程设计报告题目数值分析课程设计报告学院理学院班级数学与应用数学20xx级学生姓名戴铭学号20xx30470270提交日期20xx…
课程设计说明书班级姓名设计题目设计时间20xx31至20xx35指导教师评语评阅成绩华北科技学院课程设计设计任务和技术要求本课程设…
数值分析课程设计实验报告姓名陈浩学号081002102班级091002指导老师任林源完成日期20xx7目录一丶概述二丶设计内容三丶…
武汉理工大学数值分析课程设计说明书附件1课程设计题目学院专业班级姓名指导教师对求解方程实根的研究理学院信息与计算科学信计08012…
数值分析课程设计实验报告姓名陈浩学号081002102班级091002指导老师任林源完成日期20xx7目录一丶概述二丶设计内容三丶…
武汉大学数学与统计学院数值分析实验报告武汉大学数学与统计学院数值分析原始书记记录实验名称关于正定矩阵cholesky分解的研究实验…
武汉大学数学与统计学院数值分析实验报告武汉大学数学与统计学院数值分析原始书记记录实验名称关于正定矩阵cholesky分解的研究实验…
武汉大学数学与统计学院数值分析实验报告武汉大学数学与统计学院数值分析原始书记记录实验名称关于正定矩阵cholesky分解的研究实验…
一Newton插值法includeltstdiohgtdefineMAXN20typedefstructtagPOINTdoubl…