线性插值计算工具类(根据给定的数据点进行线性插值计算目标距离处的水位等数据)

文章描述了一个名为WaterLevelInterpolator的Java类,用于根据给定的数据点进行线性插值计算任意目标距离处的水位。实例展示了如何创建和使用这个插值器进行计算。
摘要由CSDN通过智能技术生成

代码如下:

/**
 * WaterLevelInterpolator 实现了水位插值的功能,可以根据给定的数据点进行线性插值计算目标距离处的水位。
 */
public class WaterLevelInterpolator {
    /** 保存数据点的距离与水位的映射关系 */
    private final Map<Double, Double> dataPoints = new HashMap<>();

    /**
     * 构造函数,初始化水位插值器,需要提供两个数据点的距离和水位信息。
     *
     * @param distance1 第一个数据点的距离
     * @param waterLevel1 第一个数据点的水位
     * @param distance2 第二个数据点的距离
     * @param waterLevel2 第二个数据点的水位
     */
    public WaterLevelInterpolator(double distance1, double waterLevel1, double distance2, double waterLevel2) {
        dataPoints.put(distance1, waterLevel1);
        dataPoints.put(distance2, waterLevel2);
    }

    /**
     * 根据目标距离进行水位插值计算。
     *
     * @param targetDistance 目标距离
     * @return 在目标距离处计算得到的水位
     */
    public double interpolateWaterLevel(double targetDistance) {
        // 如果目标距离正好是已知数据点之一,则直接返回该数据点对应的水位
        if (dataPoints.containsKey(targetDistance)) {
            return dataPoints.get(targetDistance);
        }

        // 初始化较小距离和较大距离为负无穷和正无穷
        double lowerDistance = Double.NEGATIVE_INFINITY;
        double upperDistance = Double.POSITIVE_INFINITY;

        // 遍历数据点,找到目标距离所在的区间
        for (double distance : dataPoints.keySet()) {
            if (distance < targetDistance && distance > lowerDistance) {
                lowerDistance = distance;
            }
            if (distance > targetDistance && distance < upperDistance) {
                upperDistance = distance;
            }
        }

        // 获取较小距离和较大距离对应的水位
        double lowerWaterLevel = dataPoints.get(lowerDistance);
        double upperWaterLevel = dataPoints.get(upperDistance);

        // 使用线性插值计算目标距离处的水位
        double v = lowerWaterLevel + (targetDistance - lowerDistance) *
                (upperWaterLevel - lowerWaterLevel) / (upperDistance - lowerDistance);

        // 对计算结果进行四舍五入保留两位小数,并返回
        return NumberUtil.round(v, 2).doubleValue();
    }
}

示例:

WaterLevelInterpolator t1 = new WaterLevelInterpolator(-10, -2.5, 10, 3.7);
		double r1 = t1.interpolateWaterLevel(-5);
		double r2 = t1.interpolateWaterLevel(0);
		double r3 = t1.interpolateWaterLevel(5);
		double r4 = t1.interpolateWaterLevel(-7.9);
		double r5 = t1.interpolateWaterLevel(7.8);

输出结果如下:

-0.95
0.6
2.15
-1.85
3.02

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值