2022年 11月 4日

Python在高等数学中的运用

文章目录

    • 一、问题背景
    • 二、实验目的
    • 三、实验原理与数学模型
    • 四、实验所用软件
    • 五、主要内容
    • 六、实验过程
      • 1. 函数极限的求解和两个重要极限
      • 2. 导数与微分的研究
      • 3. 定积分与不定积分以及重积分的研究
      • 4. 求微分方程的解析解
    • 七、实验结果报告与总结
    • 八、思考与深入

一、问题背景

高等数学应用非常广,基本上涉及到函数的地方都要用到微积分,还有在几何方面也是如此,计算机的应用让我们能简单快速处理各种高等数学中的计算,比如极限、导数、积分、微分方程等的计算。

二、实验目的

使用 Python 通过计算与作图,加强对极限、导数、积分等概念的理解,并掌握它们计算方法,以及求微分方程和方程组解析解的方法。

三、实验原理与数学模型

  1. 函数极限

    lim

    x

    a

    f

    (

    x

    )

    =

    A

    \lim_{x \to a}{f(x)}=A

    limxaf(x)=A求解讨论以及两个重要极限

    lim

    x

    0

    s

    i

    n

    (

    x

    )

    x

    =

    1

    \lim_{x \to 0}{\frac{sin(x)}{x}}=1

    limx0xsin(x)=1

    lim

    x

    (

    1

    +

    1

    x

    )

    x

    =

    e

    \lim_{x \to \infty}{(1+\frac{1}{x})^x}=e

    limx(1+x1)x=e的验证。

  2. 导数概念和导数的几何意义,以及计算多元函数偏导数和全微分的方法。

  3. 一元函数积分学

    f

    (

    x

    )

    d

    x

    \int{f(x)dx}

    f(x)dx和多元函数积分学

    f

    (

    x

    ,

    y

    )

    d

    x

    d

    y

    \iint{f(x,y)}dxdy

    f(x,y)dxdy

  4. 微分方程和方程组在有无初始条件的分析。

四、实验所用软件

  • Python 3.7
  • NumPy 1.16.4
  • SymPy 1.4
  • Matplotlib 3.1.1

五、主要内容

  1. 函数极限的求解和两个重要极限的探究;
  2. 导数、高阶导数以及隐函数、参数方程定义函数导数的求解,多元函数偏导数和全微分的求解;
  3. 计算定积分和不定积分以及重积分的方法;
  4. 求解微分方程以及方程组解析解的方法。

六、实验过程

1. 函数极限的求解和两个重要极限

在这个实验中我们通过对简单的函数进行单侧极限的求解,并且分析两个重要极限。

例 1:考虑函数

y

=

a

r

c

t

a

n

(

1

x

)

y=arctan(\frac{1}{x})

y=arctan(x1)

x

=

0

x=0

x=0的左右极限。

解:编写Python代码如下:

import matplotlib.pyplot as plt
import numpy as np
import sympy as sp

# 求函数 y=arctan(1/x) 的左右极限
x = sp.Symbol('x')
fr = sp.atan(1 / x)
xl = sp.limit(fr, x, 0, dir='-')
xr = sp.limit(fr, x, 0, dir='+')
print('%s 左极限是:%s' % (str(fr), str(xl)))
print('%s 右极限是:%s' % (str(fr), str(xr)))
# 绘制函数 y=arctan(1/x) 的图像
x = np.arange(-6, 6, 0.01)
y = np.arctan(1 / x)
plt.title('y=arctan(1/x)')
plt.plot(x, y)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行代码输出结果和绘制图像:

atan(1/x) 左极限是:-pi/2
atan(1/x) 右极限是:pi/2
  • 1
  • 2

在这里插入图片描述
根据计算结果和绘制的图像分析求得出题中函数的左右极限分别为

π

2

-\frac{\pi}{2}

2π

π

2

\frac{\pi}{2}

2π

例 2:两个重要极限

lim

x

0

s

i

n

(

x

)

x

=

1

\lim_{x \to 0}{\frac{sin(x)}{x}}=1

limx0xsin(x)=1

lim

x

(

1

+

1

x

)

x

=

e

\lim_{x \to \infty}{(1+\frac{1}{x})^x}=e

limx(1+x1)x=e 的验证。

