数值计算方法程序设计.docx
《数值计算方法程序设计.docx》由会员分享,可在线阅读,更多相关《数值计算方法程序设计.docx(29页珍藏版)》请在冰豆网上搜索。
数值计算方法程序设计
1.用matlab编写拉格朗日插值算法的程序并且以(x=-2.00,f(x)=17.00x=0.00,f(x)=1.00x=1.00,f(x)=2.00x=2.00,f(x)=17.00)为数据基础,在整个插值区间上采用拉格朗日插值算法计算f(x=0.6),写出程序源代码,输出计算结果
x0=-2.00;x1=0.00;x2=1.00;x3=2.00;
y0=17.00;y1=1.00;y2=2.00;y3=17.00;
x=0.6
y=(x-x1).*(x-x2).*(x-x3)/((x0-x1).*(x0-x2).*(x0-x3))*y0+(x-x0).*(x-x2).*(x-x3)/((x1-x0).*(x1-x2).*(x1-x3))*y1+(x-x0).*(x-x1).*(x-x3)/((x2-x0).*(x2-x1).*(x2-x3))*y2+(x-x0).*(x-x1).*(x-x2)/((x3-x0).*(x3-x1).*(x3-x2))*y3;
disp('y=');disp(y);
结果为:
x=
0.6000
y=
0.2560
2.追赶法
functionx=zhuiganfa
%首先说明:
追赶法是适用于三对角矩阵的线性方程组求解的方法,并不适用于其他类型矩阵。
%定义三对角矩阵A的各组成单元。
方程为Ax=d
%b为A的对角线元素(1~n),a为-1对角线元素(2~n),c为+1对角线元素(1~n-1)。
%A=[2-100
%-13-20
%0-24-3
%00-35]
a=[0-1-2-3];c=[-1-2-3];b=[2345];d=[61-21];
n=length(b);
u0=0;y0=0;a
(1)=0;
%“追”的过程
L
(1)=b
(1)-a
(1)*u0;
y
(1)=(d
(1)-y0*a
(1))/L
(1);
u
(1)=c
(1)/L
(1);
fori=2:
(n-1)
L(i)=b(i)-a(i)*u(i-1);
y(i)=(d(i)-y(i-1)*a(i))/L(i);
u(i)=c(i)/L(i);
end
L(n)=b(n)-a(n)*u(n-1);
y(n)=(d(n)-y(n-1)*a(n))/L(n);
%“赶”的过程
x(n)=y(n);
fori=(n-1):
-1:
1
x(i)=y(i)-u(i)*x(i+1);
end
3.特征向量的计算,幂法
5.2.2幂法的MATLAB程序
用幂法计算矩阵
的主特征值和对应的特征向量的MATLAB主程序
function[k,lambda,Vk,Wc]=mifa(A,V0,jd,max1)
lambda=0;k=1;Wc=1;,jd=jd*0.1;state=1;V=V0;
while((k<=max1)&(state==1))
Vk=A*V;[mj]=max(abs(Vk));mk=m;
tzw=abs(lambda-mk);Vk=(1/mk)*Vk;
Txw=norm(V-Vk);Wc=max(Txw,tzw);V=Vk;lambda=mk;state=0;
if(Wc>jd)
state=1;
end
k=k+1;Wc=Wc;
end
if(Wc<=jd)
disp('请注意:
迭代次数k,主特征值的近似值lambda,主特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
')
else
disp('请注意:
迭代次数k已经达到最大迭代次数max1,主特征值的迭代值lambda,主特征向量的迭代向量Vk,相邻两次迭代的误差Wc如下:
')
end
Vk=V;k=k-1;Wc;
例5.2.2用幂法计算下列矩阵的主特征值和对应的特征向量的近似向量,精度
.并把
(1)和
(2)输出的结果与例5.1.1中的结果进行比较.
(1)
;
(2)
;(3)
;(4)
.
解
(1)输入MATLAB程序
>>A=[1-1;24];V0=[1,1]';
[k,lambda,Vk,Wc]=mifa(A,V0,0.00001,100),
[V,D]=eig(A),Dzd=max(diag(D)),wuD=abs(Dzd-lambda),wuV=V(:
2)./Vk,
运行后屏幕显示结果
请注意:
迭代次数k,主特征值的近似值lambda,主特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
k=lambda=Wc=
333.000001738368048.691862856124999e-007
Vk=V=wuV=
-0.49999942054432-0.707106781186550.44721359549996-0.89442822756294
1.000000000000000.70710678118655-0.89442719099992-0.89442719099992
Dzd=wuD=
31.738368038406435e-006
由输出结果可看出,迭代33次,相邻两次迭代的误差Wc
8.6919e-007,矩阵
的主特征值的近似值lambda
3.00000和对应的特征向量的近似向量Vk
(-0.50000,1.00000
lambda与例5.1.1中
的最大特征值
近似相等,绝对误差约为1.73837e-006,Vk与特征向量
的第1个分量的绝对误差约等于0,第2个分量的绝对值相同.由wuV可以看出,
的特征向量V(:
2)与Vk的对应分量的比值近似相等.因此,用程序mifa.m计算的结果达到预先给定的精度
.
(2)输入MATLAB程序
>>B=[123;213;336];V0=[1,1,1]';
[k,lambda,Vk,Wc]=mifa(B,V0,0.00001,100),[V,D]=eig(B),
Dzd=max(diag(D)),wuD=abs(Dzd-lambda),wuV=V(:
3)./Vk,
运行后屏幕显示结果
请注意:
迭代次数k,主特征值的近似值lambda,主特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
k=lambda=Wc=Dzd=wuD=
39090
Vk=wuV=
0.500000000000000.81649658092773
0.500000000000000.81649658092773
1.000000000000000.81649658092773
V=
0.707106781186550.577350269189630.40824829046386
-0.707106781186550.577350269189630.40824829046386
0-0.577350269189630.81649658092773
(3)输入MATLAB程序
>>C=[122;1-11;4-121];V0=[1,1,1]';
[k,lambda,Vk,Wc]=mifa(C,V0,0.00001,100),[V,D]=eig(C),
Dzd=max(diag(D)),wuD=abs(Dzd-lambda),
Vzd=V(:
1),wuV=V(:
1)./Vk,
运行后屏幕显示
请注意:
迭代次数k已经达到最大迭代次数max1,主特征值的迭代值lambda,主特征向量的迭代向量Vk,相邻两次迭代的误差Wc如下:
k=lambda=Wc=
1000.090909090909102.37758124193119
Dzd=wuD=
1.000000000000010.90909090909091
Vk=Vzd=wuV=
0.999999999999930.904534033733290.90453403373335
0.999999999999950.301511344577760.30151134457778
1.00000000000000-0.30151134457776-0.30151134457776
由输出结果可见,迭代次数k已经达到最大迭代次数max1=100,并且lambda的相邻两次迭代的误差Wc
2.37758>2,由wuV可以看出,lambda的特征向量Vk与真值Dzd的特征向量Vzd对应分量的比值相差较大,所以迭代序列发散.实际上,实数矩阵C的特征值的近似值为
,并且对应的特征向量的近似向量分别为
=
(0.90453403373329,0.30151134457776,-0.30151134457776)
,
(-0.72547625011001,-0.21764287503300-0.07254762501100i,
0.58038100008801-0.29019050004400i)
,
(-0.72547625011001,-0.21764287503300+0.07254762501100i,
0.58038100008801+0.29019050004400i)
是常数).
(4)输入MATLAB程序
>>D=[-4140;-5130;-102];V0=[1,1,1]';
[k,lambda,Vk,Wc]=mifa(D,V0,0.00001,100),[V,Dt]=eig(D),
Dtzd=max(diag(Dt)),wuDt=abs(Dtzd-lambda),
Vzd=V(:
2),wuV=V(:
2)./Vk,
运行后屏幕显示结果
请注意:
迭代次数k,主特征值的近似值lambda,主特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
k=lambda=Wc=
196.000006539495286.539523793591684e-006
Dtzd=wuDt=
6.000000000000006.539495284840768e-006
Vk=Vzd=wuV=
0.797400480535640.797400480535640.79740048053564
0.714285947838860.569571771811170.79740021980618
-0.24999918247180-0.199********3910.79740308813370
(一)原点位移反幂法的MATLAB主程序1
用原点位移反幂法计算矩阵
的特征值和对应的特征向量的MATLAB主程序1
function[k,lambdan,Vk,Wc]=ydwyfmf(A,V0,jlamb,jd,max1)
[n,n]=size(A);A1=A-jlamb*eye(n);jd=jd*0.1;RA1=det(A1);
ifRA1==0
disp('请注意:
因为A-aE的n阶行列式hl等于零,所以A-aE不能进行LU分解.')
return
end
lambda=0;
ifRA1~=0
forp=1:
n
h(p)=det(A1(1:
p,1:
p));
end
hl=h(1:
n);
fori=1:
n
ifh(1,i)==0
disp('请注意:
因为A-aE的r阶主子式等于零,所以A-aE不能进行LU分解.')
return
end
end
ifh(1,i)~=0
disp('请注意:
因为A-aE的各阶主子式都不等于零,所以A-aE能进行LU分解.')
k=1;Wc=1;state=1;Vk=V0;
while((k<=max1)&(state==1))
[LU]=lu(A1);Yk=L\Vk;Vk=U\Yk;[mj]=max(abs(Vk));
mk=m;Vk1=Vk/mk;Yk1=L\Vk1;Vk1=U\Yk1;
[mj]=max(abs(Vk1));mk1=m;Vk2=(1/mk1)*Vk1;tzw1=abs((mk-mk1)/mk1);
tzw2=abs(mk1-mk);Txw1=norm(Vk)-norm(Vk1);
Txw2=(norm(Vk)-norm(Vk1))/norm(Vk1);
Txw=min(Txw1,Txw2);tzw=min(tzw1,tzw2);Vk=Vk2;
mk=mk1;Wc=max(Txw,tzw);Vk=Vk2;mk=mk1;state=0;
if(Wc>jd)
state=1;
end
k=k+1;%Vk=Vk2,mk=mk1,
end
if(Wc<=jd)
disp('A-aE的秩R(A-aE)和各阶顺序主子式值hl、迭代次数k,按模最小特征值的近似值lambda,特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
')
else
disp('A-aE的秩R(A-aE)和各阶顺序主子式值hl、迭代次数k已经达到最大迭代次数max1,按模最小特征值的迭代值lambda,特征向量的迭代向量Vk,相邻两次迭代的误差Wc如下:
')
end
hl,RA1
end
end
[V,D]=eig(A,'nobalance'),Vk;k=k-1;Wc;lambdan=jlamb+1/mk1;
例5.3.2用原点位移反幂法的迭代公式(5.28),根据给定的下列矩阵的特征值
的初始值
,计算与
对应的特征向量
的近似向量,精确到0.0001.
(1)
;
(2)
,
;(3)
,
.
解
(1)输入MATLAB程序
>>A=[1-10;-24-2;0-12];V0=[1,1,1]';
[k,lambda,Vk,Wc]=ydwyfmf(A,V0,0.2,0.0001,10000)
运行后屏幕显示结果
请注意:
因为A-aE的各阶主子式都不等于零,所以A-aE能进行LU分解.
A-aE的秩R(A-aE)和各阶顺序主子式值hl、迭代次数k,按模最小特征值的近似值lambda,特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
k=lambda=Wc=hl=
30.23841.0213e-0070.80001.04000.2720
Vk=V=D=
1.0000-0.2424-1.0000-0.57075.124900
0.76161.0000-0.76160.363300.23840
0.4323-0.3200-0.43231.0000001.6367
(2)输入MATLAB程序
>>A=[1-1;24];V0=[20,1]';
[k,lambda,Vk,Wc]=ydwyfmf(A,V0,2.001,0.0001,100)
运行后屏幕显示结果
请注意:
因为A-aE的各阶主子式都不等于零,所以A-aE能进行LU分解.
A-aE的秩R(A-aE)和各阶顺序主子式值hl、迭代次数k,按模最小特征值的近似值lambda,特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
k=lambda=Wc=hl=
22.00205.1528e-007-1.0010-0.0010
Vk=V=D=
1.0000-1.00000.500020
-1.00001.0000-1.000003
(3)输入MATLAB程序
>>A=[-11215;2583;153-3];V0=[1,1,-1]';
[k,lambdan,Vk,Wc]=ydwyfmf(A,V0,8.26,0.0001,100)
运行后屏幕显示结果
请注意:
因为A-aE的各阶主子式都不等于零,所以A-aE能进行LU分解.
A-aE的秩R(A-aE)和各阶顺序主子式值hl、迭代次数k,按模最小特征值的近似值lambda,特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
k=lambdan=Wc=hl=
28.26406.9304e-008-19.2600-961.9924-6.1256
Vk=V=D=
-0.76920.79280.60810.0416-22.524900
0.09120.0030-0.07210.997408.26400
-1.0000-0.60950.79060.05900058.2609
例5.3.3用原点位移反幂法的迭代公式(5.28),计算
的分别对应于特征值
,
,
的特征向量
,
,
的近似向量,相邻迭代误差为0.001.将计算结果与精确特征向量比较.
解
(1)计算特征值
对应的特征向量
的近似向量.输入MATLAB程序
>>A=[011-5;-217-7;-426-10];V0=[1,1,1]';
[k,lambda,Vk,Wc]=ydwyfmf(A,V0,1.001,0.001,100),
[V,D]=eig(A);
Dzd=min(diag(D)),wuD=abs(Dzd-lambda),
VD=V(:
1),wuV=V(:
1)./Vk,
运行后屏幕显示结果
请注意:
因为A-aE的各阶主子式都不等于零,所以A-aE能进行LU分解.
A-aE的秩R(A-aE)和各阶顺序主子式值hl、迭代次数k,按模最小特征值的近似值lambda,特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
hl=
-1.001000000000005.98500100000000-0.00299600100000
k=lambda=RA1=
51.00200000000000-0.00299600100000
Vk=VD=wuV=
-0.50000000000000-0.408248290463860.81649658092773
-0.50000000000000-0.408248290463860.81649658092773
-1.00000000000000-0.816496580927730.81649658092773
Wc=Dzd=wuD=
1.378794763695562e-0091.000000000000000.00200000000000
从输出的结果可见,迭代5次,特征向量
的近似向量
的相邻两次迭代的误差Wc
1.379e-009,由wuV可以看出,
=Vk与VD的对应分量的比值相等.特征值
的近似值lambda
1.002与初始值
1.001的绝对误差为0.001,而与
的绝对误差为0.002,其中
.
(2)计算特征值
对应特征向量
的近似向量.
输入MATLAB程序
>>A=[011-5;-217-7;-426-10];V0=[1,1,1]';
[k,lambda,Vk,Wc]=ydwyfmf(A,V0,2.001,0.001,100),
[V,D]=eig(A);WD=lambda-D(2,2),VD=V(:
2),wuV=V(:
2)./Vk,
运行后屏幕显示结果
请注意:
因为A-aE的各阶主子式都不等于零,所以A-aE能进行LU分解.
A-aE的秩R(A-aE)和各阶顺序主子式值hl、迭代次数k,按模最小特征值的近似值lambda,特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
hl=
-2.00100000000000-8.012999000000000.00200099900000
k=Wc=lambda=WD=
23.131********2120e-0072.002000000000160.00200000000016
Vk=VD=wuV=
-0.249999999999990.21821789023599-0.87287156094401
-0.499999999999990.43643578047198-0.87287156094398
-1.000000000000000.87287156094397-0.87287156094397
从输出的结果可见,迭代2次,特征向量
的近似向量
的相邻两次迭代的误差Wc
3.131e-007,
与
的对应分量的比值近似相等.特征值
的近似值lambda
2.002与初始值
2.001的绝对误差约为0.001,而lambda与
的绝对误差约为0.002,其中
.
(3)计算特征值
对应特征向量
的近似向量.输入MATLAB程序
>>A=[011-5;-217-7;-426-10];V0=[1,1,1]';
[k,lambda,Vk,Wc]=ydwyfmf(A,V0,4.001,0.001,100)
[V,D]=eig(A);WD=lambda-max(diag(D)),VD=V(:
3),wuV=V(:
3)./Vk,
运行后屏幕显示结果
请注意:
因为A-aE的各阶主子式都不等于零,所以A-aE能进行LU分解.
A-aE的秩R(A-aE)和各阶顺序主子式值hl、迭代次数k,按模最小特征值的近似值lambda,特征向量的近似向量Vk,相邻两次迭代的误差Wc如下:
hl=
-4.00100000000000-30.00899900000000-0.00600500099999
k=lambda=Wc=WD=
24.001999999999901.996084182914842e-0070.00199999999990
Vk=VD=wuV=
0.40000000000001-0.32444284226153-0.81110710565380
0.60000000000001-0.48666426339229-0.81110710565381
1.00000000000000-0.81110710565381-0.81110710565381
从输出的结果可见,迭代2次,特征向量
的近似向量
的相邻两次迭代的误差Wc
1.996e-007,
与
的对应分量的比值近似相等.特征值
的近似值
的绝对误差近似为
,而lambda与
的绝对误差约为0.002,其中
-0.40000000000000,-0.60000000000000,-1.00000000000000
.
(二)原点位移反幂法的MATLAB主程序2
用原点位移反幂法计算矩阵
的特征值和对应的特征向量的MATLAB主程序2
function[k,lambdan,Vk,Wc]=wfmifa1(A,V0,jlamb,jd,max1)
[n,n]=size(A);jd=jd*0.1