9. 复数和三角函数#

9.1. 概述#

本讲座介绍一些基础数学和三角函数知识。

这些概念本身既有用又有趣,在研究由线性差分方程或线性微分方程生成的动力学时会有很大的帮助。

例如,这些工具是理解Paul Samuelson(1939年)[Samuelson, 1939]在其经典论文中关于投资加速数与凯恩斯消费函数相互作用的成果的关键,这是我们在讲座Samuelson乘数加速数中的主题。

除了为Samuelson的工作及其扩展提供基础外,本讲座也是对高中基础三角函数知识的复习。

那么让我们开始吧。

9.1.1. 复数#

复数有一个实部x和一个纯虚部y

复数z的欧几里得形式、极坐标形式和三角形式是:

z=x+iy=reiθ=r(cosθ+isinθ)

上面的第二个等式被称为欧拉公式

  • 欧拉还贡献了许多其他公式!

z的复共轭z¯定义为

z¯=xiy=reiθ=r(cosθisinθ)

xz实部yz虚部

符号|z| = z¯z=r表示z

r是向量(x,y)到原点的欧几里得距离:

r=|z|=x2+y2

θ(x,y)相对于实轴的角度。

显然,θ的正切是(yx)

因此,

θ=tan1(yx)

三个基本三角函数是

cosθ=xr=eiθ+eiθ2,sinθ=yr=eiθeiθ2i,tanθ=yx

我们需要以下函数库导入:

import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (11, 5)  #设计默认的图像大小
import numpy as np
from sympy import (Symbol, symbols, Eq, nsolve, sqrt, cos, sin, simplify,
                  init_printing, integrate)

import matplotlib as mpl
FONTPATH = "fonts/SourceHanSerifSC-SemiBold.otf"
mpl.font_manager.fontManager.addfont(FONTPATH)
plt.rcParams['font.family'] = ['Source Han Serif SC']

9.1.2. 一个例子#

考虑复数 z=1+3i

对于 z=1+3ix=1y=3

由此可得 r=2θ=tan1(3)=π3=60o

让我们使用Python来绘制复数 z=1+3i 的三角形式。

# 将值和函数简写
π = np.pi


# 设置参数
r = 2
θ = π/3
x = r * np.cos(θ)
x_range = np.linspace(0, x, 1000)
θ_range = np.linspace(0, θ, 1000)

# 画图
fig = plt.figure(figsize=(8, 8))
ax = plt.subplot(111, projection='polar')

ax.plot((0, θ), (0, r), marker='o', color='b')            # 绘制 r
ax.plot(np.zeros(x_range.shape), x_range, color='b')      # 绘制 x
ax.plot(θ_range, x / np.cos(θ_range), color='b')          # 绘制 y
ax.plot(θ_range, np.full(θ_range.shape, 0.1), color='r')  # 绘制 θ

ax.margins(0) # 从原点开始绘制

ax.set_title("复数的三角函数", va='bottom',
    fontsize='x-large')

ax.set_rmax(2)
ax.set_rticks((0.5, 1, 1.5, 2))  # 减少标记
ax.set_rlabel_position(-88.5)    # 将标记远离图像

ax.text(θ, r+0.01 , r'$z = x + iy = 1 + \sqrt{3}\, i$')   # 标记 z
ax.text(θ+0.2, 1 , '$r = 2$')                             # 标记 r
ax.text(0-0.2, 0.5, '$x = 1$')                            # 标记 x
ax.text(0.5, 1.2, r'$y = \sqrt{3}$')                      # 标记 y
ax.text(0.25, 0.15, r'$\theta = 60^o$')                   # 标记 θ

ax.grid(True)
plt.show()
_images/3cc7f0a055823646b5d30aecc1ead4429962d9ef9c553440fd4320b1aed65975.png

9.2. 德莫瓦定理#

德莫瓦定理指出:

(r(cosθ+isinθ))n=rneinθ=rn(cosnθ+isinnθ)

要证明德莫瓦定理,首先注意

(r(cosθ+isinθ))n=(reiθ)n

然后进行计算。

9.3. 德莫瓦定理的应用#

9.3.1. 例1#

我们可以使用德莫瓦定理来证明 r=x2+y2

我们有

1=eiθeiθ=(cosθ+isinθ)(cos(-θ)+isin(-θ))=(cosθ+isinθ)(cosθisinθ)=cos2θ+sin2θ=x2r2+y2r2

因此

x2+y2=r2

我们认识到这是勾股定理

9.3.2. 例2#

z=reiθz¯=reiθ,其中 z¯z复共轭

(z,z¯) 构成一对复共轭对

a=peiωa¯=peiω 是另一对复共轭对。

对于整数序列 n=0,1,2,, 中的每个元素。

为此,我们可以应用德莫瓦公式。

因此,

xn=azn+a¯z¯n=peiω(reiθ)n+peiω(reiθ)n=prnei(ω+nθ)+prnei(ω+nθ)=prn[cos(ω+nθ)+isin(ω+nθ)+cos(ω+nθ)isin(ω+nθ)]=2prncos(ω+nθ)

9.3.3. 例3#

这个例子提供了Samuelson在分析其乘数-加速数模型时所使用的核心机制 [Samuelson, 1939]

因此,考虑一个二阶线性差分方程

xn+2=c1xn+1+c2xn

特征多项式

z2c1zc2=0

(z2c1zc2)=(zz1)(zz2)=0

具有根 z1,z1

是满足差分方程的序列 {xn}n=0

在以下情况下,我们可以应用例2的公式来解决差分方程

  • 差分方程特征多项式的根 z1,z2 构成一对复共轭

  • 给定初始条件 x0,x1 的值