解:编写Python代码如下:

import matplotlib.pyplot as plt
import numpy as np
import sympy as sp

# 分析两个重要极限
x = sp.Symbol('x')
f1 = sp.sin(x) / x
f2 = (1 + 1 / x) ** x
x1 = sp.limit(f1, x, 0)
x2 = sp.limit(f2, x, 'oo')
print('%s 第一重要极限的值:%s' % (str(f1), str(x1)))
print('%s 第二重要极限的值:%s' % (str(f2), str(x2)))
# 绘制函数图像分析两个重要极限
x1 = np.arange(-3, 3, 0.01)
x2 = np.arange(0.01, 100, 0.1)
y1 = np.sin(x1) / x1
y2 = (1 + 1 / x2) ** x2
plt.figure(figsize=(12, 5))
plt.subplot(121)
plt.title('y=sin(x)/x')
plt.plot(x1, y1)
plt.subplot(122)
plt.title('y=(1+1/x)**x')
plt.plot(x2, y2)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

运行代码输出结果和绘制图像:

sin(x)/x 第一重要极限的值:1
(1 + 1/x)**x 第二重要极限的值:E
  • 1
  • 2

在这里插入图片描述
根据上图变化趋势理解函数极限和程序得出的答案,验证两个重要极限。

2. 导数与微分的研究

在这个实验中,我们探究导数概念及其几何意义,高阶导数,隐函数导数,参数方程定义的函数导数,以及求解多元函数偏导数和全微分。

例 1:求

f

(

x

)

=

2

x

3

+

3

x

2

12

x

+

7

f(x)=2x^3+3x^2-12x+7

f(x)=2x3+3x212x+7 的导函数,并作出该函数图形和在

x

=

1

x=-1

x=1 处的切线。

解:编写Python代码如下:

import matplotlib.pyplot as plt
import numpy as np
import sympy as sp

# 导数与微分
x = sp.Symbol('x')
f = 2 * x ** 3 + 3 * x ** 2 - 12 * x + 7
d = sp.diff(f)
print('%s 的导函数为:%s' % (f, d))
y_d = d.evalf(subs={x: -1})
y_h = f.evalf(subs={x: -1})
print('将x=-1代入导函数求解为:%d' % (y_d))
print('将x=-1代入原函数求解为:%d' % (y_h))
f_d = y_d * (x + 1) + y_h
print('得出切线方程为:%s' % f_d)
# 绘制函数图和切线图
x = np.arange(-4, 3, 0.01)
y1 = 2 * x ** 3 + 3 * x ** 2 - 12 * x + 7
y2 = 8 - 12 * x
plt.title('函数y=2*x**3+3*x**2-12*x+7以及当x=-1时的切线')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.plot(x, y1, x, y2)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

运行代码输出结果和绘制图像:

2*x**3 + 3*x**2 - 12*x + 7 的导函数为:6*x**2 + 6*x - 12
将x=-1代入导函数求解为:-12
将x=-1代入原函数求解为:20
得出切线方程为:8.0 - 12.0*x
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
最后执行便在同一个坐标系内作出了函数

f

(

x

)

f(x)

f(x)的图形和它在

x

=

1

x=-1

x=1 处的切线(直线为切线)。

此两行代码是为了解决在绘图中中文显示乱码的问题。

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
  • 1
  • 2

例 2:求函数

y

=

x

10

+

2

(

x

10

)

9

y=x^{10}+2(x-10)^9

y=x10+2(x10)9 的1阶到11阶导数。

解:编写Python代码如下:

import sympy as sp

x = sp.Symbol('x')
y = x ** 10 + 2 * (x - 10) ** 9
for n in range(1, 12):
    y = d = sp.diff(y)
    print('第%2d阶导数为:%s' % (n, d))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行代码输出结果:

第 1阶导数为:10*x**9 + 18*(x - 10)**8
第 2阶导数为:90*x**8 + 144*(x - 10)**7
第 3阶导数为:720*x**7 + 1008*(x - 10)**6
第 4阶导数为:5040*x**6 + 6048*(x - 10)**5
第 5阶导数为:30240*x**5 + 30240*(x - 10)**4
第 6阶导数为:151200*x**4 + 120960*(x - 10)**3
第 7阶导数为:604800*x**3 + 362880*(x - 10)**2
第 8阶导数为:1814400*x**2 + 725760*x - 7257600
第 9阶导数为:3628800*x + 725760
第10阶导数为:3628800
第11阶导数为:0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

