python - 定义和绘制 Schechter 函数 : plot problems

标签 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

最佳答案

您描述的函数在您的大部分输入范围内返回一个复杂的结果。在这里,我将 +0j 添加到输入中以允许虚构的结果;如果你不这样做,你只会得到一堆 nan(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 轴就很难知道)。

关于python - 定义和绘制 Schechter 函数 : plot problems,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31818448/

相关文章:

python - 将图像转换为位图

python - Numpy 数组切片

python - 使用 python 请求的一个连接请求某个站点上的多个页面

C++如何创建一个接受字符串并返回函数的映射

python - 在 Windows 上安装 paramiko

c++ - 函数返回的 boost::multi_array_ref 安全吗?

javascript - 如何调用在 javascript 变量中定义的函数

python - 使用字典查找方式访问 numpy,但保留 numpy 数组操作

Python,将Python代码字符串导入为模块

python - py3k : case-insensitive list sorting - With or WIthout lambda?