如何在gnuplot中拟合a*cos(x)**b函数以验证马吕斯定律?
马吕斯定律拟合问题的解决方法
问题原因
直接用fit a*cos(x)**b 'data_malus.txt' via a,b拟合时,当x接近π/2(1.5708)或3π/2(4.7124),cos(x)趋近于0,此时cos(x)**b对指数b的变化异常敏感,拟合算法极易陷入局部最优解,导致得到远超预期的b值(如145.994),完全偏离马吕斯定律的指数2。
可行解决方案
方案1:固定指数为2,仅拟合I₀
马吕斯定律的核心形式是$I = I_0 * cos^2(\theta)$,直接固定指数为2,只拟合系数a(即I₀):
fit a*(cos(x))**2 'data_malus.txt' via a
该方法能直接得到符合预期的I₀值,与你数据中x=0时的825高度匹配。
方案2:限定指数范围,验证是否接近2
若需验证指数是否接近2,可给b设置初始值和合理范围,避免算法跑偏:
b=2 # 设置初始值为2 fit [b=1.8:2.2] a*(cos(x))**b 'data_malus.txt' via a,b
通过限定b在2附近的区间,拟合结果会更贴近理论值。
方案3:对数转换拟合(需剔除异常点)
将公式取对数变形为$\ln(I) = \ln(I_0) + 2\ln(|cos(x)|)$,但注意x=π/2和3π/2附近cos(x)趋近于0,对数无意义,需先剔除这两个I=3.2的数据点,再执行拟合:
fit log_a + b*log(abs(cos(x))) 'data_malus.txt' using 1:(log($2)) via log_a,b I0 = exp(log_a)
最终得到的b应接近2,I0接近825。
数据特性验证
你的数据完全符合马吕斯定律的对称规律:x=0、π、2π时I达到最大值825,x=π/2、3π/2时I趋近于0,因此固定指数为2的拟合是最贴合理论的选择。
内容的提问来源于stack exchange,提问作者Ghostb6
相关产品推荐
相关产品推荐

