栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Cocos2d-x

神奇的SymPy库——享受被高等数学统治的感觉吧

Cocos2d-x 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

神奇的SymPy库——享受被高等数学统治的感觉吧

一个帅气的boy,你可以叫我Love And Program
 ⌨个人主页:Love And Program的个人主页
如果对你有帮助的话希望三连支持一下博主

SymPy 库
  • 前言
  • SymPy 基操
  • 初中部分
  • 高数部分
    • 微分方程
    • 极限

前言

SymPy 库是一个非常神秘的库,可以完成很多高数上的操作,以后我终于不怕做高数题咯浪浪

SymPy 基操

       先来个基本的除法练练手,evalf函数可以保留5位数字,Rational函数可以处理有理数。

from sympy import Rational#处理有理数
r1 = Rational(1/3)
r2 = Rational(1/3)
val = (r1 + r2 ) * 4
print(val.evalf(5))
val2 = (1/3 + 1/3 ) * 4
print(val2)
#2.6667
#2.6666666666666665

Mul是相乘,其中evaluate属性有延迟效果。

from sympy import sqrt, pprint, Mul
x = sqrt(2)
y = sqrt(3)
pprint(Mul(x,  y, evaluate=False))
print('结果为',x * y)
#√6
#结果为 sqrt(6)
from sympy import expand, pprint
from sympy.abc import x
expr = (x + 1) ** 3
pprint(expr)
print('*******************')
#将其扩展开
expr = expand(expr)
pprint(expr)
#       3
#(x + 2) 
#*******************
# 3      2           
#x  + 6⋅x  + 12⋅x + 8
这个库比正常直接计算更为精确,而且pprint函数还有修饰作用,更为直观的在程序中感受数学的魅力,欲听后事如何,咱们下面继续讲
然后...猜猜我在`Mul`函数中还发现什么?


       源码中这几个公式是不是很熟悉,小学学的乘法交换律,分配率?!哈哈,有点怀念哦,不行,简单了,让我们上上强度,小学数学跳跳,上初中。


初中部分

       顺延上面的公式,用solve函数求解,第一个参数是公式,第二个参数是需要解决的符号,于是单个变量的公式都可以用代码轻松计算。

#       3
#(x + 2) 
from sympy import Symbol, solve
x = Symbol('x')
expr = (x + 2) ** 3
sol = solve(expr, x)
print(sol)
#结果:[-2]

还有一种方法也可以求解,Eq用于公式,下面求的是一个(x+2)^2=4的公式

#       2    
#(x + 2)  = 4
from sympy import Symbol, solve
x = Symbol('x')
eq1 = Eq((x + 2) ** 2, 4)
sol = solve(eq1, x)
print(sol)
#结果:[-4, 0]

那两个变量呢?

当然也可以

from sympy import symbols, solve
x,y = symbols('x y')
eq1 = Eq((x + 2) ** 2+y, y)
pprint(eq1)
sol = solve(eq1, x)
print(sol)
#           2    
#y + (x + 2)  = y
#[-2]
肯定会有人想y=x会是啥样,自己试试去浪咱们接着上强度,高数上

高数部分 微分方程
上强度前我先问问大家,微分方程相关的科目学的咋样,我先来我先来,高数89,线代61,勉强过关吧,嘿嘿。既然如此,那...先来个微分方程试试水?。

先来一个二阶常系数齐次线性微分方程求解:

from sympy import Symbol, symbols
from sympy.abc import x, y
f=Function('f')
print(dsolve(Derivative(f(x),x,x)-5*Derivative(f(x),x)+6*f(x),f(x)))
#Eq(f(x), (C1 + C2*exp(x))*exp(2*x))

       Derivative函数是求导,Derivative(f(x),x,x)意思为f(x)对x求两次导数,dsolve函数则是对f(x)求微分(可微即可导,可导不一定可微熟悉不)

上述结果如下,和代码结果是一样的。


是不是感觉还不错,再来一道?!

两次求导,加函数本身,得出结果。

from sympy import Symbol, symbols
from sympy.abc import x, y
f=Function('f')
print(dsolve(Derivative(f(x),x,x)+25*f(x),f(x)))
#Eq(f(x), C1*sin(5*x) + C2*cos(5*x))

结果与代码一致


极限
最后来个极限收收尾吧~~

来看看下面几个题。

1、直接带入法

在sympy 库中有专门的极限函数limit,也有专门代表极限的函数oo,然后解函数吧。

from sympy import sin, limit, oo
from sympy.abc import x
l2 = limit(x**2-x, x, 3)
print(l2)
#6

2、因式分解法

from sympy import limit, oo, symbols
from sympy.abc import x
m,n = symbols('m n')
l2 = limit((x**m-1)/(x**n-1), x, 1)
print(l2)
#m/n

3、概念判断法

from sympy import sin, limit, oo, symbols
from sympy.abc import x
m,n = symbols('m n')
l2 = limit((1/x)*(sin(1/x)), x, oo)
print(l2)
#0

4、洛必达求导法

from sympy import cos, limit, oo, symbols, ln
from sympy.abc import x
m,n = symbols('m n')
l2 = limit((3*sin(x)+((x**2)*cos(1/x)))/((1+cos(x))*ln(x+1)), x, 0)
print(l2)
#3/2
文章到这就结束了,SymPy完全用 Python 编写,只依赖于mpmath,比较容易上手,没事可以来试试实现高级算法公式,提升提升自己能力哦,就是这样。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/896776.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号