【发布时间】:2016-03-15 15:56:54
【问题描述】:
我正在尝试整合这个由几个函数组成的令人讨厌的积分。
import matplotlib.pyplot as plt
import numpy as np
import os
import scipy.integrate as integrate
path = '/users/username/Desktop/untitled folder/python files/document/'
os.chdir( path )
data = np.load('msii_phasespace.npy',mmap_mode='r')
# data.size: 167197
# data.shape: (167197,)
# data.dtype: dtype([('x', '<f4'), ('y', '<f4'), ('z', '<f4'),
# ('velx', '<f4'), ('vely', '<f4'), ('velz', '<f4'), ('m200', '<f4')])
## Constant
rho_m = 3.3e-14
M = data['x'] Mass of dark matter haloes
R = ((3*M)/(rho_m*4*(3.14)))**(1.0/3.0) # Km // Radius of sphere
k = 0.001 # Mpc h^-1 // Wave Dispersion relation
delt_c = 1.686
h = 0.73 # km s^-1 Mpc^-1
e = 2.718281 # Eulers number
T_CMB = 2.725
Omega_m = 0.27
kR = k*R
def T(k):
q = k/((Omega_m)*h**2)*((T_CMB)/27)**2
L = np.log(e+1.84*q)
C = 14.4 + 325/(1+60.5*q**1.11)
return L/(L+C*q**2)
def P(k):
A = 0.75
n = 0.95
return A*k**n*T(k)**2
def W(kR): # Fourier Transfrom in the top hat function
return 3*(np.sin(k*R)-k*R*np.cos(k*R))/(k*R)**3
def sig(R):
def integrand(k,P,W):
return k**2*P(k)*W(kR)**2
I1 = integrate.quad(integrand, lambda k: 0.0, lambda k: np.Inf, args=(k,))
return ((1.0/(2.0*np.pi**2)) * I1)**0.5
打印出 sig(R) 给我TypeError: a float is require。
我需要注意的是,R 是一个物体的半径,它与它的质量成正比。质量由结构化数组给出。我不确定我是否使用正确的积分命令来评估所有质量。只有数组有一组值。
如果您需要更多信息,请告诉我,我很乐意尽我所能分享。任何建议将不胜感激。
【问题讨论】:
-
你能提供你的进口声明吗?可能有足够的源代码来重现 TypeError?
-
没问题,一会儿就好了
-
quad 的第二个和第三个参数
a和b必须是数值,而不是函数。另外,integrand只有一个参数,所以不要使用quad的args参数。试试I1 = integrate.quad(integrand, 0.0, np.inf) -
我认为你需要修复
sig函数中代码的缩进。 -
@WarrenWeckesser 我检查了 T(k) 和 P(k) 都产生了数值。但是 W(kR) 在数组中产生了值,我认为问题出现了。
标签: python arrays numpy ipython typeerror