试验
一
目的:
用递推近似计算定积分
内容:
对
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]
之前两种算法所产生的结果相差不大。但是由于误差传播是逐步扩大的。因而不可直接就此断言那种算法好;随着次数的增大其后果是可怕的,代价是巨大的
。经验在下亲自验证到
Y[50]
时,会出现相当可怕的结果!!
算法一:
算法二:
进行误差分析:
由递推公式布难求出:算法一的误差是
5^n
级别!!
算法二
的误差级别则为
(1/5)^n
级别的!!
综上所述:在数值计算中
如不注意误差分析,就会出现“差之毫厘
失之千里”
的错误结果。我们应重视计算过程中的误差分析,算法分析。
posted on 2006-04-04 11:43
华剑缘 阅读(158)
评论(0) 编辑 收藏 引用