python绘制基本初等函数(一)

数学工程 专栏收录该内容
12 篇文章 0 订阅


之前用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常数函数RRY
y=x^a幂函数RRY
y=a^x指数函数RRY
y=log_a x对数函数(0,+∞)RY
y =sin x正弦函数R[-1,1]Y
y =cos x余弦函数R[-1,1]Y
y =tan x正切函数{x|x≠(π/2)+kπ,k∈Z}RY
y =cot x余切函数{x|x≠kπ,k∈Z}RY
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]RY
y =arccos x反余弦函数[-1,1]RY
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

便会画出如下图
图 1 y=0
当我输入

x**2

便会画出如下图
图 2 y=x^2
当我输入

2**x

便会画出如下图
图 3 y=2^x
当我输入

math.log(x, 2)

便会画出如下图
图 6 y=log_2 x

当我输入

math.log10(x)

便会画出如下图
图 7 y=log_10 x
当我输入

math.log(x)

便会画出如下图
图 8 y=ln(x)

当我输入

math.sin(x)

便会画出如下图
图 5 y=sin(x)
当我输入

math.cos(x)

便会画出如下图
图 6 y=cos(x)
当我输入

math.tan(x)

便会画出如下图

图 7  y=tan(x)
当我输入

1/math.tan(x)

便会画出如下图
图 8 y=cot(x)
当我输入

1/math.cos(x)

便会画出如下图
图 9 y=sec(x)
当我输入

1/math.sin(x)

便会画出如下图
图 10 y=csc(x)
当我输入

math.asin(x)

便会画出如下图

图 8 y=arcsin(x)
当我输入

math.acos(x)

便会画出如下图

图 10 y=arccos(x)

当我输入

math.atan(x)

便会画出如下图
图 11 y=arctan(x)
当我输入

math.pi/2-math.atan(x)

便会画出如下图

图 14 y=arccot(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()函数,因为这个函数更为灵活

其中

  1. s=‘x’ 表示要标注的内容;
  2. xy=(max(X), 0)是为标注设置一个参照点(max(X), 0),即横坐标的最右端;
  3. xycoords=‘data’ 表示参照点的单位是一个值的形式;
  4. xytext=(+0, +5)表示标注文本的偏移量,是相对于参照点的偏移量;
  5. textcoords=‘offset points’表示注释文本的坐标系属性,表示以点为单位,也可以是pixels,表示以像素为单位,还可以是xycoords的属性值

因为选定了横坐标最右端为参照点,再加上偏移量,任你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模块

在这里插入图片描述

  • 2
    点赞
  • 4
    评论
  • 29
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 4 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页

打赏作者

帅帅de三叔

赞赏也是一种肯定!

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值