参考链接: Python 变量 |表达式 |条件和函数
有时候我们会遇到一些很复杂的表达式,或者想要求解某个表达式,但是手动计算的话不但耗时还费精力,我们能不能利用计算机来帮助我们进行计算呢?
1、问题描述
我们昨天提出了四足机器人的初始姿态的问题,里面给出了很多公式,例如下面这条。:
α
=
arccos
(
l
1
2
+
L
2
−
l
2
2
2
l
1
L
)
\begin{matrix} \alpha =& \arccos{\left(\frac{l_1^2 + L^2 -l_2^2}{2l_1L} \right)}\\ \\ \end{matrix}
α=arccos(2l1Ll12+L2−l22)
如果我们想要知道
L
L
L关于
α
\alpha
α的表达式,可能得经过一系列化简才能得出答案,这时候我们可以借助强大的计算机来帮我们实现这些运算,最终得出答案:
L
=
l
1
cos
(
α
)
+
−
l
1
2
sin
2
(
α
)
+
l
2
2
L =l_1 \cos{\left(\alpha \right)} + \sqrt{- l_1^{2} \sin^{2}{\left(\alpha \right)} + l_{2}^{2}}
L=l1cos(α)+−l12sin2(α)+l22
这个关于
L
L
L的表达式一看就很复杂,是作者手算出来的吗?当然不是,我是利用smypy这个库计算出来的表达式。
sympy是一个Python的科学计算库,用一套强大的符号计算体系完成诸如多项式求值、求极限、解方程、求积分、微分方程、级数展开、矩阵运算等等计算问题
2、代码
这里直接给出代码
from sympy import *
import numpy as np
# 定义我们的符号
l1 = symbols('11')
l2 = symbols('l2')
L = symbols('L')
a = symbols('a')
# 定义等式,右边要等于0
eq = cos(a) - (l1**2 + L**2 - l2**2)/(2*l1*L)
# 求解
result = solve(eq, L)
# 打印结果
print('L:', result)
# 将结果转化成latex格式
print(latex(result))
输出如下,因为是二次函数,所以这里会给出两个解,实际上只有一个是符合实际情况的。
L: [11*cos(a) - sqrt(-11**2*sin(a)**2 + l2**2), 11*cos(a) + sqrt(-11**2*sin(a)**2 + l2**2)]
\left[ 11 \cos{\left(a \right)} - \sqrt{- 11^{2} \sin^{2}{\left(a \right)} + l_{2}^{2}}, \ 11 \cos{\left(a \right)} + \sqrt{- 11^{2} \sin^{2}{\left(a \right)} + l_{2}^{2}}\right]
solve()函数第一个参数是一个方程式(等于零),第二个参数是想要求解的符号。
3、求解一般代数方程
from sympy.solvers import solve
from sympy import Symbol
x = Symbol('x')
result = solve(x**2 - 1, x)
[-1, 1]
更多使用方法可以参考官方文档
如果觉得ok,点个赞,点个关注,也欢迎给个打赏支持一下编者的工作