數值計算方法

2022-08-28 22:48:23 字數 3729 閱讀 3791

數值計算方法知識面涉及微積分,線性代數;運用程式設計的方法來解決關於數值計算的問題,其中重點討論如何最小化誤差,一些方程的數值解法,以及插值和擬合問題。其中的知識可以作為資料探勘的基礎。

執行》 5.1-5-0.1和》 1.5-1-0.5,給出執行結果,並簡要分析一下產生現象的原因

**:

>>x1=5.1-5-0.1

>>x1=

>>-3.608224830031759e-16

>>x2=1.5-1-0.5

>>x2=

>>0

原因:

浮點數表示時數字時位數有限,以雙精度浮點數為例,共64位。

對於5.1,符號位一位,指數字11,整數部分佔3位,小數部分0.1不能精確表示只能近似用49位表示。5.1-5-0.1,5被精確表示,0.1則用52位近似表示。故5.1中的小數部分0.1在計算機中比0.1小,最後結果為負。而x2=1.5-1-0.5中,所有的數都被精確表示了,故其結果為0.

設$i_n = \int_0^1 \frac dx$

(1) 從$i_0$盡可能精確的近似值出發,利用遞推式$i_n = -5i_ + \frac\ \ \ \ (n = 1, 2, 3, ... ,20)$,計算$i_$的近似值;

(2) 從$i_$較粗糙的估計值出發,利用遞推式$i_ = -\fraci_n + \frac\ \ \ \ (n = 20, 19, ... , 1)$計算$i_0$的近似值;

(3) 分析結果的可靠性以及出現這種現象的原因.

(一) 程式設計

1 演算法

$$i_n = -5i_ + \frac \ \ \ \ (n = 1, 2, 3, ... , 20)$$

2 說明事項

(二) 源程式

matlab:

function [ y ] = test1_1( n )

y=log(1.2);

for i=1:1:n

y=-5*y+1/i;

end

python:

import math

def test1_1(n):

y = math.log(1.2, math.e)

for i in range(1, n+1, 1):

y = -5 * y + 1 / i

print("%e" % y)

if __name__ == "__main__":

test1_1(20)

(三) 實驗結果
>> test1_1(20)

>> ans =

4.242637044921560e-03

(一) 程式設計

1 演算法

$$i_ = -\fraci_n + \frac \ \ \ \ (n = 20, 19, ... , 1)$$

2 說明事項

(二) 源程式

function [ y ] = test1_2

y=4.0e-03;

for i=20:-1:1;

y=y/(-5)+1/(5*i);

end

(三) 實驗結果
>> test1_2

>> ans =

1.823215567939546e-01

與log(1.2)的值相同

對於第乙個公式

$$i_n = -5i + \frac\ \ \ \ (n = 1, 2, 3, ... , 20)$$

分析其誤差傳遞

$$\varepsilon(i^_n) = |i_n - i^

n| = -5|i - i^_| = (-5)^ \varepsilon(i^

0)$$

20次之後其誤差驚人,其結果不可取

對於第二個公式

$$i = -\fraci_n + \frac \ \ \ \ (n = 20, 19, ... , 1)$$

分析其誤差傳遞

$$\varepsilon(i^) = |i - i^_| = -\frac|i_n - i^_n| = (-\frac)^ \varepsilon(i^_n)$$

20次之後誤差很小

用下列方法求方程$e^x + 10x - 2 = 0$的近似根,要求誤差不超過$\frac \times 10^-3$,並比較計算量

(1) 在區間[0, 1]上用二分法;

(2) 取初值$x_0 = 0$並用迭代過程$x_ = \frac}\ \ \ \ (k = 0, 1, 2, ...)$;

(3) 取初值$x_0 = 0$用牛頓法.

(一) 程式設計

1 演算法

二分法通過縮短短區間,一步步逼近方程的根

2 說明事項

此**只適用於本程式

(二) 源程式

function [ x ] = test2_1

a=0;

b=1;

i=1;

while 1

x=(a+b)/2;

fa=exp(a)+10*a-2;

fb=exp(b)+10*b-2;

fx=exp(x)+10*x-2;

if (abs(fa-fb)<1e-3);

break;

endif (fa*fx>0)

a=x;

else

b=x;

endi++;

endi

(三) 試驗結果
>>test2_1

>>i=1.50000000000000e+001

>>ans=9.05456542968750e-002

(一) 程式設計

1 演算法

迭代公式$x_ = \frac}\ \ \ \ (k = 0, 1, 2, ...)$

(二) 源程式

function [ y ] = fun2_1( x )

y=x;

i=1;

while 1

y1=y;

y=0.1*(2-exp(y1));

if (abs(y-y1)<5e-4)

break;

endi++;

endi

(三) 試驗結果
>>test2_2(0)

>>i=4.00000000000000e+000

>>ans=9.05126166743651e-002

(一) 程式設計

1 演算法

牛頓迭代公式$x_ = x_k - \frac$

2 說明事項

因為計算公式中有除法,必須對除數為0的情況作異常處理.

(二) 源程式

function [ y ] = fun2_3( x )

y=x;

i=1;

while 1

y1=y;

y=y1-(exp(y1)+10*y1-2)/(exp(y1)+10);

if (abs(y-y1)<5e-4)

break;

endi++;

endi

(三) 試驗結果
>>test2_3(0)

>>i=2.00000000000000e+000 %i為迭代次數

>>ans=9.05251085833896e-002 %ans為根

數值計算方法實驗

1.給定下述演算法框圖,用逐步掃瞄法和二分法求方程x5 3x 1 0的最小正根,要求準確到1 2 10 2。要求 1 取步長h 1,先用逐步掃瞄法程式設計搜尋乙個隔根區間,將搜尋到的隔根區間列印輸出 2 然後對該區間使用二分法求方程的滿足精度要求的根,每二分一次,用新生成區間長度的一半作為是否二分結...

Matlab 數值計算方法作業

2 簡單迭代法 3 牛頓迭代法 結果分析 二分法計算函式的零點 輸入求根區間a,b和求根精度abtol 函式輸出根的近似值,和迭代次數 function dichotomy a input 請輸入求根的下限,a b input 請輸入求根的上限,b abtol input 請輸入求根的精度,abto...

數值計算方法程式庫

sparse bundle adjustment即稀疏集束調整,現在廣泛應用於計算機視覺領域,基本成為最後優化的標準演算法,就是在已經得到的初始攝像機引數和三維點資料的基礎針對投影誤差進行優化,得到使得均方投影誤差最小意義下的motion和structure。其演算法的核心是利用levenberg ...