numpy 如果y = 0,则搜索x值时出现插值错误

myss37ts  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(133)

我正在学习Python的入门课程,如果y = 0,我在识别x值时遇到了一些麻烦。这是可能的方式,还是有其他的方法?

import numpy as np
import matplotlib.pyplot as plt

x = [0, 50, 100, 150, 200]
y = [0.166, 0.282, 0.032, -0.124, -0.292]

y_value = 0
print(np.interp(y_value, y, x))

plt.plot(y, x, '--ro')
plt.show()

我尝试使用numpy.interp(),但我在'200'中输入的每个y值都是输出。

omtl5h9j

omtl5h9j1#

初级解决方案

作为初学者,我只需要对0附近的值进行简单的线性插值。我的意思是找到y=0周围x和y点之间的斜率和y截距,并使用它来找到y=0处x的近似解。

import numpy as np
import matplotlib.pyplot as plt

x = [0, 50, 100, 150, 200]
y = [0.166, 0.282, 0.032, -0.124, -0.292]

slope = (y[3] - y[2]) / (x[3] - x[2]) # Find the slope between (100,0.032) and (150,-0.124)
y_int = y[3] - (slope * x[3])         # Find y-intercept at some point (I just chose 3)

print((0 - y_int) / slope)            # y = mx + b --> x = (y - b)/m

我假设既然你正在上一门初学者课程,这可能是一个足够好的解决方案。但是,还有其他方法可以解决这个问题!

更多趣味解决方案:SciPy插值

为了澄清@jared在他的评论中所说的内容,您可以创建一条样条或“最佳拟合线”,以尽可能地拟合数据,导出样条函数的多项式,并求解该函数的y = 0。SciPy有一些非常酷的工具可以让你做到这一点。在我看来,这不是最适合初学者的解决方案,但它非常有用。

import numpy as np
from scipy.interpolate import make_interp_spline, PPoly
import matplotlib.pyplot as plt

x = [0, 50, 100, 150, 200]
y = [0.166, 0.282, 0.032, -0.124, -0.292]

spline = make_interp_spline(x, y, k=3) # Create a cubic spline from the data
curve  = PPoly.from_spline(spline)     # Create a piecewise polynomial object; in essence, y = curve(x)
print(curve.solve(y=0))                # Solve for y = 0

为了创建样条,我设置k=3来指定三次样条;但是,设置k=2k=4也有效。设置k=1可能不是最好的选择,因为这将创建一个线性样条,并且似乎您的数据从正趋势切换到负趋势,这意味着您在y=0处对x的解决方案可能不准确。
定义curve的第二行使用了SciPy中一个很酷的类PPoly,你可以在documentation中读到一些。从本质上讲,样条曲线被转换成一个分段函数,可以在任何y点求解。
在运行这个之前,请确保安装带有pip install scipy的SciPy。希望这有帮助!

相关问题