使用 sybols 解决问题:不支持的操作数类型 *:"符号"和"相等"



我在使用solve时遇到问题。我试图用合成数学来解决问题,它对2个方程和2个变量都很好,请参阅第一个输入和输出。

当我用4个方程和4个变量求解时,我得到了第二个输入中显示的误差。

输入:用于2个方程式和2个变量

from sympy import *
import numpy as np
import math
import matplotlib.pyplot as plt
import scipy.linalg as la
a, a0, a1, a2, a3 = symbols('a, a_0, a_1, a_2, a_3')
b, b0, b1, b2, b3 = symbols('b, b_0, b_1, b_2, b_3')
u1, u2 = symbols('u_1, u_2')
a = Eq(0,a0+a1*0+a2*0+a3*0*0)
b = Eq(0,a0+a1*0+a2*b+a3*0*b)
sol = solve((a, b),(a0,a2))
pprint(sol)

输出

{a₀: 0, a₂: 0}

输入:对于4个方程式4个变量

from sympy import *
import numpy as np
import math
import matplotlib.pyplot as plt
import scipy.linalg as la
a, a0, a1, a2, a3 = symbols('a, a_0, a_1, a_2, a_3')
b, b0, b1, b2, b3 = symbols('b, b_0, b_1, b_2, b_3')
u1, u2 = symbols('u_1, u_2')
a = Eq(0,a0+a1*0+a2*0+a3*0*0)
b = Eq(0,a0+a1*0+a2*b+a3*0*b)
c = Eq(u1,a0+a1*a+a2*0+a3*a*0)
sol = solve((a,b,c),(a0,a1,a2))

输出

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-268-eb18268f41f0> in <module>
6 a = Eq(0,a0+a1*0+a2*0+a3*0*0)
7 b = Eq(0,a0+a1*0+a2*b+a3*0*b)
----> 8 c = Eq(u1,a0+a1*a+a2*0+a3*a*0)
9 d = Eq(u2,a+0+a1*a+a2*b+a3*a*b)
10 
TypeError: unsupported operand type(s) for *: 'Symbol' and 'Equality'

我无法理解这个错误消息,我的意思是,我在带有2个变量的版本中也使用了符号。

python中的错误往往是描述性的。TypeError提示您试图对不支持它的对象类型执行某些操作,例如,将数字除以字符串。如果你遇到一个有这样错误的headcratcher,请开始将有问题的行分解为更小的部分,并调用type()来查看它产生的类型,直到你找到错误的类型。然后你就可以弄清楚为什么它不是你所期望的。

在这种情况下,错误表明不能将符号和等式相乘。你从这条线开始

a, a0, a1, a2, a3 = symbols('a, a_0, a_1, a_2, a_3')

其中CCD_ 3是符号。但是你做

a = Eq(0,a0+a1*0+a2*0+a3*0*0)

并且您已经将a重新分配给了一个等式。因此,当到了在下面的行中执行a1*a的时候

c = Eq(u1,a0+a1*a+a2*0+a3*a*0)

你会得到上面提到的错误。如果您将等式分配给其他对象,例如ABC,则不会有任何问题。假设abc作为符号是正确的。这完全取决于你想要表达的方程式。


在第一个例子中,你确实遇到了同样的问题,但它并没有表现出来,因为你没有用等式和符号进行任何数学运算。

b = Eq(0,a0+a1*0+a2*b+a3*0*b)

它之所以有效,是因为你首先计算RHS,然后将结果分配给LHS。所以等式中的b仍然是指一个符号,并且该表达式是合法的。但是,在重新分配了变量b之后,就不能再将其用作符号了。

最新更新