输出即为题中要求所得函数高阶导数。

例 3:求由方程

2

x

2

2

x

y

+

y

2

+

x

+

2

y

+

1

=

0

2x^2-2xy+y^2+x+2y+1=0

2x22xy+y2+x+2y+1=0 确定的隐函数的导数。

解:编写Python代码如下:

import sympy as sp

x, y = sp.symbols('x y')
z = 2 * x ** 2 - 2 * x * y + y ** 2 + x + 2 * y + 1
d = -sp.diff(z, x) / sp.diff(z, y)
print('原方程导数为:%s' % d)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行代码输出结果:

原方程导数为:(-4*x + 2*y - 1)/(-2*x + 2*y + 2)
  • 1

该实验根据隐函数求导公式

d

y

d

x

=

F

x

F

y

\frac{dy}{dx}=-\frac{F_x}{Fy}

dxdy=FyFx 求得,然后再根据一般求导公式即可求出结果。

例 4:求由参数方程

x

=

e

t

c

o

s

(

t

)

,

y

=

e

t

s

i

n

(

t

)

x=e^tcos(t), y=e^tsin(t)

x=etcos(t),y=etsin(t) 确定的函数的导数。

解:编写Python代码如下:

import sympy as sp

t = sp.Symbol('t')
x = sp.exp(t) * sp.cos(t)
y = sp.exp(t) * sp.sin(t)
d = sp.diff(y, t) / sp.diff(x, t)
print('原参数方程导数结果为:%s' % d)
d = sp.simplify(d)
print('原参数方程导数化简为:%s' % d)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

运行代码输出结果:

原参数方程导数结果为:(exp(t)*sin(t) + exp(t)*cos(t))/(-exp(t)*sin(t) + exp(t)*cos(t))
原参数方程导数化简为:tan(t + pi/4)
  • 1
  • 2

根据参数方程求导法则最后求得由参数方程确定函数的导数。

例 5:设

z

=

s

i

n

(

x

y

)

+

c

o

s

2

(

x

y

)

z=sin(xy)+cos^2(xy)

z=sin(xy)+cos2(xy) ,求

z

x

,

z

y

,

2

z

x

2

,

2

z

x

y

\frac{\partial{z}}{\partial{x}}, \frac{\partial{z}}{\partial{y}}, \frac{\partial^2z}{\partial{x^2}}, \frac{\partial^2z}{\partial{x}\partial{y}}

xz,yz,x22z,xy2z

解:编写Python代码如下:

import sympy as sp

x, y = sp.symbols('x y')
z = sp.sin(x * y) + (sp.cos(x * y)) ** 2
d1 = sp.diff(z, x)
d2 = sp.diff(z, y)
d3 = sp.diff(z, x, 2)
d4 = sp.diff(sp.diff(z, x), y)
print('第一偏导数为:%s' % d1)
print('第二偏导数为:%s' % d2)
print('第三偏导数为:%s' % d3)
print('第四偏导数为:%s' % d4)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

运行代码输出结果:

第一偏导数为:-2*y*sin(x*y)*cos(x*y) + y*cos(x*y)
第二偏导数为:-2*x*sin(x*y)*cos(x*y) + x*cos(x*y)
第三偏导数为:y**2*(2*sin(x*y)**2 - sin(x*y) - 2*cos(x*y)**2)
第四偏导数为:2*x*y*sin(x*y)**2 - x*y*sin(x*y) - 2*x*y*cos(x*y)**2 - 2*sin(x*y)*cos(x*y) + cos(x*y)
  • 1
  • 2
  • 3
  • 4

以上为多元函数偏导数的结果。

3. 定积分与不定积分以及重积分的研究

在这个实验中,我们研究定积分与不定积分的计算,以及多重积分的计算,深入理解曲线积分、曲面积分的概念个计算方法。

例 1:计算

4

x

2

d

x

\int{\sqrt{4-x^2}dx}

4x2
dx

1

2

4

x

2

\int_1^2{\sqrt{4-x^2}}

124x2

解:编写Python代码如下:

import sympy as sp

