数学模块math和sympy

本文详细介绍了Python的math模块,包括圆周率pi、自然对数的底e,以及ceil、floor、gcd、pow、sqrt等常用函数的使用。接着,讲解了log函数的不同形式以及三角函数sin、cos、tan的运用。此外,还探讨了sympy模块,展示了如何定义符号、进行符号运算、解方程以及绘制图形。最后,通过实例演示了sympy的plot函数来绘制坐标图。
摘要由CSDN通过智能技术生成

数学模块的变量

在使用math模式前,请先导入此模块。

import math

常用数学模块的变量有

pi:圆周率        e:自然对数的底

列出圆周率pi和自然对数的底e。

import math

print('pi = {}'.format(math.pi))
print('e  = {}'.format(math.e))

运行结果:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
pi = 3.141592653589793
e  = 2.718281828459045

[Done] exited with code=0 in 0.259 seconds

一般函数

常用的一般函数
函数名称说明
ceil(x)可以得到不小于x的最小整数
floor(x)可以得到不大于x的最大整数
gcd(x,y)可以得到x和y的最大公约数
pow(x,y)可以得到x的y次方
sqrt(x)可以得到x的平方根

代码如下:

import math

print('ceil(2.1)   = {}'.format(math.ceil(2.1)))
print('ceil(2.9)   = {}'.format(math.ceil(2.9)))
print('ceil(-2.1)  = {}'.format(math.ceil(-2.1)))
print('ceil(-2.9)  = {}'.format(math.ceil(-2.9)))
print('floor(2.1)  = {}'.format(math.floor(2.1)))
print('floor(2.9)  = {}'.format(math.floor(2.9)))
print('floor(-2.1) = {}'.format(math.floor(-2.1)))
print('floor(-2.9) = {}'.format(math.floor(-2.9)))

print()

print('gcd(16, 40) = {}'.format(math.gcd(16, 40)))
print('gcd(28, 56) = {}'.format(math.gcd(28, 63)))

print()

print('pow(2, 3) = {}'.format(math.pow(2, 3)))
print('pow(2, 5) = {}'.format(math.pow(2, 5)))

print()

print('sqrt(4) = {}'.format(math.sqrt(4)))
print('sqrt(8) = {}'.format(math.sqrt(8)))

运行结果如下:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
ceil(2.1)   = 3
ceil(2.9)   = 3
ceil(-2.1)  = -2
ceil(-2.9)  = -2
floor(2.1)  = 2
floor(2.9)  = 2
floor(-2.1) = -3
floor(-2.9) = -3

gcd(16, 40) = 8
gcd(28, 56) = 7

pow(2, 3) = 8.0
pow(2, 5) = 32.0

sqrt(4) = 2.0
sqrt(8) = 2.8284271247461903

[Done] exited with code=0 in 0.311 seconds

log()函数

常用的log()函数
函数名称说明
log2(x)可以得到以2为底x的对数
log10(x)可以得到以10为底x的对数
log(x)可以得到以e为底x的对数
log(x[,base])可以得到以base为底x的对数

log()函数的应用。

import math

print('log2(4)       = {}'.format(math.log2(4)))
print('log10(100)    = {}'.format(math.log10(100)))
print('log(e)        = {}'.format(math.log(math.e)))
print('log(2, 4)     = {}'.format(math.log(4, 2)))
print('log(10, 100)  = {}'.format(math.log(100, 10)))

运行结果如下:

[Running] python -u "c:\Users\a-xiaobodou\OneDrive - Microsoft\Projects\tempCodeRunnerFile.py"
log2(4)       = 2.0
log10(100)    = 2.0
log(e)        = 1.0
log(2, 4)     = 2.0
log(10, 100)  = 2.0

[Done] exited with code=0 in 0.295 seconds

三角函数

常用的三角函数
函数名称说明
sin(x)得到sin(x)的值
cos(x)得到cos(x)的值
tan(x)得到tan(x)的值
radians(x)将x的角度转成弧度
degrees(x)将x的弧度度转成角度

sin()和cos()的应用,其中xpt数组元素的单位是弧度。

import matplotlib.pyplot as plt
import numpy as np

xpt = np.linspace(0, 10, 500)           # 建立含500个元素的数组
ypt1 = np.sin(xpt)                      # y数组的变化
ypt2 = np.cos(xpt)

