數值分析 病態問題 演算法穩定

2021-07-24 22:05:50 字數 4689 閱讀 6618

實驗目的

演算法有」優劣」之分, 問題也有」好壞」之別. 在數值分析的問題中, 如線性代數方程組、矩陣特徵值、非線性方程及方程組都存在病態問題.

問題提出

考慮乙個高次代數多項式:

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位置前。其次,說一下穩定性的好處。排序演算法如果是穩定的,那麼從乙個鍵上排序,然後再從另乙個...