我在使用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)
你会得到上面提到的错误。如果您将等式分配给其他对象,例如A
、B
和C
,则不会有任何问题。假设a
、b
和c
作为符号是正确的。这完全取决于你想要表达的方程式。
在第一个例子中,你确实遇到了同样的问题,但它并没有表现出来,因为你没有用等式和符号进行任何数学运算。
b = Eq(0,a0+a1*0+a2*b+a3*0*b)
它之所以有效,是因为你首先计算RHS,然后将结果分配给LHS。所以等式中的b
仍然是指一个符号,并且该表达式是合法的。但是,在重新分配了变量b
之后,就不能再将其用作符号了。