首页 > 解决方案 > 使用符号解决问题:*:“符号”和“平等”不支持的操作数类型

问题描述

我在使用解决方案时遇到问题。我正在尝试用符号数学求解,它适用于 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 个变量的符号。

标签: pythonequationsolversymbolic-math

解决方案


python 中的错误往往具有相当的描述性。提示您尝试对TypeError不支持它的对象类型执行某些操作,例如,将数字除以字符串。如果您遇到过这样的错误,请开始将违规行分解为较小的部分,然后打电话type()查看它产生的类型,直到找到错误的部分。然后你可以弄清楚为什么它不是你所期望的。

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

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

哪里a是符号。但是你这样做了

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则不会有任何问题。假设a,bc作为符号是正确的。这完全取决于您要表达的方程式。


您在第一个示例中实际上遇到了同样的问题,但它并没有表达出来,因为您没有对等式和符号进行任何数学运算。

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

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


推荐阅读