在看天线理论时遇到了正弦积分与余弦积分函数,为了更好的理解这个函数的性质,使用Python将这两个函数的图像复现出来,同时画了被积函数的图像。
图1 书上的公式示例
- 正弦积分函数:
S
i
x
=
∫
0
x
sin
x
x
d
x
Si\text{ }x=\int_{0}^{x}{\frac{\sin x}{x}dx}
Si x=∫0xxsinxdx;被积分函数是
sin
x
/
x
\sin x/x
sinx/x,积分区间是
(
0
,
x
)
\left( 0,x \right)
(0,x)。
- 余弦积分函数:
C
i
x
=
−
∫
x
∞
cos
x
x
d
x
=
∫
x
∞
−
cos
x
x
d
x
Ci\text{ }x=-\int_{x}^{\infty }{\frac{\cos x}{x}dx}=\int_{x}^{\infty }{-\frac{\cos x}{x}dx}
Ci x=−∫x∞xcosxdx=∫x∞−xcosxdx;被积分函数
−
cos
x
/
x
-\cos x/x
−cosx/x,积分区间是
(
x
,
∞
)
\left( x,\infty \right)
(x,∞),这里将Ci x的负号写到了被积分函数里面。
一、被积分函数分析
使用matplotlib里面的plot函数作图,代码里需要注意的地方是起始点是0.2不是0,否则会因为
−
cos
x
/
x
-\cos x/x
−cosx/x的值是-∞而作图比例不协调。通过函数图像可以得到两个被积分函数的性质。
-
sin
x
/
x
\sin x/x
sinx/x:当x=0时其值为1是最大,之后波动趋向于0;
-
−
cos
x
/
x
-\cos x/x
−cosx/x:当x=0时其值为-∞是最小,之后波动趋向于0;
两者共同趋向于0的原因是分子的范围是[-1,1],而分母最终会趋向于正无穷大,所以结果最终会趋向于0。
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0.2, 10, 0.01) # x参数:0.2 10是范围 0.01是分辨率,因为x<0.2时,余弦积分无穷大,所以从0.2开始
# 先看下sin(t)/t与-cos(t)/t的图像 这里x的范围是x>0.2,是因为x<0.2时余弦积分无穷大会超出边界,所以从0.2开始
sin_t = np.sin(x)/x
cos_t = np.cos(x)*(-1)/x
plt.title('被积分函数') # 添加标题
plt.plot(x, sin_t, label="sinx/x")
plt.plot(x, cos_t, label="cosx/x")
plt.legend(loc='upper left') # 显示在左上,解决label不显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 这一行和下一行解决中文显为方框的问题
plt.rcParams['axes.unicode_minus'] = False
plt.show()
图2 被积分函数图像
二、积分函数分析
可以看到Cinx和
sin
x
/
x
\sin x/x
sinx/x有重合的部分,这个对应
C
i
x
≈
sin
x
x
,
x
≥
1
Ci\text{ }x\approx \frac{\sin x}{x},x\ge 1
Ci x≈xsinx,x≥1,尤其是在x≥2之后几乎是重合的,不过因为求Ci x这里使用了近似解。
- 最终余弦积分的结果趋向于0,这是因为他的积分区间导致的,x→∞时,积分区间长度为0。
- 正弦积分区间趋向于1.5708
- 书上Si x和Ci x函数值如表1所示
- 余弦积分的积分到∞代码实现不了,使用积分到300进行工程近似,即第23行代码的
v_cos[a], err = integrate.quad(g, x[a], 300)
表1 Si x和Ci x函数值
x |
Si x |
Ci x |
0 |
0 |
−
∞
-\infty
−∞ |
π
/
2
\pi /\text{2}
π/2 |
1.371 |
0.472 |
π
\pi
π |
1.852 |
0.074 |
3
π
/
2
3 \pi /\text{2}
3π/2 |
1.608 |
-0.198 |
2
π
2 \pi
2π |
1.418 |
-0.0227 |
3
π
3\pi
3π |
1.675 |
0.011 |
4
π
4\pi
4π |
1.492 |
-0.006 |
∞
\infty
∞ |
1.5708 |
0 |
from scipy import integrate
import matplotlib.pyplot as plt
import numpy as np
x = np.arange(0.2, 10, 0.01) # x参数:0.2 10是范围 0.01是分辨率,因为x<0.2时,余弦积分设计无穷大,所以从0.2开始
v = x * 0.0 # 初始化v和x的长度一致,并且都是0.0,小数,0的话就是整数了
v_cos = x * 0.0
# 先看下sin(t)/t与cos(t)/t的图像
sin_t = np.sin(x)/x # sin(x)/x的积分是从0→x,直接从前积分就行,没有进行近似
cos_t = np.cos(x)*(-1)/x # cos(x)/x的积分是从x→∞,后面的积分可以忽略,所以只计算到的积分是30即可,主要看趋势
def f(t): #
return np.sin(t)/t # 积分公式里的函数,这里的变量x和上面的x冲突了,修改为t
def g(t):
return np.cos(t)*(-1)/t # 积分公式里的函数,这里的变量x和上面的x冲突了,修改为t
for a in range(0, len(x), 1): # 第一个积分出来是nan,先跳过第0个元素
v[a], err = integrate.quad(f, 0, x[a]) # 0,np.pi是积分范围,在最后的画图里面np.pi应该是变量
v_cos[a], err = integrate.quad(g, x[a], 300)
# v_cos[a], err = integrate.quad(g, 30, x[a])
plt.title('正弦/余弦积分') # 添加标题
plt.plot(x, v, label="Si x")
plt.plot(x, v_cos, label="Ci x")
plt.plot(x, sin_t, label="sinx/x")
plt.plot(x, cos_t, label="cosx/x")
plt.legend(loc='upper left') # 显示在左上,解决label不显示的问题
plt.rcParams['font.sans-serif'] = ['SimHei'] # 这一行和下一行解决中文显为方框的问题
plt.rcParams['axes.unicode_minus'] = False
plt.show()
图3 正弦/余弦积分函数图像
参考
- 《天线理论与技术》钟顺时,P46
- 百度百科-正弦积分
- 百度百科-余弦积分