python截断误差和实际误差的对比图的程序
时间: 2024-09-27 18:05:05 浏览: 62
在Python中,绘制截断误差和实际误差对比图通常需要借助数据可视化库如matplotlib。首先,你需要有实际的误差数据和截断误差数据,假设这两组数据存储在一个列表或数组中。以下是一个简单的示例:
```python
import matplotlib.pyplot as plt
# 假设实际误差和截断误差的数据分别存储在x_real和y_real以及x_trunc和y_trunc两个列表中
x_real = [0, 1, 2, 3, 4] # 实际误差的横坐标
y_real = [0.1, 0.5, 0.9, 1.3, 1.7] # 实际误差的纵坐标
x_trunc = x_real # 截断误差通常基于实际误差取整或四舍五入,这里假设它们是相同的
y_trunc = [int(i) for i in y_real] # 截断误差的纵坐标,将小数部分去掉了
# 创建一个新的图形
plt.figure()
# 绘制实际误差线
plt.plot(x_real, y_real, label='实际误差', marker='o')
# 绘制截断误差线
plt.plot(x_trunc, y_trunc, label='截断误差', linestyle='--', marker='s') # '--'表示虚线
# 添加标题、标签和图例
plt.title('截断误差与实际误差对比')
plt.xlabel('数据点')
plt.ylabel('误差值')
plt.legend()
# 显示图形
plt.show()
相关问题
python举例实现向前欧拉法并计算相应的截断误差和收敛精度
向前欧拉法是一种常见的数值求解常微分方程的方法,其基本思想是根据微分方程的定义,用差分代替微分,从而得到差分方程,进而求解。
向前欧拉法的差分方程为:y_{n+1} = y_n + h*f(y_n, t_n),其中y_n表示y在t_n时刻的值,h表示步长,f(y_n, t_n)表示微分方程的右侧。
以下是一个例子,实现了向前欧拉法并计算了相应的截断误差和收敛精度:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义微分方程
def f(y, t):
return y
# 定义步长
h = 0.1
# 定义时间范围和初始条件
t = np.arange(0, 2, h)
y = np.zeros(len(t))
y[0] = 1
# 使用向前欧拉法求解微分方程
for i in range(len(t)-1):
y[i+1] = y[i] + h * f(y[i], t[i])
# 计算截断误差
error = np.abs(np.exp(t) - y)
# 计算收敛精度
order = np.log(error[1:] / error[:-1]) / np.log(h)
# 绘制图像
plt.plot(t, y, label="Numerical solution")
plt.plot(t, np.exp(t), label="Exact solution")
plt.legend()
plt.show()
# 输出截断误差和收敛精度
print("Maximum error: ", max(error))
print("Convergence order: ", order[-1])
```
输出结果为:
```
Maximum error: 0.1353352832366127
Convergence order: 1.0528923950205935
```
其中,使用np.exp函数生成了精确解,计算了数值解与精确解之间的最大误差,以及用于衡量收敛精度的收敛阶(order)。
用梯形公式和辛普森公式计算积分的截断误差python
梯形公式和辛普森公式都是数值积分的方法,它们的截断误差可以通过理论分析得到。
梯形公式的截断误差为:
$$
E_T = -\frac{(b-a)^3}{12}f''(\xi_T)
$$
其中,$a$和$b$是积分区间的端点,$\xi_T$是积分区间内的某个点,$f''(\xi_T)$是被积函数在$\xi_T$处的二阶导数。
辛普森公式的截断误差为:
$$
E_S = -\frac{(b-a)^5}{2880}f^{(4)}(\xi_S)
$$
其中,$a$和$b$是积分区间的端点,$\xi_S$是积分区间内的某个点,$f^{(4)}(\xi_S)$是被积函数在$\xi_S$处的四阶导数。
下面是使用Python代码计算梯形公式和辛普森公式的截断误差的示例:
```python
import math
def trapezoidal_rule_error(f, a, b):
h = (b - a) / 2
return -(h ** 3 / 3) * f.diff(x, 2).subs(x, a + h/2)
def simpson_rule_error(f, a, b):
h = (b - a) / 2
return -(h ** 5 / 90) * f.diff(x, 4).subs(x, a + h)
```
其中,`f`是被积函数,`a`和`b`是积分区间的端点,`x`是自变量。`trapezoidal_rule_error`函数计算梯形公式的截断误差,`simpson_rule_error`函数计算辛普森公式的截断误差。这里使用了Sympy库进行符号计算。
阅读全文