試驗
一
目的:
用遞推近似計算定積分
內(nèi)容:
對
? n = 0,1,2,…,20?
計算定積分
????
?
?=?
?
代碼:
算法一:
#include
<
stdio.h
>
#include
<
math.h
>
main()


{

???
int
?n;

???
double
?y[
21
];

y[
0
]
=
log(
6
)
-
log(
5
);

for
(n
=
1
;n
<=
20
;n
++
)

?y[n]
=
(
1.0
/
n)
-
5
*
y[n
-
1
];

printf(
"
Data?is:\n
"
);

??????
for
(n
=
1
;n
<=
20
;n
++
)


??????
{

??????printf(
"
y[
""
%d
""
]:??
"
,n);

??????printf(
"
%f
"
,y[n]);

??????printf(
"
\n
"
);

??????printf(
"
\n
"
);

????}
}
Data is:
y[1]:? 0.088392
y[2]:? 0.058039
y[3]:? 0.043139
y[4]:? 0.034306
y[5]:? 0.028468
y[6]:? 0.024325
y[7]:? 0.021233
y[8]:? 0.018837
y[9]:? 0.016926
y[10]:? 0.015368
y[11]:? 0.014071
y[12]:? 0.012977
y[13]:? 0.012040
y[14]:? 0.011229
y[15]:? 0.010522
y[16]:? 0.009890
y[17]:? 0.009372
y[18]:? 0.008696
y[19]:? 0.009151
y[20]:? 0.004243
算法二:
#include
<
stdio.h
>
#include
<
math.h
>
main()


{

???
int
?n;

???
double
?y[
21
];

y[
20
]
=
(
1
/
2
)
*
(
1
/
105
+
1
/
126
);

for
(n
=
20
;n
>=
0
;n
--
)

?y[n
-
1
]
=
((
1.0
/
n)
-
y[n])
/
5.0
;

printf(
"
Data?is:\n
"
);

??????
for
(n
=
1
;n
<=
20
;n
++
)


??????
{

??????printf(
"
y[%d]:??
"
,n);

??????printf(
"
%f
"
,y[n]);

??????printf(
"
\n
"
);

??????printf(
"
\n
"
);

????}
}
Data is:
y[1]:? 0.088392
y[2]:? 0.058039
y[3]:? 0.043139
y[4]:? 0.034306
y[5]:? 0.028468
y[6]:? 0.024325
y[7]:? 0.021233
y[8]:? 0.018837
y[9]:? 0.016926
y[10]:? 0.015368
y[11]:? 0.014071
y[12]:? 0.012977
y[13]:? 0.012040
y[14]:? 0.011229
y[15]:? 0.010523
y[16]:? 0.009884
y[17]:? 0.009406
y[18]:? 0.008526
y[19]:? 0.010000
y[20]:? 0.000000
分析對算法的認識:
在
Y[20]
之前兩種算法所產(chǎn)生的結(jié)果相差不大。但是由于誤差傳播是逐步擴大的。因而不可直接就此斷言那種算法好;隨著次數(shù)的增大其后果是可怕的,代價是巨大的
。經(jīng)驗在下親自驗證到
Y[50]
時,會出現(xiàn)相當可怕的結(jié)果!!
算法一:
?
算法二:
?
進行誤差分析:
由遞推公式布難求出:算法一的誤差是
5^n
級別!!
???????????????????
算法二
的誤差級別則為
(1/5)^n
級別的!!
綜上所述:在數(shù)值計算中
如不注意誤差分析,就會出現(xiàn)“差之毫厘
失之千里”
的錯誤結(jié)果。我們應重視計算過程中的誤差分析,算法分析。
?
posted on 2006-04-04 11:43
華劍緣 閱讀(161)
評論(0) 編輯 收藏 引用