Я пытаюсь подогнать каждый пиксель изображения к функции, используя lmfit, и составить карты свободных параметров. Я раньше не использовал lmfit и поэтому не уверен, что мой синтаксис правильный. При выполнении кода выдается ошибка «неподдерживаемые типы операндов» для /: «list» и «float». Я подозреваю, что это происходит, потому что список 'freq' передается в вызове функции greybody. Но предполагается, что freq - это x-данные или входные данные, так что я подхожу к значению, которое функция greybody дает мне для каждого элемента в freq, и, следовательно, его нужно передать как весь список. Следовательно, я не могу понять, как устранить эту ошибку.
from astropy.io import fits
from scipy.optimize import curve_fit
import lmfit
import numpy as np
import math as m
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from numpy import exp, sqrt, pi
from lmfit import minimize,Parameters,Parameter,report_fit
p70 = fits.open('70p_trim.fits')
data70 = p70[0].data
p160 = fits.open('160p_trim.fits')
data160 = p160[0].data
s250 = fits.open('250s_trim.fits')
data250 = s250[0].data
s350 = fits.open('350s_trim.fits')
data350 = s350[0].data
s500 = fits.open('500s_trim.fits')
data500 = s500[0].data
freq=[4.28e12,1.875e12,1.2e12,8.57e11,6e11]
nx=137
ny=206
colden=[[0 for i in range(ny)] for j in range(nx)]
temp70=[[0 for i in range(ny)] for j in range(nx)]
temp160=[[0 for i in range(ny)] for j in range(nx)]
temp250=[[0 for i in range(ny)] for j in range(nx)]
temp350=[[0 for i in range(ny)] for j in range(nx)]
temp500=[[0 for i in range(ny)] for j in range(nx)]
tk=[[0 for i in range(ny)] for j in range(nx)]
beta=[[0 for i in range(ny)] for j in range(nx)]
chi_sqred=[[0 for i in range(ny)] for j in range(nx)]
ydat=[0 for i in range(5)]
bg70=0.002370929
bg160=0.011766256
bg250=0.0034188613
bg350=0.0038749452
bg500=0.0017783735
o=7.0*7.0/(4.25*m.pow(10,10))
def greybodyfit(v,N,T,b):
h=6.626e-27
c=3.0e+10
u=2.86
kv=0.1*(v/1000.0e9)**b
k=1.38e-16
mh=1.67e-24
t=mh*u*N*kv
B=(2.0*h*v**3.0)/((c**2.0) * np.exp(h*v/(k*T))-1)
Fv=o*B*(1-np.exp(-t))
return Fv
def redchisqg(f,y):
sd,chi_sq=0,0
for z in range(5):
sd+=(f[z]-np.mean(f))**2
sd=m.sqrt(sd/4.0)
for q in range(5):
chi_sq+=(f[q]-y[q])**2/(sd)**2
return chi_sq/2.0
def fcn2fit(params,freq,F):
colden=params['colden'].value
tk=params['tk'].value
beta=params['beta'].value
model = greybodyfit(freq,colden,tk,beta)
return model - F
params = Parameters()
params.add('colden', value=1e20)
params.add('tk', value=5.0)
params.add('beta', value=1.0)
for i in range(nx):
for j in range(ny):
temp70[i][j]=data70[i][j]-bg70
temp160[i][j]=data160[i][j]-bg160
temp250[i][j]=data250[i][j]-bg250
temp350[i][j]=data350[i][j]-bg350
temp500[i][j]=data500[i][j]-bg500
F=[temp70[i][j],temp160[i][j],temp250[i][j],temp350[i][j],temp500[i][j]]
F=[F[p]*1e-23 for p in range(5)]
result = minimize(fcn2fit, params, args=(freq,F))
final = F + result.residual
report_fit (params)
for u in range(5):
ydat[u]=greybodyfit(freq[u],colden[i][j],tk[i][j],beta[i][j])
ydat=np.array(ydat)
chi_sqred[i][j]=redchisqg(F,ydat)
x=np.linspace(-7,7,ny)
y=np.linspace(-7,7,nx)
X,Y=np.meshgrid(x,y)
colden=np.array(colden)
fig,ax=plt.subplots()
c=ax.pcolormesh(x,y,colden,cmap=cm.jet)
fig.colorbar(c,ax=ax)
tk=np.array(tk)
fig,ax=plt.subplots()
c=ax.pcolormesh(x,y,tk,cmap=cm.jet)
fig.colorbar(c,ax=ax)
beta=np.array(beta)
fig,ax=plt.subplots()
c=ax.pcolormesh(x,y,beta,cmap=cm.jet)
fig.colorbar(c,ax=ax)
chi_sqred=np.array(chi_sqred)
fig,ax=plt.subplots()
c=ax.pcolormesh(x,y,chi_sqred,cmap=cm.jet)
fig.colorbar(c,ax=ax)
plt.show()