我正在尝试使用反射率与入射角数据的菲涅耳方程的非线性拟合。在此网站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
我正在寻找的参数是:
我的尝试如下:
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)。
答案 0 :(得分:0)
确保将参数传递给三角函数,如正弦曲线,以弧度为单位,而不是度数。
至于为什么你会得到一个负折射率:这是因为在你的函数中,你总是对折射率求平方。 curve_fit
算法可能最终处于局部最小状态,其中(偶然)n为负,因为它具有与n positive相同的值。
理想情况下,您需要为最小化问题添加约束,但对于这个(简单)问题,只需观察您的公式并记住,负n的结果可以通过更改符号来解决,就像您所做的那样。
您也可以尝试将初始猜测传递给算法,您可能会发现它不会以负值的最小值结束。