plt.plot(xpt, ypt1, label='sin')        # 预设颜色
plt.plot(xpt, ypt2, label='cos')        # 预设颜色
plt.xlabel('rad')
plt.ylabel('value')
plt.title('Sin and Cos function')
plt.grid()
plt.legend(loc='best')

plt.show()

运行结果:

弧度是圆周长与圆半径的比,对于30度或390度转成弧度后输入三角函数,所获得的值 是一样的。

>>> import math
>>> math.sin(math.radians(30))
0.49999999999999994
>>> math.sin(math.radians(390))
0.5
>>>

sympy模块

sympy模块常用于解决线性代数问题,也可以用此模块绘制图表。

安装此模块:pip install sympy

C:\Users\a-xiaobodou>pip install sympy
WARNING: Ignoring invalid distribution -ip (c:\python310\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (c:\python310\lib\site-packages)
Collecting sympy
  Downloading sympy-1.11.1-py3-none-any.whl (6.5 MB)
     ---------------------------------------- 6.5/6.5 MB 37.1 kB/s eta 0:00:00
Collecting mpmath>=0.19
  Downloading mpmath-1.2.1-py3-none-any.whl (532 kB)
     ---------------------------------------- 532.6/532.6 kB 54.2 kB/s eta 0:00:00
WARNING: Ignoring invalid distribution -ip (c:\python310\lib\site-packages)
Installing collected packages: mpmath, sympy
ERROR: Could not install packages due to an OSError: [WinError 5] Access is denied: 'C:\\Python310\\share'
Consider using the `--user` option or check the permissions.

WARNING: Ignoring invalid distribution -ip (c:\python310\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (c:\python310\lib\site-packages)
WARNING: Ignoring invalid distribution -ip (c:\python310\lib\site-packages)

[notice] A new release of pip available: 22.2.1 -> 22.2.2
[notice] To update, run: python.exe -m pip install --upgrade pip

C:\Users\a-xiaobodou>

定义符号

>>> from sympy import Symbol
>>> x=Symbol('x')
>>> x+x+2
2*x + 2
>>> y=Symbol('x')
>>> y+y+2
2*x + 2
>>>

name属性

>>> X=Symbol('x')
>>> X.name
'x'
>>> y=Symbol('x')
>>> y.name
'x'
>>>

定义多个符号变量

>>> from sympy import symbols
>>> a,b,c=symbols('a,b,c')
>>> a.name
'a'
>>> b.name
'b'
>>> c.name
'c'
>>>

符号的运算

subs()方法的参数是字典。

>>> x=Symbol('x')
>>> y=Symbol('y')
>>> z=5*x+6*y+x*y
>>> z
x*y + 5*x + 6*y
>>>

将数值代入公式

>>> x=Symbol('x')
>>> y=Symbol('y')
>>> eq=5*x+6*y
>>> result=eq.subs({x:1,y:2})
>>> result
17
>>>

将字符串转为数学表达式

sympify()方法会将字符串转为数学表达式。

>>> from sympy import sympify
>>> x=Symbol('x')
>>> eq=input('请输入公式:')
请输入公式:x**3+2*x**2+3*x+5
>>> eq=sympify(eq)
>>> 2*eq
2*x**3 + 4*x**2 + 6*x + 10
>>> eq
x**3 + 2*x**2 + 3*x + 5
>>> result=eq.subs({x:1})
>>> result
11
>>>

解一元一次方程式

sympy模块也可以解下列一元一次方程式:

y=ax+b

例如:求解下列公式:

3x+5=8

上述问题可以使用solve()方法求解,在使用sympy模块时,先将上述公式转为下列表达式:

eq=3x+5-8

>>> from sympy import solve,Symbol
>>> x=Symbol('x')
>>> eq=3*x+5-8
>>> solve(eq)
[1]
>>> ans=solve(eq)
>>> print(type(ans))
<class 'list'>
>>> ans
[1]
>>> ans[0]
1
>>>

解一元二次方程式

sympy模块也可以解下列一元二次方程式:

y=ax^{2}+bx+c

例如:x^{2}+5x=0

上述问题可以使用solve()方法求解,在使用sympy模块时,先将上述公式转为下列表达式:

eq=x^{2}+5x

>>> from sympy import solve,Symbol
>>> x=Symbol('x')
>>> eq=x**2+5*x
>>> solve(eq)
[-5, 0]
>>> ans=solve(eq)
>>> print(type(ans))
<class 'list'>
>>> ans
[-5, 0]
>>> ans[0]
-5
>>> ans[1]
0
>>>

解含未知数的方程式

sympy模块也可以解下列含未知数的一元二次方程式:

ax^{2}+bx+c=0

>>> from sympy import solve,symbols
>>> x,a,b,c=symbols('x,a,b,c')
>>> eq=a*x*x+b*x+c
>>> solve(eq,x)
[(-b - sqrt(-4*a*c + b**2))/(2*a), (-b + sqrt(-4*a*c + b**2))/(2*a)]
>>>

解联立方程式

有一个联立方程式如下:

3x+2y=6

9x+y=3

>>> from sympy import solve,symbols
>>> eq1=3*x+2*y-6
>>> eq2=9*x+y-3
>>> solve((eq1,eq2))
{x: 0, y: 3}
>>> ans=solve((eq1,eq2))
>>> print(type(ans))
<class 'dict'>
>>> print(ans[x])
0
>>> print(ans[y])
3
>>> eq1.subs({x:ans[x],y:ans[y]})
0
>>> eq2.subs({x:ans[x],y:ans[y]})
0
>>>

3x+2y=10

9x+y=3

>>> from sympy import solve,symbols
>>> x,y=symbols('x,y')
>>> eq1=3*x+2*y-10
>>> eq2=9*x+y-3
>>> solve((eq1,eq2))
{x: -4/15, y: 27/5}
>>> ans=solve((eq1,eq2))
>>> ans[x]
-4/15
>>> float(ans[x])
-0.26666666666666666
>>> ans[y]
27/5
>>> float(ans[y])
5.4
>>>

绘制坐标图的基础

使用sympy的数学模块需要导入sympy.plotting的plot模块,如下所示:

from sympy.plotting import plot

绘制y=2x-5实例:

>>> from sympy import Symbol
>>> from sympy.plotting import plot
>>> x=Symbol('x')
>>> plot(2*x-5)
<sympy.plotting.plot.Plot object at 0x00000182AD1AAD10>
>>>

 

 

设定绘图的x轴区间

设定x轴是在-5~5.

>>> from sympy import Symbol
>>> from sympy.plotting import plot
>>> x=Symbol('x')
>>> plot((2*x-5),(x,-5,5))
<sympy.plotting.plot.Plot object at 0x00000182BAA4C100>
>>>

 

增加绘图标题与轴标题

plot()内可以使用title建立 图表标题,使用xlabel建立 x坐标标题,使用ylabel建立 坐标标题。

为图表建立 下列标题:

title:Sympy

x轴:x

y轴:2x-5

>>> from sympy import Symbol
>>> from sympy.plotting import plot
>>> x=Symbol('x')
>>> plot((2*x-5),(x,-5,5),title='Sympy',xlabel='x',ylabel='2x-5')
<sympy.plotting.plot.Plot object at 0x00000182BABB31C0>
>>>

 

多函数图形

>>> from sympy import Symbol
>>> from sympy.plotting import plot
>>> x=Symbol('x')
>>> plot(2*x-5,3*x+2)
<sympy.plotting.plot.Plot object at 0x00000182BABB3220>
>>>

 

plot()的show参数

在plot()方法内可以建议show参数,默认是显示图形,如果设定show=False,可以不显示图形。

>>> from sympy import Symbol
>>> from sympy.plotting import plot
>>> x=Symbol('x')
>>> plot(2*x-5,3*x+2,show=False)
<sympy.plotting.plot.Plot object at 0x00000182BABB3220>
>>>

使用不同颜色绘图

>>> from sympy import Symbol
>>> from sympy.plotting import plot
>>> x=Symbol('x')
>>> line=plot(2*x-5,3*x+2,show=False)
>>> line[1].line_color='r'
>>> line.show()

 

图表增加图例

在plot()内增加legend=True,可以在图表内增加图例。

>>> from sympy import Symbol
>>> from sympy.plotting import plot
>>> x=Symbol('x')
>>> line=plot(2*x-5,3*x+2,legend=True,show=False)
>>> line[1].line_color='r'
>>> line.show()
>>>

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值