python - 使用符号解决问题:*:“符号”和“平等”不支持的操作数类型
问题描述
我在使用解决方案时遇到问题。我正在尝试用符号数学求解,它适用于 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
不支持它的对象类型执行某些操作,例如,将数字除以字符串。如果您遇到过这样的错误,请开始将违规行分解为较小的部分,然后打电话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)
你得到上面提到的错误。如果将等式分配给其他事物,例如 、A
和B
,C
则不会有任何问题。假设a
,b
和c
作为符号是正确的。这完全取决于您要表达的方程式。
您在第一个示例中实际上遇到了同样的问题,但它并没有表达出来,因为您没有对等式和符号进行任何数学运算。
b = Eq(0,a0+a1*0+a2*b+a3*0*b)
它起作用的原因是因为您首先计算 RHS,然后将其结果分配给 LHS。所以b
等式中的 the 仍然指代一个符号并且该表达式是合法的。但是在b
重新分配变量后,您不能再将其用作符号。
推荐阅读
- go - 具有范围钳位的 typedef
- node.js - 为 JWT NodeJS Lambda 生成足够的密钥
- java - 如何解析带有负数和减号的算术字符串表达式?
- python-3.x - 将系列转换为季度数据
- c# - 如何在 .NET Core 上注册新的 NuGet 包源?
- javascript - 车把在通过身份验证时没有变化
- html - 为什么当元素包裹在另一个元素中时位置:粘性不起作用?
- eclipse - 如何消除 Maven ear build 中的库?
- javascript - 在按钮单击时显示内容然后隐藏该按钮
- c++ - 在没有未定义行为的情况下实现类似 std::vector 的容器