在sympys Eq(lhs,rhs)中,可以实例化方程式。但是我真的很想知道它的行为,想问一下这个方程
类型旨在使用!

我问的原因是在Maple中,人们使用方程式(lhs == rhs)作为标准工具。但是,我已经看到许多使用x= y+z的sympy脚本,其中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,这确实很奇怪。区别只作用于lhs,这是非常误导的恕我直言。替换产生错误,仅注释行有效。这最后一个对我来说还可以,因为我知道我可以使它工作。但是,除了手动完成所有操作外,还有其他1和2有用的符号,例如:

eq2 = Eq( equation.lhs.difft(t), equation.rhs.diff(t) )


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

对于在sympy中如何“正确”工作的任何投入,我将感到高兴。就目前而言,似乎只使用rhs-expressions是可行的方法,Eq是一个“ sideproject”。感谢您对此的每一项投入!

最佳答案

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]=行中的python In[4]不相关。

In [6]: equation2 = equation-1

In [7]: equation2
Out[7]: -1 + (f(t) = g(t) + 1)


这里的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在通常的代数意义上创建equation一样。它更像是两个对象之间的测试,评估结果为True或False,或者保持未评估状态。

通过将f替换为g,我们可以获得可以评估的关系:

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


equation2equation3中的相同子项会产生错误(无法添加数字和False)或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

关于python - Sympy Eq()行为和Sympy一般用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55900497/

10-15 08:49