东南大学研究生-数值分析上机题(2023)Python 1 绪论

舍入误差与有效数

1.1 题目

设 S N = ∑ j = 2 N 1 j 2 − 1 S_N=\sum\limits_{j=2}^{N}\displaystyle\frac{1}{j^2-1} SN=j=2∑Nj2−11其精确值为 1 2 ( 2 3 − 1 N − 1 N + 1 ) \displaystyle\frac{1}{2}\left(\frac{2}{3}-\frac{1}{N}-\frac{1}{N+1} \right) 21(32−N1−N+11)

(1) 编写按从大到小的顺序 ( S N = 1 2 2 − 1 + 1 3 2 − 1 + ⋯ + 1 N 2 − 1 ) \left( S_N=\displaystyle\frac{1}{2^{2}-1}+\frac{1}{3^{2}-1}+\cdots+\frac{1}{N^{2}-1} \right) (SN=22−11+32−11+⋯+N2−11)计算 S N S_N SN的通用程序;

(2) 编写按从小到大的顺序 ( S N = 1 N 2 − 1 + 1 ( N − 1 ) 2 − 1 + ⋯ + 1 2 2 − 1 ) \displaystyle\left(S_N=\frac{1}{N^{2}-1}+\frac{1}{(N-1)^{2}-1}+\cdots+\frac{1}{2^{2}-1} \right) (SN=N2−11+(N−1)2−11+⋯+22−11)计算 S N S_N SN的通用程序;

(3) 按上面两种顺序分别计算 S 1 0 2 \rm S_{10^2} S102, S 1 0 4 \rm S_{10^4} S104, S 1 0 6 \rm S_{10^6} S106并指出有效位数(编写程序时用单精度);

(4) 通过本上机题你明白了什么?

1.2 Python源程序

py 复制代码
import numpy as np  
  
N = input("请输入N的值:")  
N = int(N)  
Accurate_value = 1 / 2 * (3 / 2 - 1 / N - 1 / (N + 1))  
Accurate_value = np.single(Accurate_value)  
# 从大到小的顺序 计算S_N  
SNl2s = np.single(0)  
SNs2l = np.single(0)  
# 从小到大的顺序 计算S_N  
for n in range(2, N + 1):  
    SNl2s += np.single(1/(n*n-1))  
for m in range(N, 1, -1):  
    SNs2l += np.single(1/(m*m-1))  
print('准确值 SN= {:.8f}'.format(Accurate_value))  
print('从大到小的顺序计算值 SN= {:.8f}'.format(SNl2s))  
print('从小到大的顺序计算值 SN= {:.8f}'.format(SNs2l))
程序说明
  • 由于Python中的变量小数类型只有双精度浮点形式(float),所以采用Numpy库中的single()函数将变量类型转换为单精度浮点;
  • 将准确值、从大到小与从小达到算出的结果 S N \rm S_N SN保留8位小数输出,方便进行比较。

1.3 程序运行结果


复制代码
请输入N的值:100
准确值 SN= 0.74004948
从大到小的顺序计算值 SN= 0.74004948
从小到大的顺序计算值 SN= 0.74004954

复制代码
请输入N的值:10000
准确值 SN= 0.74989998
从大到小的顺序计算值 SN= 0.74985212
从小到大的顺序计算值 SN= 0.74989998

复制代码
请输入N的值:1000000
准确值 SN= 0.74999899
从大到小的顺序计算值 SN= 0.74985212
从小到大的顺序计算值 SN= 0.74999905

表1.1 程序运行结果表

N 102 104 106
准确值SN 0.74004948 0.74989998 0.74999899
从大到小的计算值SN 0.74004948 0.74985212 0.74985212
从小到大的计算值SN 0.74004954 0.74989998 0.74999905
从大到小的计算值有效位数 8 5 4
从小到大的计算值有效位数 7 8 7

1.4 结果分析

  • 对于一个数值的计算,计算的方法不同得到的结果也不同,计算方法对误差的传播存在一定的影响,数值计算选用合适的方法;
  • 对于N为102的运算,从小到大顺序的计算值要比从大到小顺序的计算值有效位数大致相同,推测原因是累加次数较少,两种顺序的计算结果相差不大;
  • 对于N为104与106的运算,从大到小的计算顺序出现了"大数吃小数"的现象,计算结果的有效位数出现了降低的现象,后续累加的数都比较小,在相加过程中被大数吃掉,使得结果差距无法在单精度上体现,而从小到大的计算顺序可以一定程度上避免该现象。
  • 在今后对此类累加运算的处理尽量采用从小到大顺序进行累加运算。
相关推荐
AndrewHZ19 小时前
【图像处理基石】暗光增强算法入门:从原理到实战(Python+OpenCV)
图像处理·python·opencv·算法·计算机视觉·cv·暗光增强
纪伊路上盛名在19 小时前
python5.1 数据类dataclass
python·面向对象编程·oop
用户7188417507819 小时前
深究 Python 中 int () 函数为何无法转换含小数点的字符串
python
on_pluto_20 小时前
LLaMA: Open and Efficient Foundation Language Models 论文阅读
python·机器学习
小二·20 小时前
mac下解压jar包
ide·python·pycharm
XXX-X-XXJ20 小时前
二:RAG 的 “语义密码”:向量、嵌入模型与 Milvus 向量数据库实操
人工智能·git·后端·python·django·milvus
AI小云20 小时前
【Python与AI基础】Python编程基础:模块和包
人工智能·python
努力努力再努力wz21 小时前
【C++进阶系列】:万字详解智能指针(附模拟实现的源码)
java·linux·c语言·开发语言·数据结构·c++·python
小蕾Java21 小时前
Python详细安装教程(附PyCharm使用)
开发语言·python·pycharm
weixin_3077791321 小时前
使用AWS IAM和Python自动化权限策略分析与导出
开发语言·python·自动化·云计算·aws