《數值分析》計算實習題
姓名:
學號:
班級:
第二章
1、程序代碼
Clear;clc;
x1=[0.2
0.4
0.6
0.8
1.0];
y1=[0.98
0.92
0.81
0.64
0.38];
n=length(y1);
c=y1(:);
for
j=2:n
%求差商
for
i=n:-1:j
c(i)=(c(i)-c(i-1))/(x1(i)-x1(i-j+1));
end
end
syms
x
df
d;
df(1)=1;d(1)=y1(1);
for
i=2:n
%求牛頓差值多項式
df(i)=df(i-1)*(x-x1(i-1));
d(i)=c(i-1)*df(i);
end
P4=vpa(sum(d),5)
%P4即為4次牛頓插值多項式,并保留小數點后5位數
pp=csape(x1,y1,'variational');%調用三次樣條函數
q=pp.coefs;
q1=q(1,:)*[(x-.2)^3;(x-.2)^2;(x-.2);1];
q1=vpa(collect(q1),5)
q2=q(1,:)*[(x-.4)^3;(x-.4)^2;(x-.4);1];
q2=vpa(collect(q2),5)
q3=q(1,:)*[(x-.6)^3;(x-.6)^2;(x-.6);1];
q3=vpa(collect(q3),5)
q4=q(1,:)*[(x-.8)^3;(x-.8)^2;(x-.8);1];
q4=vpa(collect(q4),5)%求解并化簡多項式
2、運行結果
P4
=
0.98*x
0.3*(x
0.2)*(x
0.4)
0.625*(x
0.2)*(x
0.4)*(x
0.6)
0.20833*(x
0.2)*(x
0.4)*(x
0.8)*(x
0.6)
+
0.784
q1
=
1.3393*x^3
+
0.80357*x^2
0.40714*x
+
1.04
q2
=
1.3393*x^3
+
1.6071*x^2
0.88929*x
+
1.1643
q3
=
1.3393*x^3
+
2.4107*x^2
1.6929*x
+
1.4171
q4
=
1.3393*x^3
+
3.2143*x^2
2.8179*x
+
1.86293、問題結果
4次牛頓差值多項式=
0.98*x
0.3*(x
0.2)*(x
0.4)
0.625*(x
0.2)*(x
0.4)*(x
0.6)
0.20833*(x
0.2)*(x
0.4)*(x
0.8)*(x
0.6)
+
0.784
三次樣條差值多項式
第三章
1、程序代碼
Clear;clc;
x=[0
0.1
0.2
0.3
0.5
0.8
1];
y=[1
0.41
0.5
0.61
0.91
2.02
2.46];
p1=polyfit(x,y,3)%三次多項式擬合p2=polyfit(x,y,4)%四次多項式擬合y1=polyval(p1,x);
y2=polyval(p2,x);%多項式求值
plot(x,y,'c--',x,y1,'r:',x,y2,'y-.')
p3=polyfit(x,y,2)%觀察圖像,類似拋物線,故用二次多項式擬合。
y3=polyval(p3,x);
plot(x,y,'c--',x,y1,'r:',x,y2,'y-.',x,y3,'k--')%畫出四種擬合曲線
2、運行結果
p1
=
-6.6221
12.8147
-4.6591
0.9266
p2
=
2.8853
-12.3348
16.2747
-5.2987
0.9427
p3
=
3.1316
-1.2400
0.73563、問題結果
三次多項式擬合P1=
四次多項式擬合P2=
二次多項式擬合P3=
第四章
1、程序代碼
1)建立函數文件f.m:
function
y=fun(x);
y=sqrt(x)*log(x);
2)編寫程序:
a.利用復化梯形公式及復化辛普森公式求解:
Clear;clc;
h=0.001;%h為步長,可分別令h=1,0.1,0.01,0.001
n=1/h;t=0;s1=0;s2=0;
for
i=1:n-1
t=t+f(i*h);
end
T=h/2*(0+2*t+f(1));T=vpa(T,7)
%梯形公式
for
i=0:n-1
s1=s1+f(h/2+i*h);
end
for
i=1:n-1
s2=s2+f(i*h);
end
S=h/6*(0+4*s1+2*s2+f(1));S=vpa(S,7)
%辛普森公式
a’復化梯形公式和復化辛普生公式程序代碼也可以是:
Clear;clc;
x=0:0.001:1;
%h為步長,可分別令h=1,0.1,0.01,0.001
y=sqrt(x).*log(x+eps);
T=trapz(x,y);
T=vpa(T,7)
(只是h=1的運行結果不一樣,T=1.110223*10^(-16),而其余情況結果都相同)
Clear;clc;
f=inline('sqrt(x).*log(x)',x);
S=quadl(f,0,1);
S=vpa(S,7)
b.利用龍貝格公式求解:
Clear;clc;
m=14;%m+1即為二分次數
h=2;
for
i=1:m
h=h/2;n=1/h;t=0;
for
j=1:n-1
t=t+f(j*h);
end
T(i)=h/2*(0+2*t+f(1));%梯形公式
end
for
i=1:m-1
for
j=m:i+1
T(j)=4^i/(4^i-1)*T(j)-1/(4^i-1)*T(j-1);
%通過不斷的迭代求得T(j),即T表的對角線上的元素。
end
end
vpa(T(m),7)
2、運行結果
T
=
-0.4443875
S
=
-0.4444345
ans
=
-0.44444143、問題結果
a.利用復合梯形公式及復合辛普森公式求解:
步長h
0.1
0.01
0.001
梯形求積T=
0
[1.110223*10^(-16)]
-0.4170628
-0.4431179
-0.4443875
辛普森求積S=
-0.3267527
-0.4386308
-0.4441945
-0.4444345
b.利用龍貝格公式求解:
通過15次二分,得到結果:-0.4444414
第五章
1、程序代碼
(1)LU分解解線性方程組:
Clear;clc;
A=[10
0
2.099999
0
2];
b=[8;5.900001;5;1];
[m,n]=size(A);
L=eye(n);
U=zeros(n);
flag='ok';
for
i=1:n
U(1,i)=A(1,i);
end
for
r=2:n
L(r,1)=A(r,1)/U(1,1);
end
for
i=2:n
for
j=i:n
z=0;
for
r=1:i-1
z=z+L(i,r)*U(r,j);
end
U(i,j)=A(i,j)-z;
end
if
abs(U(i,i)) flag='failure' return; end for k=i+1:n m=0; for q=1:i-1 m=m+L(k,q)*U(q,i); end L(k,i)=(A(k,i)-m)/U(i,i); end end L U y=L\b;x=U\y detA=det(L*U) (2)列主元消去法: function x = gauss(A,b); A=[10 0 1;-3 2.099999 2;5 -1;2 0 2]; b=[8;5.900001;5;1]; [n,n] = size(A); x = zeros(n,1); Aug = [A,b]; %增廣矩陣 for k = 1:n-1 [piv,r] = max(abs(Aug(k:n,k))); %找列主元所在子矩陣的行r r = r + k 1; % 列主元所在大矩陣的行 if r>k temp=Aug(k,:); Aug(k,:)=Aug(r,:); Aug(r,:)=temp; end if Aug(k,k)==0,error(‘對角元出現0’),end % 把增廣矩陣消元成為上三角 for p = k+1:n Aug(p,:)=Aug(p,:)-Aug(k,:)*Aug(p,k)/Aug(k,k); end end % 解上三角方程組 A = Aug(:,1:n); b = Aug(:,n+1); x(n) = b(n)/A(n,n); for k = n-1:-1:1 x(k)=b(k); for p=n:-1:k+1 x(k) = x(k)-A(k,p)*x(p); end x(k)=x(k)/A(k,k); end detA=det(A) 2、運行結果 1) LU分解解線性方程組 L = 1.0e+006 * 0.0000 0 0 0 -0.0000 0.0000 0 0 0.0000 -2.5000 0.0000 0 0.0000 -2.4000 0.0000 0.0000 U = 1.0e+007 * 0.0000 -0.0000 0 0.0000 0 -0.0000 0.0000 0.0000 0 0 1.5000 0.5750 0 0 0 0.0000 x = -0.0000 -1.0000 1.0000 1.0000 detA = -762.0001 2)列主元消去法 detA = 762.0001 ans = 0.0000 -1.0000 1.0000 1.00003、問題結果 1) LU分解解線性方程組 L= U= x=(0.0000,-1.0000,1.0000,1.0000)T detA=-762.001 2)列主元消去法 x=(0.0000,-1.0000,1.0000,1.0000)T detA=762.001 第六章 1、程序代碼 (1)Jacobi迭代 Clear;clc; n = 6; %也可取n=8,10 H = hilb(n); b = H * ones(n,1); e = 0.00001; for i = 1:n if H(i,i)==0 '對角元為零,不能求解' return end end x = zeros(n,1); k = 0; kend = 10000; r = 1; while k<=kend & r>e x0 = x; for i = 1:n s = 0; for j = 1:i s = s + H(i,j) * x0(j); end for j = i + 1:n s = s + H(i,j) * x0(j); end x(i) = b(i) / H(i,i) s / H(i,i); end r = norm(x x0,inf); k = k + 1; end if k>kend '迭代不收斂,失敗' else '求解成功' x k end (2)SOR迭代 1)程序代碼 function s = SOR(n,w); H = hilb(n); b = H*ones(n,1); e = 0.00001; for i = 1:n if H(i,i)==0 ‘對角線為零,不能求解’ return end end x = zeros(n,1); k = 0; kend = 10000; r = 1; while k<=kend & r>e x0 = x; for i = 1:n s = 0; for j = 1:i s = s + H(i,j) * x(j); end for j = i + 1:n s = s + H(i,j) * x0(j); end x(i) = (1 w) * x0(i) + w / H(i,i) * (b(i) s); end r = norm(x x0,inf); k = k + 1; end if k>kend '迭代不收斂,失敗' else '求解成功' x end 2) 從命令窗口中分別輸入: SOR(6,1) SOR(8,1) SOR(10,1) SOR(6,1.5) SOR(8,1.5) SOR(10,1.5) 2、運行結果 Jacobi迭代: ans = 迭代不收斂,失敗 SOR迭代: 第七章 1、程序代碼 (1)不動點迭代法 1)建立函數文件:g.m function f=g(x) f(1)=20/(x^2+2*x+10); 2)建立函數文件:bdd.m function [y,n] = bdd(x,eps) if nargin==1 eps=1.0e-8; elseif nargin<1 error return end x1 = g(x); n = 1; while (norm(x1-x)>=eps)&&(n<=10000) x = x1; x1 = g(x); n = n + 1; end y = x; n 3)從命令窗口輸入:bdd(0) (2)牛頓迭代 clear;clc; format long; m=8; %m為迭代次數,可分別令m=2,4,6,8,10 x=sym('x'); f=sym('x^3+2*x^2+10*x-20'); df=diff(f,x); FX=x-f/df; %牛頓迭代公式 Fx=inline(FX); disp('x='); x1=0.5; disp(x1); Eps=1E-8; k=0; while x0=x1; k=k+1; x1=feval(Fx,x1); %將x1代入牛頓迭代公式替代x1 disp(x1); %在屏幕上顯示x1 if k==m break; end end k,x12、運行結果 (1)不動點迭代法 >> bdd(0) n = ans = 1.3688 (2) 牛頓迭代 x= 0 1.*** 1.37***21 1.*** 1.*** 1.*** 1.*** 1.*** k = x1 = 1.*** 3、問題結果 (1)不動點迭代法 x=1.3688 n=25 收斂太慢 (2)牛頓迭代 初值取0 迭代次數k=8時,k x(k) 1.4666666 1.3715120 1.3688102 1.3688081 1.3688081 1.3688081 1.3688081