Не удалось оценить ковариацию параметров SciPy Curve_fit.Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Не удалось оценить ковариацию параметров SciPy Curve_fit.

Сообщение Anonymous »

Я пытаюсь оценить коэффициенты Шотта стеклянного материала, учитывая только его n_e(показатель преломления в строке e) и V_e(число Аббе в строке e) ).
Шотт — это один из способов представления дисперсии материала, которая представляет собой разный показатель преломления (RI) на разных длинах волн.
Изображение

На рисунке выше горизонтальная ось — это длина волны. (в микрометрах), а вертикальная ось — показатель преломления (этот показатель основан на типе стекла KZFH1).
Поскольку дисперсия стекла имеет общую форму (выше на более короткой длине волны, а затем снижается), а RI в ключевых точках (линии Фраунгофера) имеют стабильную взаимосвязь, я думаю, что я могу использовать определение числа Аббе и общее соотношение различных RI линий Фраунгофера, чтобы создать некоторые точки данных и используйте их для соответствия кривой:
import numpy as np
from scipy.optimize import curve_fit

# Definition of the Schott function
def _InvSchott(x, a0, a1, a2, a3, a4, a5):
return np.sqrt(a0 + a1* x**2 + a2 * x**(-2) + a3 * x**(-4) + a4 * x**(-6) + a5 * x**(-8))

# Sample input, material parameter from a Leica Summilux patent
n = 1.7899
V = 48

# 6 wavelengths, Fraunhofer symbols are not used due to there is another version that uses n_d and V_d
shorter = 479.99
short = 486.13
neighbor = 546.07
middle = 587.56
longc = 643.85
longer = 656.27

# Refraction index of the corresponding wavelengths.
# The linear functions are acquired from external regressions from 2000 glass materials
n_long = 0.984 * n + 0.0246 # n_C'
n_shorter = ( (n-1) / V) + n_long # n_F', from the definition of Abbe number
n_short = 1.02 * n -0.0272 # n_F
n_neighbor = n # n_e
n_mid = 1.013 * n - 0.0264 # n_d
n_longer = 0.982 * n + 0.0268 # n_C

# The /1000 is to convert the wavelength from nanometer to micrometers
x_data = np.array([longer, longc, middle, neighbor, short, shorter]) / 1000.0
y_data = np.array([n_longer, n_long, n_mid, n_neighbor, n_short, n_shorter])

# Provided estimate are average value from the 2000 Schott glasses
popt, pcov = curve_fit(_InvSchott, x_data, y_data, [2.75118, -0.01055, 0.02357, 0.00084, -0.00003, 0.00001])

x_data и y_data в этом случае следующие:
[0.65627 0.64385 0.58756 0.54607 0.48613 0.47999]
[1.7844818 1.7858616 1.7867687 1.7899 1.798498 1.80231785]

А затем я получил предупреждение OptimizeWarning: невозможно оценить ковариацию параметров. Результатом подгонки были все, кроме [inf inf inf inf inf].
Я знаю, что этот вопрос задавали много, но я не нашел решения, которое работало бы в этом случае. дело еще. Точка данных 6, конечно, немного скудна, но она удовлетворяет минимуму, а функция Шотта непрерывна, поэтому я не могу понять, какая часть пошла не так.
TLDR:
Как найти коэффициенты функции
def _InvSchott(x, a0, a1, a2, a3, a4, a5):
return np.sqrt(a0 + a1* x**2 + a2 * x**(-2) + a3 * x**(-4) + a4 * x**(-6) + a5 * x**(-8))

который соответствует приведенным ниже данным:
x: [0.65627 0.64385 0.58756 0.54607 0.48613 0.47999]
y: [1.7844818 1.7858616 1.7867687 1.7899 1.798498 1.80231785]


Подробнее здесь: https://stackoverflow.com/questions/790 ... -estimated
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»