我通过使用数组(X,Y)制作样条图
当图表中X = 3.2时,我需要找到Y的值
我使用此代码但不起作用< br />
答案 0 :(得分:0)
该功能无法实现您认为的功能。请参见MSDN,特别是描述查找等于指定值的第一个数据点。实际上,您将y而不是x传递给该函数,因此与之相反无论如何,您仍然需要(加上您需要通过完全匹配)。
您可以编写自己的函数以执行线性插值法以找到与x对应的y。这不是样条插值。如果需要更高的精度,可以研究多项式最小二乘拟合。
Private Shared Function Interpolate(xArray As Double(), yArray As Double(), x As Double) As Double
Dim points = xArray.Select(Of (x As Double, y As Double))(Function(xa, i) (xa, yArray(i))).OrderBy(Function(xy) Math.Abs(xy.x - x)).Take(2)
Dim m = (points.Last().y - points.First().y) / (points.Last().x - points.First().x)
Dim b = points.First().y / (points.First().x * m)
Return m * x + b
End Function
用法:
Dim x(6) As Double
Dim y(6) As Double
x(0) = 1
x(1) = 1.7
x(2) = 2.8
x(3) = 4
x(4) = 2.4
x(5) = 1.5
y(0) = 16
y(1) = 20
y(2) = 40
y(3) = 60
y(4) = 30
y(5) = 20
Chart1.Series("Series1").Points.DataBindXY(x, y)
Dim datapoint = Chart1.Series("Series1").Points.FindByValue(3.2) ' is Nothing
Dim yValue = Interpolate(x, y, 3.2)
Label1.Text = yValue.ToString()
' Label1.Text is "54.190" ...
算法的解释:选择一个元组中的x,y对,按| x-x0 |排序该元组。 (因此最接近的x是第一个),取前两对,在y = mx + b中计算m,b,求解y。