写一段用龙贝格算法构造标准正态分布表的python代码
时间: 2023-12-21 21:07:21 浏览: 71
以下是一段使用龙贝格算法构造标准正态分布表的 Python 代码:
```python
import math
def normal_pdf(x):
"""正态分布概率密度函数"""
return math.exp(-x**2/2) / math.sqrt(2*math.pi)
def integrate(f, a, b, n):
"""使用龙贝格算法进行数值积分"""
h = (b - a) / n
x_vals = [a + i*h for i in range(n+1)]
y_vals = [f(x) for x in x_vals]
s = y_vals[0] + y_vals[-1] + 4*sum(y_vals[1:-1:2]) + 2*sum(y_vals[2:-1:2])
return s*h/3
def make_normal_table(step=0.1, digits=3):
"""构造标准正态分布表"""
table = []
for z in range(0, 4*int(3.5/step)+1):
x = z*step - 2
p = integrate(normal_pdf, -math.inf, x, n=1000)
cdf = round(0.5*(1 + math.erf(x/math.sqrt(2))), digits)
table.append((x, p, cdf))
return table
# 输出标准正态分布表
table = make_normal_table(step=0.1, digits=4)
print("x | P(X<=x) | CDF")
for x, p, cdf in table:
print(f"{x:.1f} | {p:.4f} | {cdf:.4f}")
```
代码首先定义了正态分布概率密度函数 `normal_pdf(x)`,使用 `math` 库计算正态分布的概率密度。随后,定义了使用龙贝格算法进行数值积分的函数 `integrate(f, a, b, n)`。该函数接受一个函数对象 `f`,表示需要积分的函数,以及积分的区间 `[a, b]` 和分割数 `n`。函数使用龙贝格算法计算函数在区间 `[a, b]` 上的积分值。
最后,定义了构造标准正态分布表的函数 `make_normal_table(step, digits)`。该函数接受一个步长 `step` 和保留小数位数 `digits` 作为参数,使用 `integrate` 函数计算标准正态分布的概率密度函数和累积分布函数,并将结果保存到一个列表中。列表中的每个元素包括一个取值 `x`、对应的概率密度 `P(X<=x)` 和累积分布函数值 `CDF`,可以输出到控制台作为标准正态分布表。
该代码可以根据需要调整步长和保留小数位数等参数,以控制表格的精度和输出格式。
阅读全文