本文章首发于古客
如果想要获得更好的阅读体验,请前往我的博客!
为了解决数学中一些不定积分的求解方便自己做作业,让我们一起学习如何使用python求不定积分吧!
《matlab版点这里》
pip3 install sympy
建议使用anaconda,里面有大量的科学包,方便使用!
我会根据我的理解和官方教程来进行使用,英语好的可以直接去官网看,防止我可能出现的理解误差。
请认真看注释!
from sympy import * #引入包
x = symbols('x') #声明变量'x'
a = Integral(cos(x)*exp(x),x) #
print(Eq(a,a.doit()))
Symbol()函数定义单个数学符号;symbols()函数定义多个数学符号
学了那么久python,忽然发现自己连数学符号都不会打,趁这次机会学习一下好了。
sqrt
:根号
pi
:圆周率
exp(x)
: e x e^x ex
详见《python之math库的使用》
复数的表示
aComplex = 1 + 2j //申明一个复数
aComplex
(1+2j)
aComplex.real #复数实部
1.0
aComplex.imag #复数虚部
2.0
aComplex.conjugate() #共轭复数
(1-2j)
// | 取整除 - 向下取接近除数的整数 |
---|---|
== | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
---|---|---|
!= | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 True。 |
> | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
< | 小于 - 返回x是否小于y。所有比较运算符返回1表示真,返回0表示假。这分别与特殊的变量True和False等价。注意,这些变量名的大写。 | (a < b) 返回 True。 |
>= | 大于等于 - 返回x是否大于等于y。 | (a >= b) 返回 False。 |
<= | 小于等于 - 返回x是否小于等于y。 | (a <= b) 返回 True。 |
以下假设变量a为10,变量b为20:
运算符 | 描述 | 实例 |
---|---|---|
= | 简单的赋值运算符 | c = a + b 将 a + b 的运算结果赋值为 c |
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c *= a 等效于 c = c * a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c **= a 等效于 c = c ** a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
:= | 海象运算符,可在表达式内部为变量赋值。Python3.8 版本新增运算符。 | 在这个示例中,赋值表达式可以避免调用 len() 两次:if (n := len(a)) > 10: print(f"List is too long ({n} elements, expected <= 10)") |
示例:
factor()
函数可以折叠表达式(提取公因子),而expand()
函数可以展开表达式(类似于一般式)
举个例子: x 3 + y 2 x 2 + z x x^3+y^2x^2+zx x3+y2x2+zx,折叠后: x ( x 2 + y 2 x + z ) x(x^2+y^2x+z) x(x2+y2x+z).
import math
import sympy
x,y,z = symbols('x y z')
expr = x**3+(x**2)*(y**2)+z*x
f_expr = factor(expr)
e_expr = expand(f_expr)
print(f_expr)
print(e_expr)
输出结果:
x*(x**2 + x*y**2 + z)
x**3 + x**2*y**2 + x*z
simplify()
函数可以对表达式进行化简,相当于合并同类项
from sympy import *
x,y = symbols('x y')
expr=(2*x)**3*(-5*x*y**2)
s_expr=simplify(expr)
print(s_expr)
输出: -40*x**4*y**2
一元方程组,例: 6 x + 6 ( x − 2000 ) = 150000 6x+6(x-2000)=150000 6x+6(x−2000)=150000, (需要移项)
from sympy import *
x = Symbol('x')
print(solve(6*x + 6*(x-2000)-150000,x)) #默认使用一边为0来求解
二元一次方程组,例:
from sympy import *
x,y = symbols('x y')
print(solve([x + y-10,2*x+y-16],[x,y]))
输出: {
x: 6, y: 4}
n元同理,不再示例。
from sympy import *
x,y = symbols('x y')
a,b,c = symbols('a b c')
expr = a*x**2 + b*x + c
s_expr = solve(expr, x) #告知要解的参数
print(s_expr)
输出 :[(-b + sqrt(-4*a*c + b**2))/(2*a), -(b + sqrt(-4*a*c + b**2))/(2*a)]
一个非常重点的内容,请认真看并记住!
Sympy是使用limit(表达式,变量,极限值)函数来求极限的
例子: lim y → 0 s i n ( x ) x \displaystyle \lim_{y \to0}\frac{sin(x)}{x} y→0limxsin(x)
from sympy import *
x,y = symbols('x y')
expr = sin(x)/x
l_expr = limit(expr, x, 0)
print(l_expr)
结果为1
可以使用diff(表达式,变量,求导的次数)函数对表达式求导(matlab也和这个差不多)
例子: s i n ( x ) e x sin(x)e^x sin(x)ex
from sympy import *
x,y = symbols('x y')
expr = sin(x)*exp(x)
diff_expr = diff(expr, x)
diff_expr2 = diff(expr,x,2) //n阶导同理
print(diff_expr)
print(diff_expr2)
Sympy是使用integrate(表达式,变量)来求不定积分的
例子: e x s i n ( x ) + e x c o s ( x ) e^xsin(x)+e^xcos(x) exsin(x)+excos(x)
from sympy import *
x,y = symbols('x y')
expr=exp(x)*sin(x) + exp(x)*cos(x)
i_expr=integrate(expr,x)
print(i_expr)
输出原函数:exp(x)*sin(x)
Sympy同样是使用integrate()函数来做定积分的求解,
例子: s i n ( x 2 ) sin(x^2) sin(x2)
from sympy import *
x,y = symbols('x y')
expr=sin(x**2)
i_expr=integrate(expr, (x, -oo, oo))
print(i_expr)
输出:sqrt(2)*sqrt(pi)/2 即: 2 π 2 \frac{\sqrt 2 \sqrt \pi}{2} 22π (哭了,手算算不出来,无法验证)
注意:
本人也是一个初学者,如有不对的地方望批评指正!
这个涉及的知识就会比较深了,一般只有较高级的运用才会使用的到,一般仿照上面的代码使用就可以解决绝大多数问题,纯个人想加深理解,选读 (等我有能力的时候再看下源码吧!)
from sympy import *
x = symbols('x')
fx = 5*x+4
# 使用evalf函数传值
y1 = fx.evalf(subs={x:6})
print(y1)
from sympy import *
# 一纬矩阵
m1 = Matrix([1, 2, 3])
#二维矩阵
m2 = Matrix([[1, -1], [3, 4], [0, 2]])
print(latex(m1)
print(latex(m2))
输出:
\left[\begin{matrix}1\\2\\3\end{matrix}\right]
\left[\begin{matrix}1 & -1\\3 & 4\\0 & 2\end{matrix}\right]
完了,有些看不懂,赶紧去查查! 详情请看《LaTeX之数学公式及符号的语法及表达》
Eq()
:创建方程 (例:Eq(x**7+a^2,0) 等式的左边和右边
solve
:求解方程
部分单词扩展:
integral
:积分
indefinite
:不定积分 definite
:定积分
differential
:微分
eigenvalues
:特征值
https://www.jianshu.com/p/e94d02707f4a
https://docs.sympy.org/latest/tutorial/intro.html