要解决差分方程,回想例2中

xn=2prncos(ω+nθ)

其中 ω,p 是需要从初始条件 x1,x0 中编码的信息确定的系数。

由于x0=2pcosωx1=2prcos(ω+θ)x1x0 的比率为

x1x0=rcos(ω+θ)cosω

我们可以解这个方程得到 ω,然后用 x0=2pr0cos(ω+nθ) 解出 p

使用Python中的sympy包,我们能够解决并绘制给定不同 n 值时 xn 的动态变化。

在这个例子中,我们设置初始值:

  • r=0.9

  • θ=14π

  • x0=4

  • x1=r22=1.82

我们首先使用sympy包中的nsolve基于上述初始条件数值求解 ωp

# 设置参数
r = 0.9
θ = π/4
x0 = 4
x1 = 2 * r * sqrt(2)

# 定义要计算的符号
ω, p = symbols('ω p', real=True)

# 求解  ω
## 注意:我们选择在 0 附近的解
eq1 = Eq(x1/x0 - r * cos(ω+θ) / cos(ω), 0)
ω = nsolve(eq1, ω, 0)
ω = float(ω)
print(f'ω = {ω:1.3f}')

# 求解 p
eq2 = Eq(x0 - 2 * p * cos(ω), 0)
p = nsolve(eq2, p, 0)
p = float(p)
print(f'p = {p:1.3f}')
ω = 0.000
p = 2.000

使用上面的代码,我们计算得出

ω=0p=2

然后我们将解出的 ωp 的值代入

并绘制动态图。

# 设定 n 的范围
max_n = 30
n = np.arange(0, max_n+1, 0.01)

# 设定 x_n
x = lambda n: 2 * p * r**n * np.cos(ω + n * θ)

# 绘图
fig, ax = plt.subplots(figsize=(12, 8))

ax.plot(n, x(n))
ax.set(xlim=(0, max_n), ylim=(-5, 5), xlabel='$n$', ylabel='$x_n$')

# 将x轴放在图像中间
ax.spines['bottom'].set_position('center')
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')

ticklab = ax.xaxis.get_ticklabels()[0] # 设定x标记的位置
trans = ticklab.get_transform()
ax.xaxis.set_label_coords(31, 0, transform=trans)

ticklab = ax.yaxis.get_ticklabels()[0] # 设定y标记的位置
trans = ticklab.get_transform()
ax.yaxis.set_label_coords(0, 5, transform=trans)

ax.grid()
plt.show()
_images/6bc576536ff88350f33faeed31fc60432c3051583e50fc7f3dfab6fa9c15ad2e.png

9.3.4. 三角恒等式#

我们可以通过适当转换复数的极坐标形式来获得一套完整的三角恒等式。

我们将通过推导等式

ei(ω+θ)=eiωeiθ

来得到许多恒等式。

例如,我们将计算 cos(ω+θ)sin(ω+θ) 的恒等式。

使用本讲开始时给出的正弦和余弦公式,我们有:

cos(ω+θ)=ei(ω+θ)+ei(ω+θ)2sin(ω+θ)=ei(ω+θ)ei(ω+θ)2i

我们还可以通过以下方式获得三角恒等式:

cos(ω+θ)+isin(ω+θ)=ei(ω+θ)=eiωeiθ=(cosω+isinω)(cosθ+isinθ)=(cosωcosθsinωsinθ)+i(cosωsinθ+sinωcosθ)

由于上述公式的实部和虚部都应相等,我们得到:

cos(ω+θ)=cosωcosθsinωsinθsin(ω+θ)=cosωsinθ+sinωcosθ

上述方程也被称为角和恒等式。我们可以使用sympy包中的simplify函数来验证这些方程:

# 设定符号
ω, θ = symbols('ω θ', real=True)

# 检查
print("cos(ω)cos(θ) - sin(ω)sin(θ) =",
    simplify(cos(ω)*cos(θ) - sin(ω) * sin(θ)))
print("cos(ω)sin(θ) + sin(ω)cos(θ) =",
    simplify(cos(ω)*sin(θ) + sin(ω) * cos(θ)))
cos(ω)cos(θ) - sin(ω)sin(θ) = cos(θ + ω)
cos(ω)sin(θ) + sin(ω)cos(θ) = sin(θ + ω)

9.3.5. 三角积分#

我们也可以使用复数的极坐标形式来计算三角积分。

例如,我们要解决以下积分:

ππcos(ω)sin(ω)dω

使用欧拉公式,我们有:

cos(ω)sin(ω)dω=(eiω+eiω)2(eiωeiω)2idω=14ie2iωe2iωdω=14i(i2e2iωi2e2iω+C1)=18[(eiω)2+(eiω)22]+C2=18(eiωeiω)2+C2=12(eiωeiω2i)2+C2=12sin2(ω)+C2

因此:

ππcos(ω)sin(ω)dω=12sin2(π)12sin2(π)=0

我们可以使用sympy包中的integrate来验证分析结果和数值结果:

# 设置打印的格式
init_printing(use_latex="mathjax")

ω = Symbol('ω')
print('cos(ω)sin(ω)积分的解析解为:')
integrate(cos(ω) * sin(ω), ω)
cos(ω)sin(ω)积分的解析解为:
sin2(ω)2
print('cos(ω)sin(ω)从 -π 到 π 的积分的数值解为:')
integrate(cos(ω) * sin(ω), (ω, -π, π))
cos(ω)sin(ω)从 -π 到 π 的积分的数值解为:
0

9.3.6. 练习#

Exercise 9.1

我们邀请读者通过解析方法和使用 sympy 包来验证以下两个等式:

ππcos(ω)2dω=π
ππsin(ω)2dω=π