Получение ошибки 'неподдерживаемые типы операндов для /:' list 'и' float '' при попытке подгонки с использованием lmfit - PullRequest
0 голосов
/ 31 октября 2019

Я пытаюсь подогнать каждый пиксель изображения к функции, используя 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()

1 Ответ

0 голосов
/ 01 ноября 2019

Вы не опубликовали полный отчет о трассировке или сообщении об ошибке, что было бы полезно узнать, где произошла ошибка.

Но, по сути, вы не можете умножить простой список Python на число с плавающей запятой - aСписок Python может содержать произвольные объекты Python. Вы почти наверняка имеете в виду список, представляющий массив чисел. Таким образом, вы должны использовать numpy.array для преобразования списков в массивы. У вас есть много мест в вашем коде. Возможно, будет достаточно заменить

colden=[[0 for i in range(ny)] for j in range(nx)]

(и следующие за ним строки) на

colden=np.array([[0 for i in range(ny)] for j in range(nx)])

Вы также можете явно сделать это преобразование внутри вашей функции greybody() или в вашемfc2fit, скажем, с помощью

model = greybodyfit(np.array(freq), colden, tk, beta)

или аналогичным образом убедитесь, что freq это пустой массив, а не список питонов.

...