python绘制数学函数图形
- 基本初等函数概念
- 常数函数
- 幂函数
- 指数函数
- 对数函数
- 三角函数
- 反三角函数
- 完整代码
- 代码解释
之前用python绘制了笛卡尔直角坐标系,绘制了指数函数,绘制了对数函数,有了这三个基础工作的积累,本期,将研究如何利用python绘制6类基本初等函数。
基本初等函数概念
简单的说基本初等函数是不能再由其他更简单结构的函数通过加减乘除四则运算来结合而成的函数。在数学里,基本初等函数包括幂函数、指数函数、对数函数、三角函数、反三角函数、常数函数一共6类。基本初等函数均是连续函数,前面已经介绍过指数函数和对数函数,现在把6类函数的形状和定义域和值域整理。
常数函数
一般的,形如
y = c y=c y=c
的函数称为常数函数,其中c为任意实数,故常数函数的定义域和值域均为全体实数R。
幂函数
一般地,形如
y = x a y=x^a y=xa
的函数称为幂函数,幂函数的定义域和值域均为全体实数R。
指数函数
一般形式
y = a x y=a^x y=ax
的函数称为幂函数,其中a>0, a≠1,指数函数的定义域为全体实数R,值域为(0,+∞)。
对数函数
一般形式
y = l o g a x y=log_a x y=logax
的函数称为对数函数,其中a>0, a≠1,指数函数的定义域为(0,+∞),值域为全体实数R。
三角函数
常见的三角函数有
函数类型
函数名称
定义域
值域
y =sin x
正弦函数
R
[-1,1]
y =cos x
余弦函数
R
[-1,1]
y =tan x
正切函数
{x|x≠(π/2)+kπ,k∈Z}
R
y =cot x
余切函数
{x|x≠kπ,k∈Z}
R
y =sec x
正割函数
{x|x≠(π/2)+kπ,k∈Z}
(-∞,-1 ] ∪ [ 1,+∞)
y =csc x
余割函数
{x|x≠kπ,k∈Z}
(-∞,-1 ] ∪ [ 1,+∞)
反三角函数
常见的反三角函数主要有以下 6 个
函数类型
函数名称
定义域
值域
y =arcsin x
反正弦函数
[-1,1]
R
y =arccos x
反余弦函数
[-1,1]
R
y =arctan x
反正切函数
R
{x|x≠(π/2)+kπ,k∈Z}
y =arccot x
反余切函数
R
{x|x≠kπ,k∈Z}
y =arcsec x
反正割函数
(-∞,-1 ] ∪ [ 1,+∞)
{x|x≠(π/2)+kπ,k∈Z}
y =arccsc x
反余割函数
(-∞,-1 ] ∪ [ 1,+∞)
{x|x≠kπ,k∈Z}
完整代码
知道不同函数的定义非常关键,因为这直接决定了我们画图时候的横坐标可取值范围,先把所有典型函数列出来
函数类型
函数名称
定义域
值域
可画
y=c
常数函数
R
R
Y
y=x^a
幂函数
R
R
Y
y=a^x
指数函数
R
R
Y
y=log_a x
对数函数
(0,+∞)
R
Y
y =sin x
正弦函数
R
[-1,1]
Y
y =cos x
余弦函数
R
[-1,1]
Y
y =tan x
正切函数
{x|x≠(π/2)+kπ,k∈Z}
R
Y
y =cot x
余切函数
{x|x≠kπ,k∈Z}
R
Y
y =sec x
正割函数
{x|x≠(π/2)+kπ,k∈Z}
(-∞,-1 ] ∪ [ 1,+∞)
Y
y =csc x
余割函数
{x|x≠kπ,k∈Z}
(-∞,-1 ] ∪ [ 1,+∞)
Y
y =arcsin x
反正弦函数
[-1,1]
R
Y
y =arccos x
反余弦函数
[-1,1]
R
Y
y =arctan x
反正切函数
R
{x|x≠(π/2)+kπ,k∈Z}
Y
y =arccot x
反余切函数
R
{x|x≠kπ,k∈Z}
Y
y =arcsec x
反正割函数
(-∞,-1 ] ∪ [ 1,+∞)
{x|x≠(π/2)+kπ,k∈Z}
N
y =arccsc x
反余割函数
(-∞,-1 ] ∪ [ 1,+∞)
{x|x≠kπ,k∈Z}
N
我们需要实现的功能是,我们输入一个函数表达式,程序给我们返回该表达式的图像,完整代码如下
# -*- coding: utf-8 -*-"""
Created on Sun Feb 16 16:10:09 2020
project name:draw_func_figure
@author: 帅帅de三叔
"""
import math #导入绘图模块
import numpy as np #导入数值计算模块
import matplotlib.pyplot as plt #导入绘图模块
plt.rcParams['font.sans-serif']=['SimHei'] #绘图中文
plt.rcParams['axes.unicode_minus']=False #绘图负号
import mpl_toolkits.axisartist as axisartist #导入坐标轴加工模块
def elementary_func_draw(X, expr): #定义绘制函数图形的函数,其中x是自变量,y为因变量
#X=np.linspace(-10, 10, 100) #自变量
Y=list(map(lambda x:eval(expr), X))
fig=plt.figure(figsize=(4, 4)) #新建画布
ax=axisartist.Subplot(fig, 111) #使用axisartist.Subplot方法创建一个绘图区对象ax
fig.add_axes(ax) #将绘图区对象添加到画布中
ax.plot(X, Y, label=expr) #绘制函数图形
ax.axis[:].set_visible(False) #隐藏原来的实线矩形
ax.axis["x"]=ax.new_floating_axis(0, 0, axis_direction="bottom") #添加x轴
ax.axis["y"]=ax.new_floating_axis(1, 0, axis_direction="bottom") #添加y轴
ax.axis["x"].set_axisline_style("->", size=1.0) #给x坐标轴加箭头
ax.axis["y"].set_axisline_style("->", size=1.0) #给y坐标轴加箭头
plt.xlim(-max(X), max(X)) #设置横坐标范围
plt.ylim(-max(Y), max(Y)) #设置纵坐标范围
ax.text(-1.0, max(Y), 'y', fontsize=12) #标注y轴
ax.annotate(s='x', xy=(max(X), 0), xycoords='data', xytext=(+0, +5), textcoords='offset points', fontsize=12) #标注x轴
plt.legend()
plt.show()
plt.savefig("func_figure.png")
if __name__=="__main__":
expr=input("请输入函数表达式:")
if "log" in expr: #画对数函数
X=np.linspace(0.001, 10, 100)
elif "asin" in expr: #画反正弦函数
X=np.linspace(-1, 1, 100)
elif "acos" in expr: #画反余弦函数
X=np.linspace(-1, 1, 100)
else:
X=np.linspace(-10, 10, 100)
elementary_func_draw(X, expr)
见证奇迹的时候到了
当我输入
2便会画出如下图
当我输入
x**2便会画出如下图
当我输入
2**x便会画出如下图
当我输入
math.log(x, 2)便会画出如下图
当我输入
math.log10(x)便会画出如下图
当我输入
math.log(x)便会画出如下图
当我输入
math.sin(x)便会画出如下图
当我输入
math.cos(x)便会画出如下图
当我输入
math.tan(x)便会画出如下图
当我输入
1/math.tan(x)便会画出如下图
当我输入
1/math.cos(x)便会画出如下图
当我输入
1/math.sin(x)便会画出如下图
当我输入
math.asin(x)便会画出如下图
当我输入
math.acos(x)便会画出如下图
当我输入
math.atan(x)便会画出如下图
当我输入
math.pi/2-math.atan(x)便会画出如下图
当我输入
arcsec(x)糟糕,不出图
当我输入
arccsc(x)糟糕,不出图
这两个函数还有待后面解决,或许通过三角函数关系式,或者重新定义这两个函数,如果你又什么好办法,欢迎留言。
代码解释
这里重点解释一下在给两个坐标轴打标签时候的处理方法
ax.text(-1.0, max(Y), 'y', fontsize=12) #标注y轴ax.annotate(s='x', xy=(max(X), 0), xycoords='data', xytext=(+0, +5), textcoords='offset points', fontsize=12) #标注x轴
- 在对y轴标注的时候,位置的横向,我们选定了一个定值 -1.0 ,纵向选择Y的最大值,因为横向是定下来的,从-10到10,故只需要在Y轴稍微偏左一点即可,而纵向是随着横向变化而变化的,最大莫过于max(Y),故取其最大值。
- 在对x轴标注的时候,我们不在用到text()函数,改用annotate()函数,因为这个函数更为灵活
其中
因为选定了横坐标最右端为参照点,再加上偏移量,任你y轴怎么变化,这个标注会老老实实呆在那个离(max(X), 0)不远处。
最后贴出math模块下的标准C写的数学函数
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']参考文献
1,基本初等函数
2,反余切函数
2,math模块