實驗目的
演算法有」優劣」之分, 問題也有」好壞」之別. 在數值分析的問題中, 如線性代數方程組、矩陣特徵值、非線性方程及方程組都存在病態問題.
問題提出考慮乙個高次代數多項式:
p(x)
=(x−
1)(x
−2).
..(x
−19)(
x−20)
=∏k=
120(x
−k)(
1)顯然, 這個多項式有單重根1,
2,3,
...20 .
現考慮乙個擾動: p(
x)+e
x19=0
(2) 其中e
是非常小
的乙個數
.
分析方程(1
) 和方程(2
) 根的差別, 從而得到方程(1
) 的解對擾動的敏感性.
實驗要求
matlab程式
%數值實驗1.1病態問題
%輸入:[0,20]之間的的擾動項及小的擾動常數
%輸出:加擾動後得到的全部根
result = inputdlg(,'charpt1_1',1,);
numb = str2num(char(result));
if((numb > 20) || (numb < 0))
errordlg('請選擇正確的擾動項:[0,20]之間的整數:');
return;
endresult = inputdlg(,'charpt1_1',1,);
ess = str2num(char(result)); %#ok<*st2nm>
ve = zeros(1,21);
ve(21 - numb) = ess;
root = roots(poly(1:20)+ve);
disp(['對第',num2str(numb),'加擾動',num2str(ess),',得到的全部根為:']);
disp(num2str(root));
擾動第19項
擾動第15項
擾動第10項
擾動第5項
擾動第1項
真實解22.5961+2.3083i
19.9979
20.0003
20.003
20.0003
2022.5961-2.3083i
19.0178
18.9972
18.9972
18.9972
1918.8972+5.00563i
17.919
18.0112
18.0112
18.0112
1818.8972-5.00563i
17.1646
16.9711
16.9711
16.9711
1714.9123+4.95848i
15.5656
16.0483
16.0483
16.0483
1614.9123-4.95848i
15.4595
14.9354
14.9354
14.9354
1512.0289+3.73551i
13.7373
14.0653
14.0653
14.0653
1412.0289-3.73551i
13.1828
12.9491
12.9491
12.9491
1310.059+2.33021i
11.94
12.0334
12.0334
12.0334
1210.059-2.33021i
11.018
10.984
10.984
10.984
118.63829+1.05641i
9.99768
10.0061
10.0061
10.0061
108.63829-1.05641i
8.99968
8.99839
8.99839
8.99839
97.70894+0i
8.00025
8.00028
8.00028
8.00028
87.02801+0i
6.99994
6.99997
6.99997
6.99997
75.99942+0i
6.0000166
665.00001+0i55
5554+0i44
4443+0i33
3332+0i22
2221+0i11
111
實驗目的
演算法穩定性非常重要, 誤差擴張的演算法是不穩定的, 誤差衰減的演算法是穩定的, 衰減的誤差是演算法設計的目標.
問題提出
考慮乙個簡單的定積分序列: en
=∫10
xnex
−1dx
,n=1
,2,3...
顯然積分序列為遞推關係: en
=1−n
en−1
,n=1
,2,3...
實驗要求
我們由遞推關係, 可以得到兩種演算法:
matlab程式
%數值實驗1.2:誤差傳播與演算法穩定性
%輸入:遞推公式選擇與遞推步數
%輸出:個布遞推值及誤差結果,以及遞推值和誤差與遞推步數的關係圖
promps = ;
result = inputdlg(promps,'charpt1_2',1,);
nb = str2num(char(result)); %#ok<*st2nm>
if((nb ~= 1) && (nb ~= 2))
errordlg('請選擇遞推關係式,若選擇演算法1,請輸入1,否則請輸入2!');
return;
endresult = inputdlg(,'charpt1_2',1,);
steps = str2num(char(result));
if(steps < 1)
errordlg('遞推步數錯誤!');
return;
endresult = inputdlg(,'charpt 1_2',1,);
sd = str2num(char(result));
format long %設定顯示精度
result = zeros(1,steps);
err = result; %#ok<*nasgu>
func = result;
%用庫函式quadl計算積分近似值
for n = 1:steps
fun = @(x) x.^n.*exp(x-1);
func(n) = quadl(fun,0,1); %#ok<*dquadl>
endif(nb == 1)
%用演算法1計算
digits(sd);%控制有效數字位數
result(1) = subs(vpa(1/exp(1)));
for n = 2:steps
result(n) = subs(vpa(1-n * result(n-1)));
enderr = abs(result - func);
elseif(nb == 2)
%用演算法2計算
digits(sd);%控制有效數字位數
result(steps) = 0;
for n = steps:-1:2
result(n-1) = abs(vpa((1 - result(n)) /n ));
enderr = abs(result - func);
end
clf;%清除當前影象視窗
disp('遞推值:');
disp(sprintf('%e ',result)); %#ok<*dsps>
disp('誤差:');
disp(sprintf('%e ',err));
plot([1:steps], result,'-'); %#ok<*nbrak
text(4,result(1),'\downarrow en');
grid on;
hold on;
plot([1:steps], err,'r--');
xlabel('n');
ylabel('en and err n');
text(2,err(2),'\uparrow err(n)');
實驗結果2
實驗結果3 實驗結果4數值分析實驗一 捨入誤差與數值穩定性
通過上機程式設計,複習鞏固以前所學程式語言 通過上機計算,了解捨入誤差所引起的數值不穩定性。通過上機計算,了解運算次序對計算結果的影響,從而盡量避免大數吃小數的現象。通過正反兩個例項的計算,了解利用計算機進行數值計算中捨入誤差所引起的數值不穩定性,深入理解初始小的捨入誤差可能造成誤差積累從而對計算結...
穩定匹配問題 穩定婚姻演算法設計
include using namespace std bool finish or not int,int bool current male is better int num,int male rank in female,int current,int chasing int main fo...
排序演算法穩定性分析
首先,排序演算法的穩定性大家應該都知道,通俗地講就是能保證排序前2個相等的數其在序列的前後位置順序和排序後它們兩個的前後位置順序相同。在簡單形式化一下,如果ai aj,ai原來在位置前,排序後ai還是要在aj位置前。其次,說一下穩定性的好處。排序演算法如果是穩定的,那麼從乙個鍵上排序,然後再從另乙個...