定义和绘制 Schechter 函数:绘制问题
Defining and plotting a Schechter function: plot problems
我目前正在 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')
这是我收到的图形输出,只是一个没有绘制曲线的空白图。我定义函数的方式肯定有问题,但我看不到问题所在。该图应如下所示:
我是 python 函数的新手,所以我的等式可能不太正确。这就是我要绘制的内容和我开始使用的参数:
您描述的函数 returns 在您的大部分输入范围内的复杂结果。这里我在输入中添加了 +0j
以允许一个虚构的结果;如果你不这样做,你只会得到一堆 nan
s(mpl 不会绘制)。以下是情节:
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)
。进行此更正(在记录日志后,因为我可以在问题的图中看到日志):
我还将下界从10
扩展到8
,所以等斜率区域很清楚,它与问题中显示的图形更好地匹配。这仍然偏离了 y 轴上的一个因素,但我猜这是 (SFR/M*) 的一个因素,它没有被正确应用(如果没有看到上下文和完整的 y 轴就很难知道).
我做的和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()
我得到了:
更新
再次使用 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
我可以重现已接受答案的情节。曲线的形状适合,但我无法解释与问题中发布的原始图相比值的差异...
我目前正在 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')
这是我收到的图形输出,只是一个没有绘制曲线的空白图。我定义函数的方式肯定有问题,但我看不到问题所在。该图应如下所示:
我是 python 函数的新手,所以我的等式可能不太正确。这就是我要绘制的内容和我开始使用的参数:
您描述的函数 returns 在您的大部分输入范围内的复杂结果。这里我在输入中添加了 +0j
以允许一个虚构的结果;如果你不这样做,你只会得到一堆 nan
s(mpl 不会绘制)。以下是情节:
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)
。进行此更正(在记录日志后,因为我可以在问题的图中看到日志):
我还将下界从10
扩展到8
,所以等斜率区域很清楚,它与问题中显示的图形更好地匹配。这仍然偏离了 y 轴上的一个因素,但我猜这是 (SFR/M*) 的一个因素,它没有被正确应用(如果没有看到上下文和完整的 y 轴就很难知道).
我做的和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()
我得到了:
更新
再次使用 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
我可以重现已接受答案的情节。曲线的形状适合,但我无法解释与问题中发布的原始图相比值的差异...