2014-10-27 2 views
0

Я пытаюсь нелинейное соответствие уравнений Френеля с данными отражения от угла падения. Найдено на этом сайте http://en.wikipedia.org/wiki/Fresnel_equations - это два графика, которые имеют красную и синюю линию. Мне нужно в основном установить синюю линию, когда n1 = 1 к моим данным.Установка уравнений Френеля с использованием Scipy

Здесь я использую следующий код, где th is 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

То, как вы это делаете, является правильным. Ошибка, возникающая из других источников. Действительно ли python дает вам ошибку трассировки? Что он? Возможно ли, что 'xdata' вы переходите к' curve_fit' в градусах, а не в радианах? –

+0

Это в градусах. Это может вызвать такую ​​проблему? – Tristan

+0

Это может быть. Numpy (и почти любая численная библиотека) ожидает, что аргументы, переданные тригонометрическим функциям, например синусоидальному, будут в радианах. Невыполнение этого может привести к необычно большим вариациям (в зависимости от ваших входных данных), и, следовательно, кривая_fit может не найти хорошей подгонки. –

ответ

0

Обязательно передайте аргументы тригонометрическим функциям, таким как синус, в радианах, а не в градусах.

Что касается причин, по которым вы получаете отрицательныйпоказатель преломления: это потому, что в вашей функции вы всегда занимаете квадрат показателя преломления. Алгоритм curve_fit может оказаться в локальном минимальном состоянии, где (случайно) n отрицательно, потому что оно имеет то же значение, что и n положительное. В идеале вы должны добавить ограничения для проблемы минимизации, но для этой (простой) проблемы просто наблюдайте свою формулу и помните, что результат отрицательного n просто решается путем изменения знака, как и вы. Вы также можете попытаться передать первоначальное предположение алгоритму, и вы можете заметить, что он не попадет в локальный минимум с отрицательным значением.

Смежные вопросы