数值分析第一次作业
题目:
已知 e x e^x ex泰勒展开公式为: e x = 1 + x + x 2 2 ! + ⋯ + x n n ! e^x=1+x+\frac{x^2}{2!}+\dots+\frac{x^n}{n!} ex=1+x+2!x2+⋯+n!xn;现设计一python函数,计算使用泰勒展开后 e 2 e^2 e2, e − 2 e^{-2} e−2的绝对误差结果。求 e − 2 e^{-2} e−2过程中, e − x e^{-x} e−x也可以使用 e − x = 1 / e x e^{-x}=1/e^x e−x=1/ex计算。
解题思路:
要计算绝对误差结果,需要解析值-准确值;使用不同n的泰勒展开公式 ,计算解析解与准确解的差。在这里我们以 e 2 e^2 e2, e − 2 e^{-2} e−2在不同n下不同的三种计算方法误差为纵轴值画曲线图分析误差走向。
Python代码
import numpy as np
import math
import matplotlib.pyplot as plt
#a = np.zeros((1,5));
#print (a);
def v(x,n):
'''泰勒展开逼近求e^x,需要误差曲线'''
num=1;
fun=1;
fun1=0;
if x>0:
for i in range(1,n+1):
#print(i);
num=num*i;#阶乘
#print(x);
fun=fun+(1/num)*(pow(x,i));
print(fun);
print("x>0");
return fun;
elif x==0:
fun2=1;
print("x=0");
return fun2;
else:
for j in range(1,n+1):
num=num*j;
fun=fun+(1/num)*(pow(-x,j));
#print(fun);
fun1=1/fun;
print("x<0");
return fun1;
def talv(x,n):
for m in range(1,n+1):
num=num*m;
fun4=fun+(1/num)*(pow(-x,m));
return fun4;
def truev(x):
fun3=math.exp(x);
print(fun3);
return fun3;
def taylorv(x,n):
num1=1;
funt=1;
for i in range(1,n+1):
#print(i);
num1=num1*i;#阶乘
#print(x);
funt=funt+(1/num1)*(pow(x,i));
print(funt);
return funt;
'''e^2taylor展开公式(n为变量)'''
a = np.zeros(20) ;
b = np.arange(1,21);
for i in range(0,20):
a[i]=v(-2, i+1)-truev(-2);#x取值-2/2;
print(a);
fig=plt.figure(figsize=(100,460));
plt.rcParams['font.sans-serif']=['SimHei'];
plt.rcParams['axes.unicode_minus'] = False;
plt.plot(b,a, label='weight changes', linewidth=3, color='r', marker='o',
markerfacecolor='blue', markersize=6);
plt.title(" e^2泰勒展开后取倒数得到e^-2绝对误差与展开项数的关系图",fontsize=14)
plt.xticks(b);
plt.xlabel('n');
plt.ylabel('absolute error');
for x, y in zip(b, a):
plt.text(x, y, y, ha='center', va='bottom', fontsize=8,rotation=18);
plt.show();
'''e^-2taylor展开公式(n为变量)
c = np.zeros(20) ;
d = np.arange(1,21);
for i in range(0,20):
c[i]=taylorv(-2, i+1)-truev(-2);#x取值-2
print(c);
fig=plt.figure(figsize=(100,460));
plt.rcParams['font.sans-serif']=['SimHei'];
plt.rcParams['axes.unicode_minus'] = False;
plt.plot(d,c, label='weight changes', linewidth=3, color='r', marker='o',
markerfacecolor='blue', markersize=6);
plt.title("e^-2直接泰勒展开后绝对误差与展开项数关系图",fontsize=14)
plt.xticks(d);
plt.xlabel('n');
plt.ylabel('absolute error');
for x, y in zip(d, c):
plt.text(x, y, y, ha='center', va='bottom', fontsize=8,rotation=-15);
plt.show();
'''
结果与分析
1、 e 2 e^2 e2泰勒展开后绝对误差与展开项数的关系
e
x
=
1
+
x
+
x
2
2
!
+
⋯
+
x
n
n
!
e^x=1+x+\frac{x^2}{2!}+\dots+\frac{x^n}{n!}
ex=1+x+2!x2+⋯+n!xn。当x固定取2时,绝对误差与泰勒展开项数n的关系如下图所示:
在图1中我们可以看到绝对误差的绝对值随着n的增大在逐渐减小,展开项数越多,泰勒展开得到的值越接近真实值。随着n的增大,接近真实值的速度越来越慢。
2、 e − 2 e^{-2} e−2泰勒展开后绝对误差与展开项数的关系
e x = 1 + x + x 2 2 ! + ⋯ + x n n ! e^x=1+x+\frac{x^2}{2!}+\dots+\frac{x^n}{n!} ex=1+x+2!x2+⋯+n!xn。当x固定取-2时,绝对误差与泰勒展开项数n的关系如下图所示:
在图2中我们可以看到,n取前几个值时绝对误差变化非常剧烈,并且解析值与真实值差距较大,当n变大后,绝对误差的绝对值变小,解析值逐渐靠近真实值。
3、 e 2 e^{2} e2泰勒展开后取倒数得到$e^{-2}绝对误差与展开项数的关系
e
−
x
=
1
/
e
x
=
1
/
(
1
+
x
+
x
2
2
!
+
⋯
+
x
n
n
!
)
e^{-x}=1/e^x=1/(1+x+\frac{x^2}{2!}+\dots+\frac{x^n}{n!})
e−x=1/ex=1/(1+x+2!x2+⋯+n!xn)。当x固定取-2时,绝对误差与泰勒展开项数n的关系如下图所示:
在图3中我们看到,相较于直接泰勒展开取
e
−
2
e^{-2}
e−2的值,求
e
2
e^2
e2值再取倒数这种方法绝对误差的值更稳定。随着n的增大,绝对误差不断减小,并且n越大,绝对误差收敛于0的速度越慢。