我已经看到了一个菲涅耳方程,用于计算入射角在定义n和k值时的反射量。这个公式通常与计算机图形有关,但是在科学环境中,我找不到任何公式。

这是一个用Python编写的示例,取自网站
Python中的菲涅尔公式:

def IOR(n,k):
theta_deg = 0

n = n
k = k
fresnel = []
  
while theta_deg <= 90:
theta = math.radians(theta_deg)

a = math.sqrt((math.sqrt((n**2-k**2-(math.sin(theta))**2)**2 + ((4 * n**2) * k**2)) + (n**2 - k**2 - (math.sin(theta))**2))/2)

b = math.sqrt((math.sqrt((n**2-k**2-(math.sin(theta))**2)**2 + ((4 * n**2) * k**2)) - (n**2 - k**2 - (math.sin(theta))**2))/2)
  
Fs = (a**2+b**2-(2 * a * math.cos(theta))+(math.cos(theta))**2)/(a**2+b**2+(2 * a * math.cos(theta))+(math.cos(theta))**2)
Fp = Fs * ((a**2+b**2-(2 * a * math.sin(theta) * math.tan(theta))+(math.sin(theta))**2*(math.tan(theta))**2)/(a**2+b**2+(2 * a * math.sin(theta) * math.tan(theta))+(math.sin(theta))**2*(math.tan(theta))**2))
R = (Fs + Fp)/2
fresnel.append(R)

theta_deg += 1
return fresnel


我不能可以在网上找到有关该公式的任何参考文献,有关菲涅尔方程的Wikipedia文章包含完全不同的公式,我看不到它们之间的联系。我搜索过高低,但是找不到对此特定公式的任何引用,为什么呢?您能帮我找到它,或向我解释为什么我无法在线找到它吗?还是您可以向我展示如何从Wikipedia文章的菲涅耳公式中导出它?

是的,我意识到代码示例中已经有了该公式。但是我对为什么在任何地方都找不到此公式感到困惑,我想除了这个代码示例以外,还有更多的资料可以引用。

#1 楼

@PaulHK的答案是正确的,我敢肯定,这里有一点检查表明IOR()函数正在计算$ s $和$ p $偏振的反射系数,然后取两个假设为非偏振入射光的平均值。

反射是针对单个接口的,并且至少在垂直入射时,结果减少为更简单的$(n_2-n_1)^ 2 /(n_2 + n_1)^ 2 $。使用此脚本,您可以使用$ k $的非零入射角和非零值来检查其他在线计算器。

我稍微清理了一下python(缩进)并添加了绘图。您可以看到,从玻璃到空气出射时,在全内反射的临界角处反射率达到100%:





>
def IOR(n,k):
    theta_deg = 0

    fresnel = []

    while theta_deg <= 90:
        theta = math.radians(theta_deg)

        a = math.sqrt((math.sqrt((n**2-k**2-(math.sin(theta))**2)**2 +
                                 ((4 * n**2) * k**2)) + (n**2 - k**2 -
                                            (math.sin(theta))**2))/2)

        b = math.sqrt((math.sqrt((n**2-k**2-(math.sin(theta))**2)**2 +
                                 ((4 * n**2) * k**2)) - (n**2 - k**2 -
                                            (math.sin(theta))**2))/2)

        Fs = (a**2+b**2-(2 * a * math.cos(theta))+
              (math.cos(theta))**2)/(a**2+b**2 +
                            (2 * a * math.cos(theta))+(math.cos(theta))**2)

        Fp = Fs * ((a**2+b**2 -
                    (2 * a * math.sin(theta) * math.tan(theta)) +
                    (math.sin(theta))**2*(math.tan(theta))**2)/(a**2+b**2 +
                    (2 * a * math.sin(theta) * math.tan(theta)) +
                    (math.sin(theta))**2*(math.tan(theta))**2))

        R = (Fs + Fp)/2

        fresnel.append((R, Fs, Fp))

        theta_deg += 1
    return fresnel

import math
import matplotlib.pyplot as plt

n1, n2  = 1.00, 1.45  # into glass, one side only
n2ovrn1 = n2/n1

Rin, Fsin, Fpin = zip(*IOR(n2ovrn1, 0))

print Rin[0]
print (n2ovrn1-1.0)**2 / (n2ovrn1+1.0)**2  # check

n1, n2  = 1.45, 1.00  # outof glass, one side only
n2ovrn1 = n2/n1

Rout, Fsout, Fpout = zip(*IOR(n2ovrn1, 0))

print Rout[0]
print (n2ovrn1-1.0)**2 / (n2ovrn1+1.0)**2  # check

plt.figure()
plt.plot(range(91), Rin, '-k', linewidth=2)
plt.plot(range(91), Rout, '-k', linewidth=2)
plt.plot(range(91), Fsin, '-k')
plt.plot(range(91), Fsout, '-k')
plt.plot(range(91), Fpin, '--k')
plt.plot(range(91), Fpout, '--k')
plt.show()


#2 楼

这是折射的复数形式,其中K为消光系数。

您可以在Wikipedia上查看有关折射的信息:复折射率|维基百科

评论


$ \ begingroup $
我在文章的那部分加了红色,但我看不到该公式与上面显示的公式之间的联系。也许我的数学能力不足以解决这个问题。
$ \ endgroup $
–克里斯托弗·海兰德(Kristoffer Helander)
17年6月1日在15:44