使用python进行数值分析

数值分析第一次作业

题目:

已知 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} e2的绝对误差结果。求 e − 2 e^{-2} e2过程中, e − x e^{-x} ex也可以使用 e − x = 1 / e x e^{-x}=1/e^x ex=1/ex计算。

解题思路:

要计算绝对误差结果,需要解析值-准确值;使用不同n的泰勒展开公式 ,计算解析解与准确解的差。在这里我们以 e 2 e^2 e2, e − 2 e^{-2} e2在不同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} 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的关系如下图所示:

图2
在图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!}) ex=1/ex=1/(1+x+2!x2++n!xn)。当x固定取-2时,绝对误差与泰勒展开项数n的关系如下图所示:
图3
在图3中我们看到,相较于直接泰勒展开取 e − 2 e^{-2} e2的值,求 e 2 e^2 e2值再取倒数这种方法绝对误差的值更稳定。随着n的增大,绝对误差不断减小,并且n越大,绝对误差收敛于0的速度越慢。

综合比较2,3两种近似 e − 2 e^{-2} e2值的方法,第三种方法更稳定,且绝对误差更小。
  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 数值分析是一种广泛应用于科学计算和工程计算中的重要方法。利用Python编程语言进行数值分析计算非常方便和高效。下面是一个例子介绍如何使用Python编写数值分析计算的实习题。 假设我们有一个实习题,要计算一个函数f(x)在区间[a, b]上的定积分。我们可以使用数值积分方法来近似计算这个定积分。例如,可以使用梯形规则来计算: 1. 首先,我们需要定义函数f(x)。例如,假设我们要计算函数f(x) = x^2在区间[0, 1]上的定积分。 ``` def f(x): return x**2 ``` 2. 然后,我们需要实现梯形规则的算法。梯形规则的计算公如下: ``` integral = 0 h = (b - a) / n # 将区间[a, b]等分为n个子区间,h为每个子区间的宽度 for i in range(1, n): x = a + i * h integral += (f(x) + f(x - h)) * h / 2 ``` 3. 最后,我们可以调用该函数来计算积分。假设我们希望将区间[0, 1]等分为100个子区间来逼近积分值: ``` a = 0 b = 1 n = 100 integral = trapezoidal_rule(f, a, b, n) print(integral) ``` 通过上述步骤,我们可以编写一个使用Python进行数值分析计算的实习题。实习题中使用的数值方法可以根据需要进行调整和扩展,而Python具有丰富的数值计算库(例如NumPy和SciPy),可以提供更多强大的数值分析函数和工具,帮助我们完成更复杂的数值计算任务。 ### 回答2: 数值分析是一门应用数学的学科,致力于使用数值方法来近似解决数学问题。Python是一种高级编程语言,具有简单易学、功能强大、开源免费等特点,非常适合用于数值计算和科学计算。 在Python中,可以使用诸如NumPy、SciPy和matplotlib等库来进行数值分析的计算。首先,NumPy提供了丰富的数值和矩阵操作函数,可以方便地进行向量和矩阵的运算。接着,SciPy库提供了各种数值优化、插值、积分、拟合等功能,可以满足各种数值分析的需。最后,matplotlib库可以用于绘制各种图形和图表,用于可视化数值分析的结果。 在解决实习题时,可以使用Python的函数和库来实现各种数值方法,例如用于解非线性方程的牛顿法、用于解线性方程组的高斯消元法或LU分解法、用于数值积分的梯形法或辛普森法等。通过编写相应的函数和调用库函数,可以实现这些数值方法的计算。 在编写代码时,需要注意选择合适的数值方法,并考虑数值误差和收敛性等问题。此外,也可以利用Python的数据结构和控制语句,编写代码来进行实验数据的处理和结果的分析。 总之,使用Python编写数值分析计算实习题可以充分利用Python的优势和强大的数值计算库,实现各种数值方法的计算,并得到准确的结果。同时,Python编程语言的易学性和灵活性,也使得数值分析计算的编写过程更加简单和高效。 ### 回答3: 数值分析是一门应用数学的学科,其主要目的是通过使用计算机来解决数学问题。Python是一种功能强大且易于学习的编程语言,它提供了丰富的数值计算库和工具,非常适合用于数值分析计算。 在使用Python进行数值分析计算时,我们可以使用NumPy库来处理数组和数值操作。它提供了各种基本的数值运算函数和线性代数函数,方便进行数值计算。 例如,假设我们有一个数学问题需要通过迭代方法解方程的根。我们可以使用Python编写一个函数,使用迭代方法来逼近根的值。代码可能如下所示: ```python import numpy as np def iterative_method(f, x0, tolerance, max_iterations): x = x0 for i in range(max_iterations): delta_x = f(x) / f_prime(x) # 根据迭代公计算增量 x = x - delta_x # 更新解 if abs(delta_x) < tolerance: return x # 如果迭代未收敛,则返回None return None # 使用迭代方法解方程x^2 - 2 = 0的根 f = lambda x: x**2 - 2 f_prime = lambda x: 2*x x0 = 1 # 初始猜测 tolerance = 1e-5 # 允许误差 max_iterations = 100 # 最大迭代次数 root = iterative_method(f, x0, tolerance, max_iterations) print("方程的根为:", root) ``` 此代码使用迭代方法来逼近方程x^2 - 2 = 0的根。它将函数和函数的导数作为输入参数,并根据指定的迭代次数和容差来计算逼近根的值。最终,它打印出方程的根。 总结而言,通过使用Python和相应的数值计算库,我们可以使用迭代方法、插值、数值积分等技术来解决各种数值分析问题。 Python提供了强大而灵活的工具,使得数值计算变得简单和高效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值