第一篇:數值分析課程實驗報告
《數值分析》課程實驗報告
實驗名稱 用二分法和迭代法求方程的根
成績
一、實驗目的
掌握利用二分法以及迭代法求方程近似根的方法,并學會運用 matlab 軟件編寫程序,求解出方程的根,對迭代法二分法進一步認識并靈活運用。
二、實驗內容
比較求方程 5 0xx e ? ? 的根,要求精確到小數點后的第 4 位 1.在區間[0,1]內用二分法; 2.用迭代法1/5kxkx e??,取初值00.25 x ?.三、算法描述
1、二分法:二分法是最簡單的求根方法,它是利用連續函數的零點定理,將汗根區間逐次減半縮小,取區間的中點構造收斂點列{ }來逼近根 x.2、迭代法:迭代法是一種逐次逼近的方法,其步驟是首先給定一個粗糙的初始值,然后用一個迭代公式反復修正這個值,知道滿足要求為止。
四、實驗步驟1、二分法:
(1)計算 f(x)在區間[0,1]端點處的值 f(0)和 f(1)的值;
(2)計算 f(x)在區間【0,1】的中點(0+1)/2=1/2 處的值 f((a+b)/2);
(3)如果函數值 f(1/2)=0,則 1/2 是 f(x)=0 的實根,輸出根 x,終止;否則繼續轉(4)繼續做檢驗。由于 f(1/2)≠0,所以繼續做檢驗。
(4)如果函數值 f(0)* f(1/2)<0,則根在區間[0,1/2]內,這時以 1/2 代表 1;否則以 1/2 代表 0;,此時應該用 1/2 代表 1.(5)重復執行(2)(3)(4)步,直到滿足題目所要求的精度,算法結束。2、迭代法
(1)提供迭代初值25.00? x;(2)計算迭代值)(0 1x x ? ?;
(3)檢查|0 1x x ?|,若? ? ? | |0 1x x,則以1x代替0x轉(2)步繼續迭代;當? ? ? | |0 1x x時
終止計算,取作為所求結果。
五、程序
(1)二分法程序:
function y=bisection(fx,xa,xb,n,delta)
x=xa;fa=5*x-exp(x);
x=xb;fb=5*x-exp(x);
disp(“[
n
xa
xb
xc
fc
]”);
for i=1:n
xc=(xa+xb)/2;x=xc;fc=5*x-exp(x);
X=[i,xa,xb,xc,fc];
disp(X),if fc==0,end
if fc*fa<0
xb=xc;
else xa=xc;
end
if(xb-xa) end (2)迭代法程序: function y=diedai(fx,x0,n,delta) disp(“[ k xk ]”); for i=1:n x1=(exp(x0))/5; X=[i,x1]; disp(X); if abs(x1-x0) fprintf(“The procedure was successful”) return else i=i+1; x0=x1; end end 六、實驗結果及分析 (1)二分法: 實驗結果如下: [ n xa xb xc fc ] 1.0000 0 1.0000 0.5000 0.8513 2.0000 0 0.5000 0.2500 --0.0340 3.0000 0.2500 0.5000 0.3750 0.4200 4.0000 0.2500 0.3750 0.3125 0.1957 5.0000 0.2500 0.3125 0.2813 0.0815 6.0000 0.2500 0.2813 0.2656 0.0239 7.0000 0.2500 0.2656 0.2578 --0.0050 8.0000 0.2578 0.2656 0.2617 0.0094 9.0000 0.2578 0.2617 0.2598 0.0022 10.0000 0.2578 0.2598 0.2588 --0.0014 11.0000 0.2588 0.2598 0.2593 0.0004 12.0000 0.2588 0.2593 0.2590 --0.0005 13.0000 0.2590 0.2593 0.2592 --0.0001 14.0000 0.2592 0.2 593 0.2592 0.0002 15.0000 0.2592 0.2592 0.2592 0.0001 依據題目要求的精度,則需做二分十四次,由實驗數據知 x=0.2592 即為所求的根 (2)迭代法: 實驗結果如下: 根據題目精度要求,故所求根為 x=0.2592.對二分法和迭代法的觀察和分析我們可以知道,二分法的優點是方法比較簡單,編程比較容易,只是二分法只能用于求方程的近似根,不能用于求方程的復根,且收斂速度慢。而迭代法的收斂速度明顯大于二分法的速度。 數值分析實驗報告 一、實驗3.1 題目: 考慮線性方程組,,編制一個能自動選取主元,又能手動選取主元的求解線性代數方程組的Gauss消去過程。 (1)取矩陣,則方程有解。取計算矩陣的條件數。分別用順序Gauss消元、列主元Gauss消元和完全選主元Gauss消元方法求解,結果如何? (2)現選擇程序中手動選取主元的功能,每步消去過程都選取模最小或按模盡可能小的元素作為主元進行消元,觀察并記錄計算結果,若每步消去過程總選取按模最大的元素作為主元,結果又如何?分析實驗的結果。 (3)取矩陣階數n=20或者更大,重復上述實驗過程,觀察記錄并分析不同的問題及消去過程中選擇不同的主元時計算結果的差異,說明主元素的選取在消去過程中的作用。 (4)選取其他你感興趣的問題或者隨機生成的矩陣,計算其條件數,重復上述實驗,觀察記錄并分析實驗的結果。 1.算法介紹 首先,分析各種算法消去過程的計算公式,順序高斯消去法: 第k步消去中,設增廣矩陣中的元素(若等于零則可以判定系數矩陣為奇異矩陣,停止計算),則對k行以下各行計算,分別用乘以增廣矩陣的第行并加到第行,則可將增廣矩陣中第列中以下的元素消為零;重復此方法,從第1步進行到第n-1步,則可以得到最終的增廣矩陣,即; 列主元高斯消去法: 第k步消去中,在增廣矩陣中的子方陣中,選取使得,當時,對中第行與第行交換,然后按照和順序消去法相同的步驟進行。重復此方法,從第1步進行第n-1步,就可以得到最終的增廣矩陣,即; 完全主元高斯消去法: 第k步消去中,在增廣矩陣中對應的子方陣中,選取使得,若或,則對中第行與第行、第列與第列交換,然后按照和順序消去法相同的步驟進行即可。重復此方法,從第1步進行到第n-1步,就可以得到最終的增廣矩陣,即; 接下來,分析回代過程求解的公式,容易看出,對上述任一種消元法,均有以下計算公式: 2.實驗程序的設計 一、輸入實驗要求及初始條件; 二、計算系數矩陣A的條件數及方程組的理論解; 三、對各不同方法編程計算,并輸出最終計算結果。 3.計算結果及分析 (1) 先計算系數矩陣的條件數,結果如下,可知系數矩陣的條件數較大,故此問題屬于病態問題,b或A的擾動都可能引起解的較大誤差; 采用順序高斯消去法,計算結果為: 最終解為x=(1.***,1.***,1.***,1.***,0.***,1.***,0.***,1.***,0.***,1.***)T 使用無窮范數衡量誤差,得到=2.842***1e-14,可以發現,采用順序高斯消元法求得的解與精確解之間誤差較小。通過進一步觀察,可以發現,按照順序高斯消去法計算時,其選取的主元值和矩陣中其他元素大小相近,因此順序高斯消去法方式并沒有對結果造成特別大的影響。 若采用列主元高斯消元法,則結果為: 最終解為x=(1.***,1.***,1.***,1.***,1.***,1.***,1.***,1.***,1.***,1.***)T 同樣使用無窮范數衡量誤差,有=0; 若使用完全主元高斯消元法,則結果為 最終解x=(1.***,1.***,1.***,1.***,1.***,1.***,1.***,1.***,1.***,1.***)T 同樣使用無窮范數衡量誤差,有=0; (2) 若每步都選取模最小或盡可能小的元素為主元,則計算結果為 最終解x=(1.*** 1.*** 1.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.***)T 使用無窮范數衡量誤差,有為2.842***1e-14;而完全主元消去法的誤差為=0。 從(1)和(2)的實驗結果可以發現,列主元消去法和完全主元消去法都得到了精確解,而順序高斯消去法和以模盡量小的元素為主元的消去法沒有得到精確解。在后兩種消去法中,由于程序計算時的舍入誤差,對最終結果產生了一定的影響,但由于方程組的維度較低,并且元素之間相差不大,所以誤差仍比較小。 為進一步分析,計算上述4種方法每步選取的主元數值,并列表進行比較,結果如下: 第n次消元 順序 列主元 完全主元 模最小 6.*** 6.*** 4.*** 4.*** 4.*** 4.*** 4.***3333 4.***3333 4.*** 4.*** 4.*** 4.*** 4.0***063 4.0***063 4.*** 4.*** 4.0039*** 4.0039*** 4.*** 0.0***469 0.0***469 4.*** 從上表可以發現,對這個方程組而言,順序高斯消去選取的主元恰好事模盡量小的元素,而由于列主元和完全主元選取的元素為8,與4在數量級上差別小,所以計算過程中的累積誤差也較小,最終4種方法的輸出結果均較為精確。 在這里,具體解釋一下順序法與模最小法的計算結果完全一致的原因。該矩陣在消元過程中,每次選取主元的一列只有兩個非零元素,對角線上的元素為4左右,而其正下方的元素為8,該列其余位置的元素均為0。在這樣的情況下,默認的主元也就是該列最小的主元,因此兩種方法所得到的計算結果是一致的。 理論上說,完全高斯消去法的誤差最小,其次是列主元高斯消去法,而選取模最小的元素作為主元時的誤差最大,但是由于方程組的特殊性(元素相差不大并且維度不高),這個理論現象在這里并沒有充分體現出來。 (3) 時,重復上述實驗過程,各種方法的計算結果如下所示,在這里,仍采用無窮范數衡量絕對誤差。 順序高斯消去法 列主元高斯消去 完全主元高斯消去 選取模最小或盡可能小元素作為主元消去 X 1.*** 1.*** 1.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 1.*** 1.*** 1.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 2.***e-11 0 0 2.***e-11 可以看出,此時列主元和完全主元的計算結果仍為精確值,而順序高斯消去和模盡可能小方法仍然產生了一定的誤差,并且兩者的誤差一致。與n=10時候的誤差比相比,n=20時的誤差增長了大約1000倍,這是由于計算過程中舍入誤差的不斷累積所致。所以,如果進一步增加矩陣的維數,應該可以看出更明顯的現象。 (4) 不同矩陣維度下的誤差如下,在這里,為方便起見,選取2-條件數對不同維度的系數矩陣進行比較。 維度 條件數 順序消去 列主元 完全主元 模盡量小 1.7e+3 2.84e-14 0 0 2.84e-14 1.8e+6 2.91e-11 0 0 2.91e-11 5.7e+7 9.31e-10 0 0 9.31e-10 1.8e+9 2.98e-08 0 0 2.98e-08 1.9e+12 3.05e-05 0 0 3.05e-05 3.8e+16 3.28e+04 3.88e-12 3.88e-12 3.28e+04 8.5e+16 3.52e+13 4.2e-3 4.2e-3 3.52e+13 從上表可以看出,隨著維度的增加,不同方法對計算誤差的影響逐漸體現,并且增長較快,這是由于舍入誤差逐步累計而造成的。不過,方法二與方法三在維度小于40的情況下都得到了精確解,這兩種方法的累計誤差遠比方法一和方法四慢;同樣地,出于與前面相同的原因,方法一與方法四的計算結果保持一致,方法二與方法三的計算結果保持一致。 4.結論 本文矩陣中的元素差別不大,模最大和模最小的元素并沒有數量級上的差異,因此,不同的主元選取方式對計算結果的影響在維度較低的情況下并不明顯,四種方法都足夠精確。 對比四種方法,可以發現采用列主元高斯消去或者完全主元高斯消去法,可以盡量抑制誤差,算法最為精確。不過,對于低階的矩陣來說,四種方法求解出來的結果誤差均較小。 另外,由于完全選主元方法在選主元的過程中計算量較大,而且可以發現列主元法已經可以達到很高的精確程度,因而在實際計算中可以選用列主元法進行計算。 附錄:程序代碼 clear clc; format long; %方法選擇 n=input('矩陣A階數:n='); disp('選取求解方式'); disp('1 順序Gauss消元法,2 列主元Gauss消元法,3 完全選主元Gauss消元法,4 模最小或近可能小的元素作為主元'); a=input('求解方式序號:'); %賦值A和b A=zeros(n,n); b=zeros(n,1); for i=1:n A(i,i)=6; if i>1 A(i,i-1)=8; end if i A(i,i+1)=1; end end for i=1:n for j=1:n b(i)=b(i)+A(i,j); end end disp('給定系數矩陣為:'); A disp('右端向量為:'); b %求條件數及理論解 disp('線性方程組的精確解:'); X=(A\b)' fprintf('矩陣A的1-條件數: %f \n',cond(A,1)); fprintf('矩陣A的2-條件數: %f \n',cond(A)); fprintf('矩陣A的無窮-條件數: %f \n',cond(A,inf)); %順序Gauss消元法 if a==1 A1=A;b1=b; for k=1:n if A1(k,k)==0 disp('主元為零,順序Gauss消元法無法進行'); break end fprintf('第%d次消元所選取的主元:%g\n',k,A1(k,k)) %disp('此次消元后系數矩陣為:'); %A1 for p=k+1:n l=A1(p,k)/A1(k,k); A1(p,k:n)=A1(p,k:n)-l*A1(k,k:n); b1(p)=b1(p)-l*b1(k); end end x1(n)=b1(n)/A1(n,n); for k=n-1:-1:1 for w=k+1:n b1(k)=b1(k)-A1(k,w)*x1(w); end x1(k)=b1(k)/A1(k,k); end disp('順序Gauss消元法解為:'); disp(x1); disp('所求解與精確解之差的無窮-范數為'); norm(x1-X,inf) end %列主元Gauss消元法 if a==2 A2=A;b2=b; for k=1:n [max_i,max_j]=find(A2(:,k)==max(abs(A2(k:n,k)))); if max_i~=k A2_change=A2(k,:); A2(k,:)=A2(max_i,:); A2(max_i,:)=A2_change; b2_change=b2(k); b2(k)=b2(max_i); b2(max_i)=b2_change; end if A2(k,k)==0 disp('主元為零,列主元Gauss消元法無法進行'); break end fprintf('第%d次消元所選取的主元:%g\n',k,A2(k,k)) %disp('此次消元后系數矩陣為:'); %A2 for p=k+1:n l=A2(p,k)/A2(k,k); A2(p,k:n)=A2(p,k:n)-l*A2(k,k:n); b2(p)=b2(p)-l*b2(k); end end x2(n)=b2(n)/A2(n,n); for k=n-1:-1:1 for w=k+1:n b2(k)=b2(k)-A2(k,w)*x2(w); end x2(k)=b2(k)/A2(k,k); end disp('列主元Gauss消元法解為:'); disp(x2); disp('所求解與精確解之差的無窮-范數為'); norm(x2-X,inf) end %完全選主元Gauss消元法 if a==3 A3=A;b3=b; for k=1:n VV=eye(n); [max_i,max_j]=find(A3(k:n,k:n)==max(max(abs(A3(k:n,k:n))))); if numel(max_i)==0 [max_i,max_j]=find(A3(k:n,k:n)==-max(max(abs(A3(k:n,k:n))))); end W=eye(n); W(max_i(1)+k-1,max_i(1)+k-1)=0; W(k,k)=0; W(max_i(1)+k-1,k)=1; W(k,max_i(1)+k-1)=1; V=eye(n); V(k,k)=0; V(max_j(1)+k-1,max_j(1)+k-1)=0; V(k,max_j(1)+k-1)=1; V(max_j(1)+k-1,k)=1; A3=W*A3*V; b3=W*b3; VV=VV*V; if A3(k,k)==0 disp('主元為零,完全選主元Gauss消元法無法進行'); break end fprintf('第%d次消元所選取的主元:%g\n',k,A3(k,k)) %disp('此次消元后系數矩陣為:'); %A3 for p=k+1:n l=A3(p,k)/A3(k,k); A3(p,k:n)=A3(p,k:n)-l*A3(k,k:n); b3(p)=b3(p)-l*b3(k); end end x3(n)=b3(n)/A3(n,n); for k=n-1:-1:1 for w=k+1:n b3(k)=b3(k)-A3(k,w)*x3(w); end x3(k)=b3(k)/A3(k,k); end disp('完全選主元Gauss消元法解為:'); disp(x3); disp('所求解與精確解之差的無窮-范數為'); norm(x3-X,inf) end %模最小或近可能小的元素作為主元 if a==4 A4=A;b4=b; for k=1:n AA=A4; AA(AA==0)=NaN; [min_i,j]=find(AA(k:n,k)==min(abs(AA(k:n,k)))); if numel(min_i)==0 [min_i,j]=find(AA(k:n,k)==-min(abs(AA(k:n,k:n)))); end W=eye(n); W(min_i(1)+k-1,min_i(1)+k-1)=0; W(k,k)=0; W(min_i(1)+k-1,k)=1; W(k,min_i(1)+k-1)=1; A4=W*A4; b4=W*b4; if A4(k,k)==0 disp('主元為零,模最小Gauss消元法無法進行'); break end fprintf('第%d次消元所選取的主元:%g\n',k,A4(k,k)) %A4 for p=k+1:n l=A4(p,k)/A4(k,k); A4(p,k:n)=A4(p,k:n)-l*A4(k,k:n); b4(p)=b4(p)-l*b4(k); end end x4(n)=b4(n)/A4(n,n); for k=n-1:-1:1 for w=k+1:n b4(k)=b4(k)-A4(k,w)*x4(w); end x4(k)=b4(k)/A4(k,k); end disp('模最小Gauss消元法解為:'); disp(x4); disp('所求解與精確解之差的無窮-范數為'); norm(x4-X,inf) end 二、實驗3.3 題目: 考慮方程組的解,其中系數矩陣H為Hilbert矩陣: 這是一個著名的病態問題。通過首先給定解(例如取為各個分量均為1)再計算出右端的辦法給出確定的問題。 (1)選擇問題的維數為6,分別用Gauss消去法(即LU分解)、J迭代法、GS迭代法和SOR迭代法求解方程組,其各自的結果如何?將計算結果與問題的解比較,結論如何。 (2)逐步增大問題的維數,仍用上述的方法來解它們,計算的結果如何?計算的結果說明的什么? (3)討論病態問題求解的算法。 1.算法設計 對任意線性方程組,分析各種方法的計算公式如下,(1)Gauss消去法: 首先對系數矩陣進行LU分解,有,則原方程轉化為,令,則原方程可以分為兩步回代求解: 具體方法這里不再贅述。 (2)J迭代法: 首先分解,再構造迭代矩陣,其中,進行迭代計算,直到誤差滿足要求。 (3)GS迭代法: 首先分解,再構造迭代矩陣,其中,進行迭代計算,直到誤差滿足要求。 (4)SOR迭代法: 首先分解,再構造迭代矩陣,其中,進行迭代計算,直到誤差滿足要求。 2.實驗過程 一、根據維度n確定矩陣H的各個元素和b的各個分量值; 二、選擇計算方法(Gauss消去法,J迭代法,GS迭代法,SOR迭代法),對迭代法設定初值,此外SOR方法還需要設定松弛因子; 三、進行計算,直至滿足誤差要求(對迭代法,設定相鄰兩次迭代結果之差的無窮范數小于0.0001; 3.計算結果及分析 (1)時,問題可以具體定義為 計算結果如下,Gauss消去法 第1次消元所選取的主元是:1 第2次消元所選取的主元是:0.0833333 第3次消元所選取的主元是:0.00555556 第4次消元所選取的主元是:0.000357143 第5次消元所選取的主元是:2.26757e-05 第6次消元所選取的主元是:1.43155e-06 解得X=(0.*** 1.*** 0.*** 1.*** 0.*** 1.***)T 使用無窮范數衡量誤差,可得=4.***e-10; J迭代法 設定迭代初值為零,計算得到 J法的迭代矩陣B的譜半徑為4.30853>1,所以J法不收斂; GS迭代法 設定迭代初值為零,計算得到GS法的迭代矩陣G的譜半徑為:0.999998<1,故GS法收斂,經過541次迭代計算后,結果為X=(1.001***6 0.*** 0.*** 1.*** 1.*** 0.***)T 使用無窮范數衡量誤差,有=0.***; SOR迭代法 設定迭代初值為零向量,并設定,計算得到SOR法迭代矩陣譜半徑為0.***,經過100次迭代后的計算結果為 X=(1.*** 0.*** 1.03***59 1.06***81 1.*** 0.9***527)T; 使用無窮范數衡量誤差,有=0.***; 對SOR方法,可變,改變值,計算結果可以列表如下 迭代次數 迭代矩陣的譜半徑 0.*** 0.*** 0.*** 0.*** X 1.*** 0.*** 1.01***40 1.*** 1.0***681 0.*** 1.*** 0.*** 1.*** 1.*** 1.*** 0.*** 1.*** 0.*** 1.*** 1.*** 0.*** 0.*** 1.05***66 0.*** 1.*** 0.*** 1.*** 0.*** 0.*** 0.*** 0.*** 0.*** 可以發現,松弛因子的取值對迭代速度造成了不同的影響,上述四種方法中,松弛因子=0.5時,收斂相對較快。 綜上,四種算法的結果列表如下: 算法 Gauss消去法 Jacobi法 GS法 SOR法(取) 迭代次數 -- 不收斂 541 迭代矩陣的譜半徑 -- 4.30853 0.999998 0.*** X 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** -- 1.001***6 0.*** 0.*** 1.*** 1.*** 0.*** 1.*** 0.*** 1.03***59 1.06***81 1.*** 0.9***527 4.***e-10 -- 0.*** 0.*** 計算可得,矩陣H的條件數為>>1,所以這是一個病態問題。由上表可以看出,四種方法的求解都存在一定的誤差。下面分析誤差的來源: LU分解方法的誤差存在主要是由于Hilbert矩陣各元素由分數形式轉換為小數形式時,不能除盡情況下會出現舍入誤差,在進行LU分解時也存在這個問題,所以最后得到的結果不是方程的精確解,但結果顯示該方法的誤差非常小; Jacobi迭代矩陣的譜半徑為4.30853,故此迭代法不收斂; GS迭代法在迭代次數為541次時得到了方程的近似解,其誤差約為0.05,比較大。GS迭代矩陣的譜半徑為0.999998,很接近1,所以GS迭代法收斂速度較慢; SOR迭代法在迭代次數為100次時誤差約為0.08,誤差較大。SOR迭代矩陣的譜半徑為0.999999,也很接近1,所以時SOR迭代法收斂速度不是很快,但是相比于GS法,在迭代速度方面已經有了明顯的提高;另外,對不同的,SOR方法的迭代速度會相應有變化,如果選用最佳松弛因子,可以實現更快的收斂; (2) 考慮不同維度的情況,時,算法 Gauss消去 J法 GS法 SOR法(w=0.5) 計算結果 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** -- 0.*** 1.*** 0.*** 1.*** 1.*** 1.*** 0.9968*** 0.*** 1.*** 0.9397*** 0.*** 1.*** 1.*** 1.*** 0.*** 0.*** 迭代次數 -- -- 356 譜半徑 -- 6.04213 0.*** -- 時,算法 Gauss消去法 Jacobi法 GS法 SOR法(w=0.5) 計算結果 0.*** 1.*** 0.*** 1.000***1 0.*** 1.*** 0.*** 1.*** 0.*** 1.*** 0.*** -- 0.*** 1.*** 0.*** 0.*** 0.*** 1.02***91 1.*** 1.*** 1.*** 0.*** 0.947***7 1.0***572 0.*** 0.*** 0.*** 1.*** 1.*** 1.*** 1.*** 0.*** 0.*** 0.*** 迭代次數 -- -- 1019 譜半徑 -- 8.64964 0.*** -- 時 算法 Gauss消去法 Jacobi法 GS法 SOR法(w=0.5) 計算結果 0.*** 1.*** 0.*** 0.*** 1.*** 0.*** 2.*** -2.*** 7.*** -7.*** 7.*** -1.*** 0.*** 1.*** 0.*** -- 不收斂 1.*** 1.*** 0.907***9 0.*** 0.*** 1.*** 1.09***64 1.*** 1.*** 1.*** 1.0385*** 0.*** 0.942***3 0.*** 0.*** 迭代次數 -- -- 262 譜半徑 -- 6.04213 >1 1.*** 8.*** -- -- 0.*** 分析以上結果可以發現,隨著n值的增加,Gauss消去法誤差逐漸增大,而且誤差增大的速度很快,在維數小于等于10情況下,Gauss消去法得到的結果誤差較小;但當維數達到15時,計算結果誤差已經達到精確解的很多倍; J法迭代不收斂,無論n如何取值,其譜半徑始終大于1,因而J法不收斂,所以J迭代法不能用于Hilbert矩陣的求解; 對于GS迭代法和SOR迭代法,兩種方法均收斂,GS迭代法是SOR迭代法松弛因子取值為1的特例,SOR方法受到取值的影響,會有不同的收斂情況。可以得出GS迭代矩陣的譜半徑小于1但是很接近1,收斂速度很慢。雖然隨著維數的增大,所需迭代的次數逐漸減少,但是當維數達到15的時候,GS法已經不再收斂。因此可以得出結論,GS迭代方法在Hilbert矩陣維數較低時,能夠在一定程度上滿足迭代求解的需求,不過迭代的速度很慢。另外,隨著矩陣維數的增加,SOR法的誤差水平基本穩定,而且誤差在可以接受的范圍之內。 經過比較可以得出結論,如果求解較低維度的Hibert矩陣問題,Gauss消去法、GS迭代法和SOR迭代法均可使用,且Gauss消去法的結果精確度較高;如果需要求解較高維度的Hibert矩陣問題,只有采用SOR迭代法。 (3) 系數矩陣的條件數較大時,為病態方程。由實驗可知,Gauss法在解上述方程時,結果存在很大的誤差。而對于收斂的迭代法,可以通過選取最優松弛因子的方法來求解,雖然迭代次數相對較多,但是結果較為精確。 總體來看,對于一般病態方程組的求解,可以采用以下方式: 1.低維度下采用Gauss消去法直接求解是可行的; Jacobi迭代方法不適宜于求解病態問題; GS迭代方法可以解決維數較低的病態問題,但其譜半徑非常趨近于1,導致迭代算法收斂速度很慢,維數較大的時候,GS法也不再收斂; SOR方法較適合于求解病態問題,特別是矩陣維數較高的時候,其優勢更為明顯。 2.采用高精度的運算,如選用雙倍或更多倍字長的運算,可以提高收斂速度; 3.可以對原方程組作某些預處理,從而有效降低系數矩陣的條件數。 4.實驗結論 (1)對Hibert矩陣問題,其條件數會隨著維度的增加迅速增加,病態性會越來越明顯;在維度較低的時候,Gauss消去法、GS迭代法和SOR迭代法均可使用,且可以優先使用Gauss消去法;如果需要求解較高維度的Hibert矩陣問題,只有SOR迭代法能夠求解。 (2)SOR方法比較適合于求解病態問題,特別是矩陣維數較高的時候,其優點更為明顯。從本次實驗可以看出,隨著矩陣維數的增大,SOR方法所需的迭代次數減少,而且誤差基本穩定,是解決病態問題的適宜方法。 附錄:程序代碼 clear all clc; format long; %矩陣賦值 n=input('矩陣H的階數:n='); for i=1:n for j=1:n H(i,j)=1/(i+j-1); end end b=H*ones(n,1); disp('H矩陣為:'); H disp('向量b:'); b %方法選擇 disp('選取求解方式'); disp('1 Gauss消去法,2 J迭代法,3 GS迭代法,4 SOR迭代法'); a=input('求解方式序號:'); %Gauss消去法 if a==1; H1=H;b1=b; for k=1:n if H1(k,k)==0 disp('主元為零,Gauss消去法無法進行'); break end fprintf('第%d次消元所選取的主元是:%g\n',k,H1(k,k)) for p=k+1:n m5=-H1(p,k)/H1(k,k); H1(p,k:n)=H1(p,k:n)+m5*H1(k,k:n); b1(p)=b1(p)+m5*b1(k); end end x1(n)=b1(n)/H1(n,n); for k=n-1:-1:1 for v=k+1:n b1(k)=b1(k)-H1(k,v)*x1(v); end x1(k)=b1(k)/H1(k,k); end disp('Gauss消去法解為:'); disp(x1); disp('解與精確解之差的無窮范數'); norm((x1-a),inf) end D=diag(diag(H)); L=-tril(H,-1); U=-triu(H,1); %J迭代法 if a==2; %給定初始x0 ini=input('初始值設定:x0='); x0(:,1)=ini*diag(ones(n)); disp('初始解向量為:'); x0 xj(:,1)=x0(:,1); B=(D^(-1))*(L+U); f=(D^(-1))*b; fprintf('(J法B矩陣譜半徑為:%g\n',vrho(B)); if vrho(B)<1; for m2=1:5000 xj(:,m2+1)=B*xj(:,m2)+fj; if norm((xj(:,m2+1)-xj(:,m2)),inf)<0.0001 break end end disp('J法計算結果為:'); xj(:,m2+1) disp('解與精確解之差的無窮范數'); norm((xj(:,m2+1)-diag(ones(n))),inf) disp('J迭代法迭代次數:'); m2 else disp('由于B矩陣譜半徑大于1,因而J法不收斂'); end end %GS迭代法 if a==3; %給定初始x0 ini=input('初始值設定:x0='); x0(:,1)=ini*diag(ones(n)); disp('初始解向量為:'); x0 xG(:,1)=x0(:,1); G=inv(D-L)*U; fG=inv(D-L)*b; fprintf('GS法G矩陣譜半徑為:%g\n',vrho(G)); if vrho(G)<1 for m3=1:5000 xG(:,m3+1)=G*xG(:,m3)+fG; if norm((xG(:,m3+1)-xG(:,m3)),inf)<0.0001 break; end end disp('GS迭代法計算結果:'); xG(:,m3+1) disp('解與精確解之差的無窮范數'); norm((xG(:,m3+1)-diag(ones(n))),inf) disp('GS迭代法迭代次數:'); m3 else disp('由于G矩陣譜半徑大于1,因而GS法不收斂'); end end %SOR迭代法 if a==4; %給定初始x0 ini=input('初始值設定:x0='); x0(:,1)=ini*diag(ones(n)); disp('初始解向量為:'); x0 A=H; for i=1:n b(i)=sum(A(i,:)); end x_star=ones(n,1); format long w=input('松弛因子:w='); Lw=inv(D-w*L)*((1-w)*D+w*U); f=w*inv(D-w*L)*b; disp('迭代矩陣的譜半徑:') p=vrho(Lw) time_max=100;%迭代次數 x=zeros(n,1);%迭代初值 for i=1:time_max x=Lw*x+f; end disp('SOR迭代法得到的解為'); x disp('解與精確解之差的無窮范數'); norm((x_star-x),inf) end pause 三、實驗4.1 題目: 對牛頓法和擬牛頓法。進行非線性方程組的數值求解 (1)用上述兩種方法,分別計算下面的兩個例子。在達到精度相同的前提下,比較其迭代次數、CPU時間等。 (2)取其他初值,結果又如何?反復選取不同的初值,比較其結果。 (3)總結歸納你的實驗結果,試說明各種方法適用的問題。 1.算法設計 對需要求解的非線性方程組而言,牛頓法和擬牛頓法的迭代公式如下,(1)牛頓法: 牛頓法為單步迭代法,需要取一個初值。 (2)擬牛頓法:(Broyden秩1法) 其中,擬牛頓法不需要求解的導數,因此節省了大量的運算時間,但需要給定矩陣的初值,取為。 2.實驗過程 一、輸入初值; 二、根據誤差要求,按公式進行迭代計算; 三、輸出數據; 3.計算結果及分析 (1)首先求解方程組(1),在這里,設定精度要求為,方法 牛頓法 擬牛頓法 初始值 計算結果X x1 0.*** 0.*** x2 1.*** 1.0852*** x3 0.*** 0.*** 迭代次數 CPU計算時間/s 3.777815 2.739349 可以看出,在初始值相同情況下,牛頓法和擬牛頓法在達到同樣計算精度情況下得到的結果基本相同,但牛頓法的迭代次數明顯要少一些,但是,由于每次迭代都需要求解矩陣的逆,所以牛頓法每次迭代的CPU計算時間更長。 之后求解方程組(2),同樣設定精度要求為 方法 牛頓法 擬牛頓法 初始值 計算結果X x1 0.*** 0.*** x2 0.*** 0.*** x3 -0.*** -0.*** 迭代次數 CPU計算時間/s 2.722437 3.920195 同樣地,可以看出,在初始值相同情況下,牛頓法和擬牛頓法在達到同樣計算精度情況下得到的結果是基本相同的,但牛頓法的迭代次數明顯要少,但同樣的,由于每次迭代中有求解矩陣的逆的運算,牛頓法每次迭代的CPU計算時間較長。 (2)對方程組(1),取其他初值,計算結果列表如下,同樣設定精度要求為 初始值 方法 牛頓法 擬牛頓法 計算結果 0.*** 1.*** 0.*** 9.21***94 -5.*** 18.1***205 迭代次數 CPU計算時間/s 3.907164 4.818019 計算結果 0.*** 1.*** 0.*** 9.21***91 -5.*** 18.1***807 迭代次數 2735 CPU計算時間/s 8.127286 5.626023 計算結果 0.*** 1.*** 0.*** 0.*** 1.0852*** 0.*** 迭代次數 CPU計算時間/s 3.777815 2.739349 計算結果 0.*** 1.*** 0.*** 0.*** 1.*** 0.*** 迭代次數 188 CPU計算時間/s 3.835697 2.879070 計算結果 9.21***22 -5.*** 18.1***605 Matlab警告矩陣接近奇異值,程序進入長期循環計算中 迭代次數 -- CPU計算時間/s 4.033868 -- 計算結果 0.*** 1.*** 0.*** Matlab警告矩陣接近奇異值,程序進入長期循環計算中 迭代次數 -- CPU計算時間/s 12.243263 -- 從上表可以發現,方程組(1)存在另一個在(9.2,-5.6,18.1)T附近的不動點,初值的選取會直接影響到牛頓法和擬牛頓法最后的收斂點。 總的來說,設定的初值離不動點越遠,需要的迭代次數越多,因而初始值的選取非常重要,合適的初值可以更快地收斂,如果初始值偏離精確解較遠,會出現迭代次數增加直至無法收斂的情況; 由于擬牛頓法是一種近似方法,擬牛頓法需要的的迭代次數明顯更多,而且收斂情況不如牛頓法好(初值不夠接近時,甚至會出現奇異矩陣的情況),但由于牛頓法的求解比較復雜,計算時間較長; 同樣的,對方程組(2),取其他初值,計算結果列表如下,同樣設定精度要求為 初始值 方法 牛頓法 擬牛頓法 計算結果 0.*** 0.*** -0.*** 0.*** 0.*** -0.*** 迭代次數 CPU計算時間/s 2.722437 3.920195 計算結果 0.*** 0.*** -0.*** 0.*** -0.*** 76.*** 迭代次數 CPU計算時間/s 5.047111 5.619752 計算結果 0.*** 0.*** -0.*** 1.0e+02 * -0.*** -0.000***6 1.754***3 迭代次數 CPU計算時間/s 3.540668 3.387829 計算結果 0.*** 0.*** -0.*** 1.0e+04 * 0.*** -0.*** 1.*** 迭代次數 CPU計算時間/s 2.200571 2.640901 計算結果 0.*** 0.*** -0.*** 矩陣為奇異值,無法輸出準確結果 迭代次數 -- CPU計算時間/s 1.719072 -- 計算結果 0.*** 0.*** -0.*** 矩陣為奇異值,無法輸出準確結果 迭代次數 149 -- CPU計算時間/s 2.797116 -- 計算結果 矩陣為奇異值,無法輸出準確結果 矩陣為奇異值,無法輸出準確結果 迭代次數 -- -- CPU計算時間/s -- -- 在這里,與前文類似的發現不再贅述。 從這里看出,牛頓法可以在更大的區間上實現壓縮映射原理,可以在更大的范圍上選取初值并最終收斂到精確解附近; 在初始值較接近于不動點時,牛頓法和擬牛頓法計算所得到的結果是基本相同的,雖然迭代次數有所差別,但計算總的所需時間相近。 (3) 牛頓法在迭代過程中用到了矩陣的求逆,其迭代收斂的充分條件是迭代滿足區間上的映內性,對于矩陣的求逆過程比較簡單,所以在較大區間內滿足映內性的問題適合應用牛頓法進行計算。一般而言,對于函數單調或者具有單值特性的函數適合應用牛頓法,其對初始值敏感程度較低,算法具有很好的收斂性。 另外,需要說明的是,每次計算給出的CPU時間與計算機當時的運行狀態有關,同時,不同代碼的運行時間也不一定一致,所以這個數據并不具有很大的參考價值。 4.實驗結論 對牛頓法和擬牛頓法,都存在初始值越接近精確解,所需的迭代次數越小的現象; 在應用上,牛頓法和擬牛頓法各有優勢。就迭代次數來說,牛頓法由于更加精確,所需的迭代次數更少;但就單次迭代來說,牛頓法由于計算步驟更多,且計算更加復雜,因而每次迭代所需的時間更長,而擬牛頓法由于采用了簡化的近似公式,其每次迭代更加迅速。當非線性方程組求逆過程比較簡單時,如方程組1的情況時,擬牛頓法不具有明顯的優勢;而當非線性方程組求逆過程比較復雜時,如方程組2的情況,擬牛頓法就可以體現出優勢,雖然循環次數有所增加,但是CPU耗時反而更少。 另外,就方程組壓縮映射區間來說,一般而言,對于在區間內函數呈現單調或者具有單值特性的函數適合應用牛頓法,其對初始值敏感程度較低,使算法具有很好的收斂性;而擬牛頓法由于不需要在迭代過程中對矩陣求逆,而是利用差商替代了對矩陣的求導,所以即使初始誤差較大時,其倒數矩陣與差商偏差也較小,所以對初始值的敏感程度較小。 附錄:程序代碼 %方程1,牛頓法 tic; format long; %%初值 disp('請輸入初值'); a=input('第1個分量為:'); b=input('第2個分量為:'); c=input('第3個分量為:'); disp('所選定初值為'); x=[a;b;c] %%誤差要求 E=0.0001; %%迭代 i=0; e=2*E; while e>E F=[12*x(1)-x(2)^2-4*x(3)-7;x(1)^2+10*x(2)-x(3)-11;x(2)^3+10*x(3)-8]; f=[12,-2*x(2),-4;2*x(1),10,-1;0,3*x(2)^2,10]; det_x=((f)^(-1))*(-F); x=x+det_x; e=max(norm(det_x)); i=i+1; end disp('迭代次數'); i disp('迭代次數'); x toc; %方程1,擬牛頓法 tic; format long; %%初值 %%初值 disp('請輸入初值'); a=input('第1個分量為:'); b=input('第2個分量為:'); c=input('第3個分量為:'); disp('所選定初值為'); x0=[a;b;c] %%誤差要求 E=0.0001; %%迭代 i=0; e=2*E; A0=eye(3); while e>E F0=[12*x0(1)-x0(2)^2-4*x0(3)-7;x0(1)^2+10*x0(2)-x0(3)-11;x0(2)^3+10*x0(3)-8]; x1=x0-A0^(-1)*F0; s=x1-x0; F1=[12*x1(1)-x1(2)^2-4*x1(3)-7;x1(1)^2+10*x1(2)-x1(3)-11;x1(2)^3+10*x1(3)-8]; y=F1-F0; A1=A0+(y-A0*s)*s'/(s'*s); x0=x1; A0=A1; e=max(norm(s)); i=i+1; end disp('迭代次數'); i disp('迭代次數'); x0 toc; %方程2,牛頓法 tic; format long; %%初值 disp('請輸入初值'); a=input('第1個分量為:'); b=input('第2個分量為:'); c=input('第3個分量為:'); disp('所選定初值為'); x=[a;b;c] %%誤差要求 E=0.0001; %%迭代 i=0; e=2*E; while e>E F=[3*x(1)-cos(x(2)*x(3))-0.5;x(1)^2-81*(x(2)+0.1)^2+sin(x(3))+1.06;exp(1)^(-x(1)*x(2))+20*x(3)+(10*pi-3)/3]; f=[3,x(3)*sin(x(2)*x(3)),x(2)*sin(x(2)*x(3));2*x(1),-162*x(2)-81/5,cos(x(3));-x(2)*exp(1)^(-x(1)*x(2)),-x(1)*exp(1)^(-x(1)*x(2)),20]; det_x=((f)^(-1))*(-F); x=x+det_x; e=max(norm(det_x)); i=i+1; end disp('迭代次數'); i disp('迭代次數'); x toc; %方程2,擬牛頓法 tic; format long; %%初值 %%初值 disp('請輸入初值'); a=input('第1個分量為:'); b=input('第2個分量為:'); c=input('第3個分量為:'); disp('所選定初值為'); x0=[a;b;c] %%誤差要求 E=0.0001; %%迭代 i=0; e=2*E; A0=eye(3); while e>E F0=[3*x0(1)-cos(x0(2)*x0(3))-0.5;x0(1)^2-81*(x0(2)+0.1)^2+sin(x0(3))+1.06;exp(1)^(-x0(1)*x0(2))+20*x0(3)+(10*pi-3)/3]; x1=x0-A0^(-1)*F0; s=x1-x0; F1=[3*x1(1)-cos(x1(2)*x1(3))-0.5;x1(1)^2-81*(x1(2)+0.1)^2+sin(x1(3))+1.06;exp(1)^(-x1(1)*x1(2))+20*x1(3)+(10*pi-3)/3]; y=F1-F0; A1=A0+(y-A0*s)*s'/(s'*s); x0=x1; A0=A1; e=max(norm(s)); i=i+1; end disp('迭代次數'); i disp('迭代次數'); x0 toc; 學號: 姓名: 實驗二插值法 實驗2.1(多項式插值的振蕩現象) 問題提出:考慮一個固定的區間上用插值逼近一個函數。顯然拉格朗日插值中使用的節點越多,插值多項式的次數就越高。我們自然關心插值多項式的次數增加時,L(x)是否也更加靠近被逼近的函數。龍格給出了一個極著名例子。設區間[-1,1]上函數 f(x)=1/(1+25x^2) 實驗內容:考慮區間[-1,1]的一個等距劃分,分點為: x(i)=-1+2i/n,i=0,1,2…,n 則拉格朗日插值多項式為: L(x)=∑l(i)(x)/(1+25x(j)^2)i=0,1,…n 其中l(i)(x), i=0,1,…n,n是n次拉格朗日插值基函數。 實驗要求: ⑴ 選擇不斷增大的分點數目n=2,3…,畫出f(x)及插值多項式函數L(x)在[-1,1]上的圖象,比較分析實驗結果。 (2)選擇其它的函數,例如定義在區間[-5,5]上的函數 h(x)=x/(1+x^4),g(x)=arctanx 重復上述的實驗看其結果如何。 (3)區間[a,b]上切比雪夫點的定義為: xk=(b+a)/2+((b-a)/2)cos((2k-1)π/(2(n+1))),k=1,2,^,n+1 以x1,x2^x(n+1)為插值節點構造上述各函數的拉格朗日插值多項式,比較其結果。 實驗過程: 程序:。。。。。。。。。。。。。。。。 數值實驗結果及分析:。。。。。。。。。。。。。。 討論。。。。。。。。。。。。。。。。。。。 實驗總結:。。。。。。。。。。。。。。。 摘要:“數值分析”是計算機科學比較重要的基礎課之一,從多方面就“數值分析”課程教學中存在的問題以及提高教學質量、學生興趣的教學方法進行了探討。 關鍵詞:數值分析;教學方法;實踐 作者簡介:黃文芝(1978-),女,湖北武漢人,武漢工程大學計算機科學與工程學院,講師;張蕾(1982-),女,湖北武漢人,武漢工程大學計算機科學與工程學院,講師。(湖北?武漢?430073) 基金項目:本文系武漢工程大學青年科學基金項目(項目編號:q201107)的研究成果。 中圖分類號:g642.0?????文獻標識碼:a?????文章編號:1007-0079(2012)05-0039-02 “數值分析”也稱計算方法,它與計算工具發展密切相關。計算方法是數學的一個組成部分,很多方法都與當時的數學家名字相聯系,如牛頓插值公式,方程求根的牛頓法,解線性方程組的高斯消去法,多項式求值的秦九韶算法,計算積分的辛普森公式等,這表明計算方法就是數學的一部分,它沒有形成單獨的學科分支。而計算機出現以后,計算方法迅速發展并形成數學科學的一個獨立分支――計算數學。這說明了計算方法與計算機的密切聯系,以及在計算機研究領域的重要性。并且數值分析在計算機相關領域應用比較廣泛,比如在數學建模中,在圖像處理中,在信號處理中等都會用到數值分析中相關的一些知識。這些都說明“數值分析”是計算機專業學生的一門核心專業基礎課程。 “數值分析”課程的教學內容主要包括三部分,一部分是插值擬合,一部分是方程和方程組求解,另外一部分是常微分方程初值問題數值解。而數值積分也是在插值的基礎進行,故筆者把它歸為插值擬合部分。這些內容看上去都是以前學過的知識,積分是在高等數學里學過的,而方程和方程組求解更是中學就重點講解過的知識,學生剛開始接觸這門課的時候會和以前所學的純數學學習的思想結合起來。通過“數值分析”課程的教學,培養學生用計算機解決問題的能力,并且為后續階段的專業課程打下基礎。 筆者是計算機科學與技術專業的一名老師,使用的教材是清華大學出版的李慶揚等編的《數值分析》,本文就當前“數值分析”課程在計算機科學與技術專業教學中存在的一些問題和教學方法、教學模式等方面進行討論,其目的在于改進教學方法和手段,提高學生興趣和教學效果。 一、“數值分析”課程教學中存在的問題 1.數學理論強,公式繁多冗長,學生學習興趣不高 “數值分析”是數學的一部分,具有與其他數學課程一樣的理論性強的特點,但“數值分析”又還有一些和以往學生所學各類數學課程不同的特點。首先,“數值分析”研究的是計算算法,用計算機來解決問題,以前學生學習數學課程大都是從理論學習到作業聯系,涉及的知識邏輯推理的特性比較強,并且以往研究的大多數都是連續的,這種研究對象的差異使得學生不能很快接受,思想不能很快轉變過來。其次,“數值分析”比以往所學的數學課程的公式更加繁多,更加冗長,比如解線性方程組,如果用以前的知識,學生都會解,但現在解線性方程組不僅僅是要得出結果,更重要的是解線性方程組的算法以及它的實現,這就涉及到至少4個公式,而我們要弄清楚了這些公式的來歷才能通過編程實現這個算法,這也是學生不感興趣的主要原因。 另外,由于學生對數學課程以及對數學公式的害怕,對“數值分析”這門課程的重要性認識不足,當學生學習遇到困難時,容易失去學習興趣,從而放棄學習。雖然“數值分析”是計算機科學與技術專業的基礎課,是大多數課程的基礎,但學生還不能理會到“數值分析”這門課程對以后課程的重要性,對于大三的學生來說他們現在所學的課程還沒能很好地得到應用,而對他們比較實際的用處――找工作也沒有顯現出比較重要的作用,因而學生會在潛意識里無視這門課,在課程學習遇到困難的情況下,他們往往會選擇放棄學習。 2.知識點多,信息量大,掌握困難 這門課的知識點比較多,信息量比較大,對于理學的學生來說該課程學時比較多,但筆者承擔的“數值分析”課程的學時是48學時,并且完全是講授部分,然而相對于課程所包含的大量內容,這些學時數遠遠不夠,比如函數逼近與快速傅里葉變換,它涉及到范數,賦范線性空間,歐氏空間,三角插值等許多概念,想讓學生在規定的學時數內真正掌握這些概念比較困難,尤其是對計算機科學專業的學生而言。因為理學院的學生學過實變函數、泛函分析,所以理解這些概念就略顯容易些。 3.重理論,輕實踐 當前“數值分析”課程教學過程中,仍然存在理論與實踐脫離的現象,雖然這門課實踐比較重要,但鑒于課時的安排,大多數教師只能按書本知識來講,學生聽,學生沒理解理論的用處,沒能立刻就在實踐中體現出來,因此使得很多學生只是為了考試而學習,為了學習而學習,不知道它的作用,考完就還給老師。這樣他們也只獲得了知識的皮毛,而沒有抓住知識的精髓和實質。 二、“數值分析”課程教學方法淺談 1.強調課程的重要性,提高學生的學習興趣 為了讓學生正確對待這門課,應該讓學生充分認識到“數值分析”課程在計算機科學與技術專業中的重要性。在組織教學的過程中,可以安排一些有實踐經驗的學生介紹經驗(這樣學生更好理解,更容易相信,更實際),聯系具體的研究方向,給出簡單的例子,論述“數值分析”在計算機科學與技術專業方向中的應用,讓學生切實感受到“數值分析”課程是后續課程學習的基礎,應用比較廣泛。另外,在教學中教師還必須聯系實際,在課程中穿插一些有實際應用意義的例子,比如現在很多數學建模就用到“數值分析”的內容,可以就里面簡單的例子引用一個。這樣讓學生了解到“數值分析”不是空洞抽象的理論,而是能夠解決實際問題的工具,通過這些方法,使學生逐步樹立“數值分析”比較有用,應該學好“數值分析”課程的觀念。 然而僅有應該學好該課程的觀念還不夠,還應該從各個方面提高學生學習的興趣,興趣是最好的老師,只有有了興趣,學生才會真正自主去學習,而不是被動的,為了考試而學習。如何讓枯燥的課程變得生動有趣是值得研究的問題。在實際教學過程中,可以采用學生自己講解,學生之間互相提問等方法,另外也可以編一些小程序,演示計算機解題的過程,這樣讓學生體會到雖然計算機的功能比較強大,還是需要人腦來控制,靈魂還是人。這樣能使學生在整個課題中能主動思考,而不是被動接收。 2.合理取舍教學內容,把握全局,突出重點 “數值分析”課程所涉及的內容非常豐富,但現在課時有限,因此合理取舍教學內容非常重要,應該在有限的學時內,讓學生掌握比較重要的理論方法,比如根據學生專業的特點,可以將主要的教學時間安排在講解誤差分析,插值,數值積分,方程和方程組的解法上面。在矩陣特征值計算方面,有時間的條件下可以簡單介紹思想方法,而對于常微分方程初值問題的數值解可以舍去,因為本專業的學生沒有學常微分方程,所以對常微分方程初值問題的數值解會無法理解。 3.合理使用多種教學方法和手段 傳統的“黑板+粉筆”的教學模式對數學課程的教學非常重要,通過板書學生可以了解教師處理問題的思維過程,然而鑒于“數值分析”的特點,又不能完全用傳統的教學模式,因為“數值分析”課程中有大量的矩陣和公式,如果單純使用“黑板+粉筆”,黑板無法板書完整,如果擦掉原先板書的內容又無法把前后聯系起來講解,而使用多媒體就可以解決這一問題。另外,有條件的學校可以把上課安排到有投影的機房,在講解算法時教師可以演示一些程序,學生學起來就不會覺得完全是在聽數學課了。因為是計算機專業的學生,這樣和他們的聯系更緊密些,他們也可以通過編程來實現算法。 4.強調理論聯系實踐,培養解決問題的能力 “數值分析”這門課重點講授的是算法,而學生如果沒有很好的實踐,對這些算法的應用只能停留在死記硬背上,這不是學習的目的。本來計算機專業也應該突出學生的動手能力,所以對講授的每個算法都應盡可能讓學生編程來實現,這樣一來可以鞏固學生學到的知識,二來也可以讓學生明白這門課不是單純的數學課,而是和實際聯系比較緊密的一門課。當然要實現每個算法都編程,在所授課的學時內是無法完成的,這樣就要鼓勵學生自己主動去編程,可以采取一些獎勵的措施,比如對編程完成比較好的學生可以適當提高平時成績等。學生自己主動的學習有利于提高其學習興趣,開發學生智力,培養學生解決問題的能力,從而提高學生的綜合素質。 三、總結 隨著計算機的廣泛應用,“數值分析”課程作為計算機科學與技術的一門專業基礎課程,在學生學習和工作中越來越重要,因此“數值分析”課程教學也應該不斷更新知識結構,豐富教學內容,改進教學手段,以提高學生學習興趣,提高教學質量,培養學習的能力,從而為后續課程的學習和將來的工作打下堅實的基礎。 《數值計算方法》課程教學大綱 課程名稱:數值計算方法/Mathods of Numerical Calculation 課程代碼:0806004066 開課學期:4 學時/學分:56學時/3.5學分(課內教學 40 學時,實驗上機 16 學時,課外 0 學時)先修課程:《高等代數》、《數學分析》、《常微分方程》、《C語言程序設計》 適用專業:信息與計算科學 開課院(系):數學與計算機科學學院 一、課程的性質與任務 數值計算方法是數學與應用數學專業的核心課程之一。它是對一個數學問題通過計算機實現數值運算得到數值解答的方法及其理論的一門學科。本課程的任務是架設數學理論與計算機程序設計之間的橋梁,建立解決數學問題的有效算法,討論其收斂性和數值穩定性并尋找誤差估計式,培養學生數值計算的能力。 二、課程的教學內容、基本要求及學時分配 (一)誤差分析 2學時 了解數值計算方法的主要研究內容。2 理解誤差的概念和誤差的分析方法。熟悉在數值計算中應遵循的一些基本原則。重點:數值計算中應遵循的基本原則。難點:數值算法的穩定性。 (二)非線性方程組的求根 8學時 理解方程求根的逐步搜索法的含義和思路 掌握方程求根的二分法、迭代法、牛頓法及簡化牛頓法、非線性方程組求根的牛頓法 3 熟悉各種求根方法的算法步驟,并能編程上機調試和運行或能利用數學軟件求非線性方程的近似根。 重點:迭代方法的收斂性、牛頓迭代方法。難點:迭代方法收斂的階。 (三)線性方程組的解法 10學時 熟練掌握高斯消去法 熟練地實現矩陣的三角分解:Doolittle法、Crout法、Cholesky法、LDR方法。3 掌握線性方程組的直接解法:Doolittle法、Crout法、Cholesky法(平方根法)、改進平方根法、追趕法。 4能熟練地求向量和矩陣的1-范數、2-范數、?-范數和條件數。5 理解迭代法的基本思想,掌握迭代收斂的基本定理。掌握解線性方程組的雅可比(Jacobi)迭代法、高斯-賽德爾(Gauss-Seidel)迭代法、逐次超松馳(SOR)迭代法。7能寫出線性方程組的各種直接解法和間接解法的算法,并能編程上機運行或能利用數學軟件求解線性方程組。 重點:矩陣的三角分解。 難點:線性方程組迭代解法的收斂問題。 (四)插值法 6學時 1.了解插值的一般概念和多項式插值的存在唯一性。 2.熟練掌握Lagrange插值、Newton插值、Hermite插值、分段低次插值及三次樣條插值的求解。 3.熟悉曲線擬合的最小二乘法,能熟練地求矛盾方程組的最小二乘解。 4.能對Lagrange插值、Newton插值、Neville插值、Hermite插值、三次樣條插值、線擬合的最小二乘法等編程上機調試和運行或借助數學軟件求插值函數和曲線擬合。 重點:Lagrange插值、Newton插值、Hermite插值。難點:三次樣條插值的求解。 (五)最佳逼近多項式的一般理論 5學時 了解最佳逼近的基本問題。掌握C[a,b]空間中最佳逼近的唯一性問題。3 了解切貝紹夫定理與Vallee-Poussin定理。 (六)數值微分與數值積分 5學時 了解數值積分的基本思想,能夠熟練地確定具體求積公式的代數精度及確定求積公式的節點和系數。熟練地用Newton-cotes公式,Romberg公式,兩點、三點Gauss公式等進行數值積分 重點:確定具體求積公式的代數精度及確定求積公式的節點和系數。難點:用待定系數法確定Gauss型求積公式的節點和系數。 (七)常微分方程的數值解 4學時 理解常微分方程的數值解的含義 掌握常微分方程的歐拉解法、R—K方法、亞當姆斯方法,理解其算法思想。重點:基于數值積分的方法。難點:R—K方法。 三、推薦教材及參考書 推薦教材: 1、張韻華等編著,數值計算方法與算法,科學出版社,2001。 2、馮天祥編著,數值計算方法,四川科技出版社,2003。參考書: 1、馮天祥編著,數值計算方法理論與實踐研究,西南交通大學出版社,2005。 2、李慶揚等著,數值分析,華中理工大學出版社,2000。 3、林成森著,數值計算方法,科學出版社出版,1999。 4、李慶揚等著,現代數值分析,高等教育出版社,1998。 5封建湖等,計算方法典型題分析解集,西北工業大學出版社,1999。 四、結合近幾年的教學改革與研究,對教學大綱進行的新調整 增加了最佳逼近多項式的一般理論。 大綱制訂者:馮玉明 大綱審定者:陳小春 制訂日期:2008-11-15第二篇:清華大學數值分析實驗報告
第三篇:數值分析實驗報告寫作范本
第四篇:“數值分析”課程教學改革淺談
第五篇:《數值計算方法》課程教學大綱.