用Scipy拟合菲涅耳方程

时间:2014-10-27 22:46:01

标签: python math numpy

我正在尝试使用反射率与入射角数据的菲涅耳方程的非线性拟合。在此网站http://en.wikipedia.org/wiki/Fresnel_equations上找到两张图表,其中有一条红色和蓝色线条。当n1 = 1到我的数据时,我需要基本符合蓝线。

这里我使用以下代码,其中th是theta,即入射角。

def Rperp(th, n, norm, constant):
    numerator = np.cos(th) - np.sqrt(n**2.0 - np.sin(th)**2.0)
    denominator  = 1.0 * np.cos(th) + np.sqrt(n**2.0 - np.sin(th)**2.0)
    return ((numerator / denominator)**2.0) * norm + constant

我正在寻找的参数是:

  • 折射率n
  • 一些规范化乘以和
  • 用于移动图表基线的常量。

我的尝试如下:

xdata = angle[1:] * 1.0  # angle of incidence
ydata = greenDD[1:]  # reflectance
params = curve_fit(Rperp, xdata, ydata)

我得到的是显然为零的除法,并给出了[1,1,1]的参数。菲涅耳方程本身就是没有标准化的位和Rperp中的常数。等式中的θ也是入射角。总的来说,我只是不确定我是否正在这样做才能获得参数。

这个想法似乎是函数中的第一个参数是自变量,其余的是要找到的因变量。然后你只需插入scipy's curve_fit,它就会让你适合参数的数据。如果只是绕过零除,我虽然可能是整数除法,但似乎我应该设置。任何帮助表示赞赏,如果需要澄清的话,请告诉我(例如np是numpy)。

1 个答案:

答案 0 :(得分:0)

确保将参数传递给三角函数,如正弦曲线,以弧度为单位,而不是度数。

至于为什么你会得到一个折射率:这是因为在你的函数中,你总是对折射率求平方。 curve_fit算法可能最终处于局部最小状态,其中(偶然)n为负,因为它具有与n positive相同的值。 理想情况下,您需要为最小化问题添加约束,但对于这个(简单)问题,只需观察您的公式并记住,负n的结果可以通过更改符号来解决,就像您所做的那样。 您也可以尝试将初始猜测传递给算法,您可能会发现它不会以负值的最小值结束。

相关问题