手动拟合三角函数曲线时精准计算相移c值的方法
嗨,我来帮你搞定这个相移c的精准计算问题!先理清楚你的现状:你已经确定了拟合余弦曲线的框架 y = 3.685 cos 29.1(x+c) + 5.455,现在需要手动算出最准确的c值,而不是依赖Desmos自动给出的1.22。你之前尝试用单个点代入求解得到了27.1894,虽然相关性rho达到了0.946,但确实有优化空间——单个点的误差会影响结果,用所有数据点做最小二乘拟合才是更精准的方案。
下面是具体的分步计算方法,能帮你得到和Desmos接近的精准c值:
步骤1:转换函数形式,简化计算
先把你的原函数展开:y = 3.685 cos(29.1x + 29.1c) + 5.455
令 C = 29.1c,同时把垂直偏移项移到左边,得到:y' = y - 5.455 = 3.685 cos(29.1x + C)
步骤2:把三角函数转化为线性形式
利用余弦的和角公式展开:cos(29.1x + C) = cos(29.1x)cosC - sin(29.1x)sinC
代入后式子变为:y' = 3.685cosC * cos(29.1x) - 3.685sinC * sin(29.1x)
我们设两个新的参数:P = 3.685cosC,Q = -3.685sinC
这样式子就变成了线性回归模型:y' = P*cos(29.1x) + Q*sin(29.1x)
步骤3:用最小二乘法求解线性参数P和Q
这一步需要用到你所有的(x,y)数据点:
- 对每个数据点,计算:
X₁ = cos(29.1x)(注意这里的29.1是角度,计算时要和Desmos的角度模式保持一致)X₂ = sin(29.1x)Y = y - 5.455
- 计算各项均值:
mean(X₁)、mean(X₂)、mean(Y) - 计算以下求和项:
S₁₁ = sum((X₁ - mean(X₁))²)S₂₂ = sum((X₂ - mean(X₂))²)S₁₂ = sum((X₁ - mean(X₁))*(X₂ - mean(X₂)))S₁Y = sum((X₁ - mean(X₁))*(Y - mean(Y)))S₂Y = sum((X₂ - mean(X₂))*(Y - mean(Y)))
- 解下面的线性方程组,得到P和Q:
S₁₁*P + S₁₂*Q = S₁Y S₁₂*P + S₂₂*Q = S₂Y
步骤4:从P和Q反推C,再得到c
- 根据P和Q的定义,我们可以得到:
cosC = P / 3.685,sinC = -Q / 3.685 - 用反正切函数arctan2计算C(这个函数能正确判断象限,避免单值反正切的象限误差):
C = arctan2(-Q, P) - 最后算回相移c:
c = C / 29.1
为什么这个方法更精准?
单个点代入的方法容易受某一个偏离拟合曲线的点影响,而最小二乘法是让所有数据点到拟合曲线的误差平方和最小,充分利用了所有数据的信息,算出来的c值会和Desmos自动拟合的1.22非常接近,同时rho值也会比你之前的0.946更高。
算完之后你可以把c代入原函数,和数据点对比验证拟合效果,相信结果会让你满意!
备注:内容来源于stack exchange,提问作者amateur




