Sympy Eq()行为与Sympy general usag

2024-10-05 14:27:36 发布

您现在位置:Python中文网/ 问答频道 /正文

在sympys中,Eq(lhs,rhs)可以实例化一个方程。不过,我真的很好奇它的行为,想问一下这个等式是怎么回事 类型是要使用的!在

我要问的原因是,在Maple中,我们使用等式(lhs == rhs)作为标准工具。但是,我在sympy中看到过很多脚本使用x= y+z,其中x是一个python变量,因此只有表达式y+z才是sympy的实际数学。这将对以下示例产生影响:

MWE:

t = S('t')
f = Function('f')(t)
g = Function('g')(t)

equation = Eq(f,g+1)
equation2 = equation-1
equation3 = equation.diff(t)
equation4 = equation.subs(equation) # this I can do with subs(*equation.args)

以上所有这些都会产生意想不到的结果:第一个结果给出了一个括号中的等式-1,这真的很奇怪。这种区分只作用于左手侧,这在imho中是相当误导的。替换产生错误,只有注释行有效。最后一个对我来说还可以,因为我知道我可以让它工作。但是,对于1和2,除了手动执行所有操作之外,是否还有其他更有用的符号,例如:

^{pr2}$

相比之下,Maple可以在数学意义上替代、推导和添加方程(双方都需要解决)。在

我将很高兴有任何关于如何在sympy中“正常”工作的意见。目前看来,使用rhs表达式似乎只是一种方法,Eq是一个“附带项目”。谢谢你在这个问题上的每一个意见!在


Tags: 实例表达式function数学意见eqsubs方程
1条回答
网友
1楼 · 发布于 2024-10-05 14:27:36

isympy会话中:

In [3]: t = S('t') 
   ...: f = Function('f')(t) 
   ...: g = Function('g')(t)                                                         

In [4]: equation = Eq(f, g+1)                                                        

In [5]: equation                                                                     
Out[5]: f(t) = g(t) + 1

type(equation)sympy.core.relational.Equality。在

Out[5]中的=In[4]行中的python=无关。在

^{pr2}$

这里的type是不同的:sympy.core.add.Add

In [8]: equation3 = equation.diff(t)                                                 

In [9]: equation3                                                                    
Out[9]: 
d                  
──(f(t) = g(t) + 1)
dt                 

这是一个sympy.core.function.Derivative。它看起来像是一个未赋值的导数,应用于整个equation对象。在

subs表达式中的错误只是subs的误用。为什么要使用equation作为方法的参数?在

In [10]: equation4 = equation.subs(equation)                                         
                                     -
ValueError                                Traceback (most recent call last)
<ipython-input-10-b6a4334b7078> in <module>
  > 1 equation4 = equation.subs(equation)

/usr/local/lib/python3.6/dist-packages/sympy/core/basic.py in subs(self, *args, **kwargs)
    865                    When a single argument is passed to subs
    866                    it should be a dictionary of old: new pairs or an iterable
 > 867                    of (old, new) tuples."""))
    868         elif len(args) == 2:
    869             sequence = [args]

ValueError: 
When a single argument is passed to subs it should be a dictionary of
old: new pairs or an iterable of (old, new) tuples.

正确使用subs

In [15]: equation4 = equation.subs([(t,t*2)])                                        

In [16]: equation4                                                                   
Out[16]: f(2⋅t) = g(2⋅t) + 1

===

Eq的引用:

https://docs.sympy.org/latest/modules/core.html?highlight=eq#sympy.core.relational.Equality

我仍在努力研究sympy文档,但在我看来,Eq并不像通常的代数意义上创建{}。它更像是两个对象之间的测试,评估结果为真或假,或保持未评估。在

通过将f替换为g,我们得到了可以计算的关系:

In [26]: equation.subs([(f,g)])    # or subs(f,g)                                                  
Out[26]: False

equation2equation3中的相同子元素会产生错误(无法添加数字和False)或{}的导数。也就是说,替换在equation部分完成,求值为False,表达式的重置起作用(或不起作用)。在

使用*equation.args符合以下模式:

In [43]: equation.args                                                               
Out[43]: (f(t), g(t) + 1)

In [44]: equation.subs(*equation.args)                                               
Out[44]: True

===

https://docs.sympy.org/latest/gotchas.html 建议Eq(x,y)的替代方案是x-y

In [31]: eq1 = f - (g+1)                                                             

In [32]: eq1-1                                                                       
Out[32]: f(t) - g(t) - 2

In [33]: eq1.diff(t)                                                                 
Out[33]: 
d          d       
──(f(t)) - ──(g(t))
dt         dt      

In [41]: equation.subs([(f,g)])                                                      
Out[41]: False

In [42]: equation.subs([(f,g+1)])                                                    
Out[42]: True

相关问题 更多 >