You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于前后潮汐数据计算当前潮高的Kotlin实现问题

潮汐高度计算的问题修正与实现

你的代码存在几个关键问题,导致计算结果不准确:

  1. 平均潮汐高度计算错误:
    原代码用(previous - next)/2作为平均高度,这是差值的一半,而非两者的中点。正确的平均高度应该是两者的算术平均值:(previousTideHeight + nextTideHeight) / 2。

  2. 三角函数参数错误:
    原代码的正弦函数参数运算顺序错误,且未考虑相位匹配——需要确保当timeSincePrevTide=0时,计算结果等于前一次潮汐高度。

  3. 振幅计算冗余:
    振幅是前后潮汐高度差的绝对值的一半,直接计算Math.abs(previousTideHeight - nextTideHeight) / 2即可,无需取最大值。

修正后的Kotlin代码

val previousTideHeight = 5.3    // 前一次潮汐高度
val nextTideHeight = -0.3       // 下一次潮汐高度
val timeBetweenTides = 60 * 60 * 6  // 前后潮汐间隔(秒)
val timeSincePrevTide = 60 * 60 * 3 // 距离前一次潮汐的时间(秒)

// 计算潮汐曲线的中点(平均高度)
val midHeight = (previousTideHeight + nextTideHeight) / 2
// 计算振幅(中点到高潮/低潮的距离)
val amplitude = Math.abs(previousTideHeight - nextTideHeight) / 2
// 计算相位:从0到π的角度(相邻潮汐间隔对应半个正弦周期)
val phase = Math.PI * timeSincePrevTide / timeBetweenTides

// 根据潮汐类型自动适配三角函数
val currentHeight = if (previousTideHeight > nextTideHeight) {
    // 高潮→低潮,用cos保证初始值匹配前一次高度
    midHeight + amplitude * Math.cos(phase)
} else {
    // 低潮→高潮,用sin实现从谷值到峰值的上升曲线
    midHeight + amplitude * Math.sin(phase)
}

println("当前潮汐高度:$currentHeight") // 示例中3小时后结果为2.5,符合中点预期

原理说明

潮汐变化可近似为半周期正弦/余弦曲线(相邻高潮和低潮间隔约6小时,对应π弧度的角度变化):

  • 高潮到低潮的过程用cos函数,初始角度0对应cos(0)=1,结果等于前一次高潮高度
  • 低潮到高潮的过程用sin函数,初始角度0对应sin(0)=0,结果等于前一次低潮高度

内容的提问来源于stack exchange,提问作者David Eugene Pratt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:06:00