基于前后潮汐数据计算当前潮高的Kotlin实现问题
潮汐高度计算的问题修正与实现
你的代码存在几个关键问题,导致计算结果不准确:
平均潮汐高度计算错误:
原代码用(previous - next)/2作为平均高度,这是差值的一半,而非两者的中点。正确的平均高度应该是两者的算术平均值:(previousTideHeight + nextTideHeight) / 2。三角函数参数错误:
原代码的正弦函数参数运算顺序错误,且未考虑相位匹配——需要确保当timeSincePrevTide=0时,计算结果等于前一次潮汐高度。振幅计算冗余:
振幅是前后潮汐高度差的绝对值的一半,直接计算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
相关产品推荐
相关产品推荐

