Python scipy.weave.inline无法按预期使用数学库

Python scipy.weave.inline无法按预期使用数学库,python,numpy,scipy,Python,Numpy,Scipy,我在使用scipy.weave.inline时遇到问题。我想编程一个以lcenter为中心的unitstep函数,宽度为_nm。我有两个版本:python版本,称为pm和优化函数,称为pm_weave,但看起来abs工作不正常。请参阅下面的代码。如果你运行它,你会得到一个大小为1的窗口,用于编织品种,无论输入是什么,所以看起来abs不起作用。例如,如果拆下abs,它的工作原理与预期完全相同 我怎样才能解决这个问题 def pm_weave(w,lcenter,width_nm): """ R

我在使用scipy.weave.inline时遇到问题。我想编程一个以lcenter为中心的unitstep函数,宽度为_nm。我有两个版本:python版本,称为pm和优化函数,称为pm_weave,但看起来abs工作不正常。请参阅下面的代码。如果你运行它,你会得到一个大小为1的窗口,用于编织品种,无论输入是什么,所以看起来abs不起作用。例如,如果拆下abs,它的工作原理与预期完全相同

我怎样才能解决这个问题

def pm_weave(w,lcenter,width_nm):
  """ Return a unitstep function that is centered around lcenter with height 1.0 and width width_nm """
  lcenter = float(lcenter)
  w = float(w)
  width_nm = float(width_nm)
  code = """
  #include <math.h>
  float wl = 1.88495559215387594307758602997E3/w;

  if(abs(lcenter-wl) < width_nm) {
     return_val = 1.0;
     }
     else {
     return_val = 0.0;
     }
  """
  res = weave.inline(code,['w','lcenter','width_nm'],
                     type_converters = weave.converters.blitz,
                     compiler = "gcc", headers=["<math.h>"]
                    )
  return res



def pm(w,lcenter,width_nm):
  """ 
  Return a unitstep function centered around lcenter [nm] with width width_nm. w
  should be a radial frequency. 
  """
  return abs(600*np.pi/w - lcenter) < width_nm/2. and 1. or 0.



plot(wavelength_list,map(lambda w:pm(toRadialFrequency(w),778,1),wavelength_list),label="Desired behaviour")
plot(wavelength_list,map(lambda w:pm_weave(toRadialFrequency(w),778,1),wavelength_list),'^',label="weave.inline behaviour")
ylim(0,1.5)
show()
def pm_weave(宽、中、宽\u nm):
“”“返回以lcenter为中心、高度为1.0、宽度为\u nm的unitstep函数”“”
lcenter=浮动(lcenter)
w=浮动(w)
宽度\纳米=浮动(宽度\纳米)
代码=”“
#包括
浮子wl=1.88495559215387594307758602997E3/w;
如果(abs(中心wl)<宽度\u nm){
返回值=1.0;
}
否则{
返回值=0.0;
}
"""
res=weave.inline(代码,['w','lcenter','width\u nm'],
类型_转换器=weave.converters.blitz,
compiler=“gcc”,headers=[“”]
)
返回res
def pm(宽、中、宽\u nm):
""" 
返回一个以lcenter[nm]为中心、宽度为\u nm.w的unitstep函数
应该是径向频率。
"""
返回abs(600*np.pi/w-lcenter)<宽度\u nm/2。和1。或0。
绘图(波长列表,地图(λw:pm(toRadialFrequency(w),778,1),波长列表),标签=“期望行为”)
绘图(波长列表,地图(lambda w:pm_weave(toRadialFrequency(w),778,1),波长列表),“^”,label=“weave.inline behavior”)
ylim(0,1.5)
show()

我认为您可能需要在C代码中使用
fabs()
而不是
abs()
abs()
将截断结果,而
fabs()
将用于浮点运算