- 注册时间
- 2021-11-19
- 最后登录
- 1970-1-1
- 威望
- 星
- 金币
- 枚
- 贡献
- 分
- 经验
- 点
- 鲜花
- 朵
- 魅力
- 点
- 上传
- 次
- 下载
- 次
- 积分
- 9086
- 在线时间
- 小时
|
我告诉豆包
- 实际运行时,传递进来的xArray,是一个对象,而不是一维数组,你解决一下这个问题。
复制代码
然后豆包给我新生成了新的代码如下:
- ' 函数名:PiecewiseLinearInterpolation
- ' 功能:该函数用于实现分段线性插值。分段线性插值是一种在给定的离散数据点之间进行线性插值的方法。
- ' 它将数据点之间的区间视为线性函数,根据插值点所在的区间,利用该区间的两个端点进行线性插值计算。
- ' 参数:
- ' xRange:Range 对象,代表已知数据点的 x 坐标所在的单元格区域,要求该区域中的元素必须按升序排列。
- ' yRange:Range 对象,代表已知数据点的 y 坐标所在的单元格区域,其行数必须与 xRange 相同。
- ' xValue:要进行插值计算的 x 坐标值。
- ' 返回值:
- ' 函数返回根据分段线性插值计算得到的对应 xValue 的 y 坐标值。如果输入的区域行数不相等,函数将返回错误值 CVErr(xlErrValue)。
- Function PiecewiseLinearInterpolation(xRange As Range, yRange As Range, xValue As Double) As Variant
- ' 将 Range 对象转换为一维数组
- Dim xArray As Variant
- Dim yArray As Variant
- xArray = Application.Transpose(xRange.Value)
- yArray = Application.Transpose(yRange.Value)
-
- ' 检查输入的 xArray 和 yArray 的长度是否相等
- If UBound(xArray) - LBound(xArray) <> UBound(yArray) - LBound(yArray) Then
- ' 如果长度不相等,返回错误值 CVErr(xlErrValue)
- PiecewiseLinearInterpolation = CVErr(xlErrValue)
- Exit Function
- End If
-
- Dim i As Long
- ' 查找插值点 xValue 所在的区间
- For i = LBound(xArray) To UBound(xArray) - 1
- If xValue >= xArray(i) And xValue <= xArray(i + 1) Then
- ' 如果 xValue 在当前区间内,使用该区间的两个端点进行线性插值
- PiecewiseLinearInterpolation = yArray(i) + (yArray(i + 1) - yArray(i)) * (xValue - xArray(i)) / (xArray(i + 1) - xArray(i))
- Exit Function
- End If
- Next i
-
- ' 如果 xValue 在已知数据点的范围外
- If xValue < xArray(LBound(xArray)) Then
- ' 如果 xValue 小于最小的 x 坐标,使用前两个点进行插值
- PiecewiseLinearInterpolation = yArray(LBound(yArray)) + (yArray(LBound(yArray) + 1) - yArray(LBound(yArray))) * (xValue - xArray(LBound(xArray))) / (xArray(LBound(xArray) + 1) - xArray(LBound(xArray)))
- ' 将结果单元格的文字颜色设置为红色
- Application.Caller.Font.Color = RGB(255, 0, 0)
- Else
- ' 如果 xValue 大于最大的 x 坐标,使用最后两个点进行插值
- PiecewiseLinearInterpolation = yArray(UBound(yArray) - 1) + (yArray(UBound(yArray)) - yArray(UBound(yArray) - 1)) * (xValue - xArray(UBound(xArray) - 1)) / (xArray(UBound(xArray)) - xArray(UBound(xArray) - 1))
- ' 将结果单元格的文字颜色设置为红色
- Application.Caller.Font.Color = RGB(255, 0, 0)
- End If
- End Function
复制代码 |
|