Это мой первый пост, поэтому, пожалуйста, дайте мне знать, если я пропустил важную информацию. Я пытаюсь выполнить подгонку кривой двух параметров. В основном нам дают z_array
(красное смещение) m_B_eff
(величина). Для подгонки кривой необходимо вывести подогнанные значения OmegaM
и OmegaA
.
Массивы следующие:
z_array = [
0.458, 0.354, 0.425, 0.374, 0.42, 0.372, 0.378, 0.453, 0.465, 0.498,
0.655, 0.4, 0.615, 0.48, 0.45, 0.388, 0.57, 0.49, 0.495, 0.656, 0.828,
0.45, 0.43, 0.58, 0.763, 0.526, 0.172, 0.619, 0.592, 0.55, 0.18, 0.374,
0.472, 0.43, 0.657, 0.612, 0.32, 0.579, 0.45, 0.581, 0.416, 0.83, 0.03,
0.05, 0.026, 0.075, 0.026, 0.014, 0.101, 0.02, 0.036, 0.045, 0.043,
0.018, 0.079, 0.088, 0.063, 0.071, 0.052, 0.05
]
m_B_eff = [
23.11, 22.38, 22.13, 21.72, 22.55, 22.26, 22.58, 23.17, 23.33,
23.71, 23.27, 22.36, 23.19, 22.96, 22.51, 22.65, 23.27, 23.1,
22.83, 23.57, 24.65, 23.17, 23.13, 23.46, 24.47, 23.15, 20.17,
23.8, 24.42, 23.51, 20.43, 23.52, 23.11, 22.57, 23.83, 23.69,
21.86, 23.48, 22.83, 23.09, 22.57, 24.32, 16.26, 17.63, 16.08,
18.43, 16.28, 14.47, 19.16, 15.18, 16.66, 17.61, 17.19, 15.61,
18.27, 19.28, 18.24, 18.33, 17.54, 17.69
]
В том, что кажется неудачной попыткой, я попытался ввести значения z_array
в функцию, чтобы scipy
вычислил параметры наилучшего соответствия для OmegaA
и OmegaM
, несмотря на этовыходы обоих имеют порядок 10 ^ 16 ... они должны быть порядка единицы. Печать значений в виде scipy
при попытке их подгонки показывает, что оба значения омега просто взрываются в размере
from scipy.optimize import curve_fit
def func2(x, OmegaA, OmegaM):
resultArr = []
LfuncArr = []
K = 0
for r in range(len(x)):
if OmegaM + OmegaA == 1:
K = 1
LfuncArr.append(np.sqrt(np.abs(K))*(integrate.quad(lambda y: (((1+y)**2)*(1+y*OmegaM)-(2+y)*OmegaA*y)**-0.5, 0, x[r],limit=10000)[0]))
elif OmegaM + OmegaA > 1:
K = 1-OmegaM-OmegaA
LfuncArr.append(np.sin(np.sqrt(np.abs(K))*(integrate.quad(lambda y: (((1+y)**2)*(1+y*OmegaM)-(2+y)*OmegaA*y)**-0.5, 0, x[r],limit=10000)[0])))
elif OmegaM + OmegaA < 1:
K = 1-OmegaM-OmegaA
LfuncArr.append(np.sinh(np.sqrt(np.abs(K))*(integrate.quad(lambda y: (((1+y)**2)*(1+y*OmegaM)-(2+y)*OmegaA*y)**-0.5, 0, x[r],limit=10000)[0])))
resultArr.append((5*np.log10(c*(1+x[r])/np.sqrt(np.abs(K)) * LfuncArr[r]) + 17.931))
return resultArr
plt.plot
p0 = 0.5, 0.5
popt2, pcov2 = curve_fit(func2, z_array, m_B_eff, p0, maxfev=50000)
Ожидаемые выходные значения подгонки космологических параметров: OmegaA
и OmegaM
должны быть порядкаединства. K
и Lfunc
будут определены в соответствии с пошаговой функцией
Для получения дополнительной информации о функции, которую я пытаюсь построить, ее можно найти здесь: https://iopscience.iop.org/article/10.1086/304265/pdf стр. 566.