x = sp.Symbol('x')
y = sp.sqrt(4 - x ** 2)
i1 = sp.integrate(y, x)
i2 = sp.integrate(y, (x, 1, 2))
print('不定积分的结果为:%s' % i1)
print('定积分的结果为:%s' % i2)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行代码输出结果:

不定积分的结果为:x*sqrt(4 - x**2)/2 + 2*asin(x/2)
定积分的结果为:-sqrt(3)/2 + 2*pi/3
  • 1
  • 2

使用 Python 求解不定积分时,会省略积分的常数。

例 2:计算三重积分

(

x

2

+

y

2

+

z

)

d

x

d

y

d

z

\iiint{(x^2+y^2+z)dxdydz}

(x2+y2+z)dxdydz ,其中

Ω

\Omega

Ω 由曲面

z

=

2

x

2

y

2

z=\sqrt{2-x^2-y^2}

z=2x2y2

z

=

x

2

+

y

2

z=\sqrt{x^2+y^2}

z=x2+y2
围成。

解:编写Python代码作出区域

Ω

\Omega

Ω 的图形,如下:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D

x = np.arange(-1, 1, 0.05)
y = np.arange(-1, 1, 0.05)
x, y = np.meshgrid(x, y)
z1 = np.sqrt(x ** 2 + y ** 2)
z2 = np.sqrt(2 - x ** 2 - y ** 2)
ax = Axes3D(plt.figure())
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
ax.set_title('三重积分曲面')
ax.plot_surface(x, y, z1)
ax.plot_surface(x, y, z2)
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

在这里插入图片描述
将方程转换为柱坐标计算,然后确定积分限,编写Python代码:

import sympy as sp

r, s, z = sp.symbols('r s z')
f = (r ** 2 + z) * r
i = sp.integrate(sp.integrate(sp.integrate(f, (z, r, sp.sqrt(2 - r ** 2))), (r, 0, 1)), (s, 0, 2 * sp.pi))
print('三重积分计算结果为:%s' % i)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

运行代码输出结果:

三重积分计算结果为:2*pi*(-5/12 + 8*sqrt(2)/15)
  • 1

4. 求微分方程的解析解

在这个实验中,我们用通过 Python 来求解微分方程的通解,在初始条件下的特解,以及微分方程组在初始条件下的特解。

例 1:求微分方程

y

+

2

x

y

=

x

e

x

2

y’+2xy=xe^{-x^2}

y+2xy=xex2 的通解。

解:编写Python代码如下:

import sympy as sp

x = sp.Symbol('x')
f = sp.Function('f')
y = f(x)
d = sp.Eq(y.diff(x) + 2 * x * y, x * sp.exp(-x ** 2))
diff = sp.dsolve(d, y)
print('微分方程的通解为:%s' % diff)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行代码输出结果:

微分方程的通解为:Eq(f(x), (C1 + x**2/2)*exp(-x**2))
  • 1

例 2:求微分方程

x

y

+

y

e

x

=

0

xy’+y-e^{-x}=0

xy+yex=0 在初始条件

y

x

=

1

=

2

e

y|_{x=1}=2e

yx=1=2e 下的特解。

解:编写Python代码如下:

import sympy as sp

x = sp.Symbol('x')
f = sp.Function('f')
y = f(x)
d = sp.Eq(x * y.diff(x) + y - sp.exp(-x), 0)
diff = sp.dsolve(d, y, ics={f(1): 2 * sp.exp(1)})
print('微分方程的特解为:%s' % diff)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

运行代码输出结果:

微分方程的特解为:Eq(f(x), ((1 + 2*exp(2))*exp(-1) - exp(-x))/x)
  • 1

七、实验结果报告与总结

通过本次实验,我深入理解了函数极限,导数与微分,定积分与不定积分的概念,通过作图与观察,更熟练掌握了微积分学中的各种计算与求解方法,加深了对微分方程的理解,以及对多元函数微分学与积分学的深刻理解。

八、思考与深入

  1. 利用导数求多项式方程近似解以及函数的极值和单调区间;
  2. 利用重积分求空间图形的体积和平面图形的面积,计算曲线积分和曲面积分;
  3. 利用欧拉折线法和龙格-库塔法求微分方程近似解。

关注公众号:CodeArtist