【问题标题】:Get sympy to pprint sin(a_n) with s(a_n)同情 pprint sin(a_n) 和 s(a_n)
【发布时间】:2021-02-18 22:24:07
【问题描述】:

为了节省空间,我正在尝试使用带有第一个字母而不是缩写词的三角函数来对 pprint 矩阵表示同情。所以 sin(a_1) 看起来像 sa_1。现在我正在打印到文本然后运行查找和替换。 (我是编程新手。)到目前为止,这是行不通的:

from sympy import sin as s
from sympy import cos as c

# declaring symbolic variables:
sin, cos, = sym.symbols('s, c')

  #An example Matrix
  T = Matrix([[c(theta), -s(theta), 0, a],
                [s(theta) * c(alpha), c(theta) * c(alpha), -s(alpha), -s(alpha) * d],
                [s(theta) * s(alpha), c(theta) * s(alpha), c(alpha), c(alpha) * d],
                [0, 0, 0, 1]])
#T04 was a sympy symbol matrix solution 
T_000 = str(print_latex(T04))
T_000 = str(T04)
T_000 = T_000.replace('sin', 's')
T_000 = T_000.replace('cos', 'c')
print('T000\n')
pprint(T_000)
T_001 = Matrix([[(-s(theta_1) * s(theta_2) + c(theta_1) * c(theta_2)) * c(theta_3) + (
            -s(theta_1) * c(theta_2) - s(theta_2) * c(theta_1)) * s(theta_3),
                 -(-s(theta_1) * s(theta_2) + c(theta_1) * c(theta_2)) * s(theta_3) + (
                             -s(theta_1) * c(theta_2) - s(theta_2) * c(theta_1)) * c(theta_3), 0,
                 L_1 * c(theta_1) + L_2 * (-s(theta_1) * s(theta_2) + c(theta_1) * c(theta_2))], [
                    (-s(theta_1) * s(theta_2) + c(theta_1) * c(theta_2)) * s(theta_3) + (
                                s(theta_1) * c(theta_2) + s(theta_2) * c(theta_1)) * c(theta_3),
                    (-s(theta_1) * s(theta_2) + c(theta_1) * c(theta_2)) * c(theta_3) - (
                                s(theta_1) * c(theta_2) + s(theta_2) * c(theta_1)) * s(theta_3), 0,
                    L_1 * s(theta_1) + L_2 * (s(theta_1) * c(theta_2)
                                              + s(theta_2) * c(theta_1))], [0, 0, 1, d_4], [0, 0, 0, 1]])
print('\nT001\n')
pprint(T_001)

T_000.replace(sin, s)
print('T000\n', T_000)

它总是以完整的“sin”和“cos”名称打印。

【问题讨论】:

    标签: python-3.x sympy symbols trigonometry pprint


    【解决方案1】:

    有两种常用的方法来替换表达式中的函数(在这种情况下,表达式是矩阵T)。一种是使用replace函数,另一种是使用subs函数。两者中的任何一个都可以用于实现将 sin/cos 替换为其他函数的相同目标。

    在下面的代码中,我们将函数 s(它是 sin 的别名)替换为未定义的函数 s1(其符号名称为 s)。 cc1 也是如此。

    from sympy import *
    
    # s,c act as aliases to sin,cos
    s = sin
    c = cos
    
    # the intended short-hand functions used to replace sin/cos later on
    s1 = Function('s')
    c1 = Function('c')
    
    a,d,theta,alpha = symbols('a d \\theta \\alpha')
    
    T = Matrix([
        [c(theta), -s(theta), 0, a],
        [s(theta) * c(alpha), c(theta) * c(alpha), -s(alpha), -s(alpha) * d],
        [s(theta) * s(alpha), c(theta) * s(alpha), c(alpha), c(alpha) * d],
        [0, 0, 0, 1]
    ])
    
    T_1 = T.replace(s,s1).replace(c,c1)
    T_2 = T.subs({s:s1,c:c1})
    
    display(T_1)
    display(T_2)
    

    输出:

    本文中使用的代码是also available here

    【讨论】:

    • 抱歉回复晚了!谢谢!我替换错误并且没有使用额外的变量来描述函数。耶!
    • 我也没有意识到你可以用 *.这很有帮助。谢谢!但是您是如何使用“显示”功能的呢?我更改为 from sympy import * 并且它给了我一个返回错误“'display' not defined
    • @Manju display 函数可用,因为我在 Jupyter 笔记本中运行了所有这些。使用 SymPy 时,Jupyter 可以有利于快速迭代。关于对display的调用,也可以换成printprinting in SymPy here有更详细的讨论。
    • 啊,好吧,我正在使用 pycharm。谢谢!!! **正如以后可能会这样做的人的说明:替换函数也会删除求解能力,例如,如果稍后将 x 替换为例如 pi,则 sin(x) 将不再求解 sin(x)。因此,仅出于打印目的,将 s1 函数替换为单独的“仅用于打印”矩阵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多