定义和绘制Schechter函数:绘制问题

时间:2015-08-04 20:13:22

标签: python function numpy matplotlib astronomy

我目前正在python中定义一个函数:

def schechter_fit(logM, phi=5.96E-11, log_M0=11.03, alpha=-1.35, e=2.718281828):
    schechter = phi*(10**((alpha+1)*(logM-log_M0)))*(e**(pow(-10,logM-log_M0)))
    return schechter

schechter_range = numpy.linspace(10.0,11.9,10000)

然后将所述函数绘制为:

import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid.axislines import SubplotZero

schechter_range = numpy.linspace(10, 12, 10000)

fig = plt.figure(1)
ax = SubplotZero(fig, 111)
fig.add_subplot(ax)

ax.plot(schechter_range, schechter_fit(schechter_range), 'k')

这是我收到的图形输出只是一个没有绘制曲线的空白图。我如何定义函数一定有问题,但我看不出问题。情节看起来应该是这样的:

enter image description here

我是python函数的新手,所以也许我的等式不太正确。这就是我要绘制的内容以及我开始使用的参数:

enter image description here

2 个答案:

答案 0 :(得分:3)

您描述的功能会在您的大部分输入范围内返回复杂的结果。在这里,我将+0j添加到输入中以允许虚构结果;如果你不这样做,你就得到一堆nan s(mpl不会绘制)。以下是情节:

enter image description here

import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid.axislines import SubplotZero

schechter_range = numpy.linspace(10, 12, 10000)

fig = plt.figure(1)
ax = SubplotZero(fig, 111)
fig.add_subplot(ax)

def schechter_fit(logM, phi=5.96E-11, log_M0=11.03, alpha=-1.35, e=2.718281828):
    schechter = phi*(10**((alpha+1)*(logM-log_M0)))*(e**(pow(-10,logM-log_M0)))
    return schechter

y = schechter_fit(schechter_range+0j)  # Note the +0j here to allow an imaginary result
ax.plot(schechter_range, y.real, 'b', label="Re Part")
ax.plot(schechter_range, y.imag, 'r', label="Im Part")
ax.legend()
plt.show()

既然你可以看到为什么数据没有绘图,并且正在生成复杂的数字,并且你在物理上知道你不想要那些,那么找出它们的来源是合理的。希望很明显,这些来自pow(-10,logM-log_M0),并且从那里可以清楚地看出这是假设运算符优先级错误:等式不是pow(-10,logM-log_M0),但是-pow(10,logM-log_M0)。进行此更正(在记录日志之后,因为我可以看到问题中的图中的日志): enter image description here

我还将下限从10扩展到8,因此恒定斜率的区域是清晰的,它更好地匹配问题中显示的图形。这仍然是y轴上的一个因素,但我猜测(SFR / M *)的因素没有被正确应用(它很难知道没有看到上下文和完整的y轴)。

答案 1 :(得分:0)

除了我直接记录你的表达式的日志之外,我确实和tom10相同,这会将因子转化为加法并且可以使事情更容易调试。

我没有真正测试公式!

import numpy
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid.axislines import SubplotZero

def log_schechter_fit(logM, SFR_M=5.96E-11, log_M0=11.03, 
                      alpha=-1.35):
    schechter = numpy.log(SFR_M)
    schechter += (alpha+1)*(logM-log_M0)*numpy.log(10)
    schechter += pow(-10,logM-log_M0)
    return schechter

schechter_range = numpy.linspace(10, 12, 10000)

# for i in range(10,13):
for i in numpy.linspace(10, 11.03, 10):
    print(i, log_schechter_fit(i+0j))

fig = plt.figure(1)
ax = SubplotZero(fig, 111)
fig.add_subplot(ax)
ax.set_xlim([10,12])
y = log_schechter_fit(schechter_range+0j)

ax.plot(schechter_range, y.real, 'b', label="Re Part")
ax.plot(schechter_range, y.imag, 'r', label="Im Part")
ax.legend()

我得到了:

enter image description here

<强>更新

再次使用tom10对运算符优先级的注释并更改函数的最后一部分:

LOG_10 = numpy.log(10)
SFR_M = 5.96E-11
LOG_SFR_M = numpy.log(SFR_M)
def log_schechter_fit(logM, log_SFR_M=LOG_SFR_M, log_M0=11.03, 
                      alpha=-1.35):
    schechter = log_SFR_M
    schechter += (alpha+1)*(logM-log_M0)*LOG_10
    schechter -= pow(10,logM-log_M0)
    return schechter

我可以重现已接受答案的情节。曲线的形状适合但我无法解释与问题中发布的原始情节相比的价值差异......

enter image description here