东南大学数值分析上机题matlab(前三章)
数值分析上机题
第一章(17题)
(1)从2依次累加到N 的程序
function sn = sum1( n )
sn=0;sn=single(sn);
for i=2:n
ai=1/(i^2-1);
sn=sn+ai;
end
end
(2)从N 依次累加到2的程序
function sn = sum2( n )
sn=0;sn=single(sn);
for i=n:-1:2
ai=1/(i^2-1);
sn=sn+ai;
end
end
(3)编制求精确值的求和函数sum0
function sn = sum0( n )
sn=0;sn=single(sn);
sn=1/2*(3/2-1/n-1/(n+1));
end
按第一种顺序得到的值及有效位数如下:
N=100时
sn0=sum0(100);
sn=sum1(100)
n=fix(-log10(2*abs(sn-sn0)))
得到:sn =0.7400495n =7
N=10e4时
sn0=sum0(10e4);
sn=sum1(10e4)
n=fix(-log10(2*abs(sn-sn0)))
得到:sn =0.7498521n =3
N=10e6时
sn0=sum0(10e6);
sn=sum1(10e6)
n=fix(-log10(2*abs(sn-sn0)))
得到:sn =0.7498521n =3
按第二种顺序得到的值及有效位数如下:
N=100时
sn0=sum0(100);
sn=sum2(100)
n=fix(-log10(2*abs(sn-sn0)))
得到:sn =0.7400495n =7
N=10e4时
sn0=sum0(10e4);
sn=sum2(10e4)
n=fix(-log10(2*abs(sn-sn0)))
得到:sn =0.7499900n =7
N=10e6时
sn0=sum0(10e6);
sn=sum2(10e6)
n=fix(-log10(2*abs(sn-sn0)))
得到:sn =0.7499999n =7
(4)通过这道上机题,我明白了,应用计算机进行求和运算时,求和的顺序不同对结果的精度是有影响的。具体而言,小数先求和,大数后求和算得的结果更精确;反之,则会出现“大数吃小数”的现象,从而精度会降低。
第二章(20题)
(1)用牛顿法解f (x )=0的根的通用程序如下:
function x = newton( f,df,x0,ep )
%用牛顿法解f (x )=0的根
%f为待求解函数,df 为f 的导函数,x0为迭代初值,ep 为允许误差
epi=100;
%为了保证能进入下列循环,epi 取一个大于ep 的初值,取epi=100
forepi>ep
x=x0-feval(f,x0)/feval(df,x0);
epi=abs(x-x0);
x0=x;
end
end
(2)
1)编程算法如下:
显然x0=0时,迭代序列收敛于根x2。设置步长b=0.00001,从x0=0开始每次加一个步长b, 然后判断迭代序列是否收敛于根x2, 若收敛于根x2,则继续加
步长b ;若不收敛与根x2,则退出循环,此时的x0即为题中所求的尽可能大的δ。
程序如下:
正向找:
f=@(x)x^3/3-x;
df=@(x)x^2-1;
x0=0;x=0;
while x==0
x=newton(f,df,x0,1e-10);
x0=x0+0.00001;
end
x0
得到:x0 =0.77461
负向找
f=@(x)x^3/3-x;
df=@(x)x^2-1;
x0=0;x=0;
while x==0
x=newton(f,df,x0,1e-10);
x0=x0-0.00001;
end
x0
得到
x0 =-0.77461
故δ=0.77461
2)取x0∈(-∞,-1),x0=-100
f=@(x)x^3/3-x;
df=@(x)x^2-1;
x=newton(f,df,-100,1e-10)
收敛于:x =-1.7321
取x0∈(-1,-0.77461),x0=-0.79
f=@(x)x^3/3-x;
df=@(x)x^2-1;
x=newton(f,df,-0.79,1e-10)
收敛于:x = -1.7321
取x0∈(-0.77461, 0.77461),x0=-0.76
f=@(x)x^3/3-x;
df=@(x)x^2-1;
x=newton(f,df,-0.76,1e-10)
收敛于:x =0
取x0∈(-0.77461, 0.77461),x0=0.77
f=@(x)x^3/3-x;
df=@(x)x^2-1;
x=newton(f,df,0.77,1e-10)
收敛于:x =0
取x0∈(0.77461, 1),x0=0.79
f=@(x)x^3/3-x;
df=@(x)x^2-1;
x=newton(f,df,0.79,1e-10)
收敛于:x =1.7321
取x0∈(1, +∞),x0=100
f=@(x)x^3/3-x;
df=@(x)x^2-1;
x=newton(f,df,100,1e-10)
收敛于:x =1.7321
(3)通过这道上机题表明,用牛顿迭代法求解方程的根的时候,迭代初值的取值很重要,迭代初值取值不同,迭代序列将收敛于不同的根(有时甚至是发散的)。此外,用牛顿法求得解的精确程度取决于设定的允许误差。
第三章(39题)
(1)列主元高斯消去法通用程序如下:
function [x] =mgauss(A,b)
%用列主元高斯消去法求解线性方程组Ax=b
n=length(b);
%求得方程组未知数个数
%对原方程组进行变换,得到上三角矩阵
for k=1:(n-1)
%k的每次取值对应第k 步消元
[ap,p]=max(abs(A(k:n,k)));
p=p+k-1;
%找出列主元所在位置
if p>k
A([k p],:)=A([p k],:);
b([k p],:)=b([p k],:);
end
%交换第k,p 两行
m=A(k+1:n,k)/A(k,k);
%得到消元因子,用一个列向量m 存储
A(k+1:n,k+1:n)=A(k+1:n,k+1:n)-m*A(k,k+1:n);
b(k+1:n)=b(k+1:n)-m*b(k);
A(k+1:n,k)=zeros(n-k,1);
%消元过程
end
%回代过程
x=zeros(n,1);
x(n)=b(n)/A(n,n);
for k=n-1:-1:1
x(k)=(b(k)-A(k,k+1:n)*x(k+1:n))/A(k,k);
end
end
(2)R=
31 -13 0 0 0 -10 0 0 0
-13 35 -9 0 -11 0 0 0 0
0 -9 31 -10 0 0 0 0 0
0 0 -10 79 -30 0 0 0 -9
0 0 0 -30 57 -7 0 -5 0
0 0 0 0 -7 47 -30 0 0
0 0 0 0 0 -30 41 0 0
0 0 0 0 -5 0 0 27 -2
0 0 0 -9 0 0 0 -2 29
Vt =
-15
27
-23
-20
12
-7
7
10
编写语句:
format short g
I=mgauss(R,Vt)
解得:I =
-0.28923
0.34544
-0.71281
-0.22061
-0.4304
0.15431
-0.057823
0.20105
0.29023
(3)通过本题的编程过程,我对列主元高斯消去法有了更深入的理解;掌握了循环语句的运用,矩阵的运算方法,以及输出方法的运用。