用pyplot绘制csc(x)原函数无图像?求原因及解决方法
问题原因及修复方法
原因分析
你写的函数表达式log(cos(x)-1)/2 - log(cos(x)+1)/2在实数域内完全没有有效定义:
cos(x)的取值范围是[-1, 1],因此cos(x)-1的取值范围是[-2, 0],而numpy的log函数仅支持正实数输入,对非正数会返回nan(实数运算模式下)。- 整个
func数组的所有元素都是nan,matplotlib不会绘制任何nan点,因此窗口打开后没有绘图内容。
而你测试的log(cos(x)+1)/2能正常绘图,是因为cos(x)+1的取值范围是[0, 2],仅当cos(x) = -1(即x=π+2kπ)时为0,其余点都是正实数,因此大部分位置有有效数值,能被matplotlib绘制。
修复方法
csc(x)的正确原函数是ln|tan(x/2)| + C,你可以通过添加绝对值修正表达式,让对数的自变量为正实数:
方法1:修正原表达式
给对数的自变量加上绝对值,确保输入为正:
from numpy import * import matplotlib.pyplot as plt x = linspace(-100, 100, 200000) # 带绝对值的正确表达式 func = log(abs(cos(x)-1))/2 - log(abs(cos(x)+1))/2 plt.plot(x, func) plt.show()
方法2:使用简化等价表达式
直接用更简洁的等价形式log(abs(tan(x/2))),结果完全一致:
from numpy import * import matplotlib.pyplot as plt x = linspace(-100, 100, 200000) func = log(abs(tan(x/2))) plt.plot(x, func) plt.show()
补充说明
- 当x取kπ(k为整数)时,csc(x)本身无定义,因此这些位置的函数值仍为
nan,matplotlib会自动跳过这些点,不影响整体图像显示。 - 如果你需要更清晰的图像,可以调整x的范围(比如缩小到[-10,10]),或者添加网格、坐标轴标签辅助观察。
内容的提问来源于stack exchange,提问作者backtosq1
相关产品推荐
相关产品推荐

