python-3.x - 查找大型准周期阵列中的所有正向零交叉点
问题描述
我需要在大致周期性函数的一维数组中找到零交叉点。这将是轨道卫星向北穿过地球赤道的点。
我已经制定了一个简单的解决方案,该解决方案基于找到一个值为零或负值而下一个值为正值的点,然后使用二次或三次插值器scipy.optimize.brentq
找到附近的零点。
插值器不会超出三次,在我学会使用更好的插值器之前,我首先想检查在 numpy 或 scipy 中是否已经存在一种快速方法来查找大型数组中的所有过零(n = 1E +06 至 1E+09)。
问题:所以我问在 numpy 或 scipy 中是否已经存在一种比我在这里完成的方式更快的方法来查找大型数组(n = 1E+06 到 1E+09)中的所有零交叉?
该图显示了插值零点与函数实际值之间的误差,较小的线是三次插值,较大的是二次插值。
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
from scipy.optimize import brentq
def f(x):
return np.sin(x + np.sin(x*e)/e) # roughly periodic function
halfpi, pi, twopi = [f*np.pi for f in (0.5, 1, 2)]
e = np.exp(1)
x = np.arange(0, 10000, 0.1)
y = np.sin(x + np.sin(x*e)/e)
crossings = np.where((y[1:] > 0) * (y[:-1] <= 0))[0]
Qd = interp1d(x, y, kind='quadratic', assume_sorted=True)
Cu = interp1d(x, y, kind='cubic', assume_sorted=True)
x0sQd = [brentq(Qd, x[i-1], x[i+1]) for i in crossings[1:-1]]
x0sCu = [brentq(Cu, x[i-1], x[i+1]) for i in crossings[1:-1]]
y0sQd = [f(x0) for x0 in x0sQd]
y0sCu = [f(x0) for x0 in x0sCu]
if True:
plt.figure()
plt.plot(x0sQd, y0sQd)
plt.plot(x0sCu, y0sCu)
plt.show()
解决方案
推荐阅读
- javascript - 如何使用 javascript/jquery 在更改时写入所有输入类型值?
- ios - Xcode 10 - 多个命令生成 .app
- css - 如何使用 SASS 为不同的网格列和断点自定义 Bootstrap 4?
- angular-material - 如何使用 matSort 对 mat-table 中的列进行排序?
- postgresql - 如何在 postgres 中处理并发请求?
- docker - 用于 dotnet core 2.1 和 IIS 的 Docker 映像
- javascript - 如何在反应js中的对象数组中添加一个对象
- amazon-web-services - 使用 Grunt 部署到 AWS Lambda
- r - 在 R 中查找数据帧的有效方法
- javascript - 将 Jquery 代码正确集成到 mvc 核心项目中