Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用矩阵代替辛中的标量_Python_Sympy - Fatal编程技术网

Python 用矩阵代替辛中的标量

Python 用矩阵代替辛中的标量,python,sympy,Python,Sympy,以下是我在一个研讨会上所做的: from sympy import * xi1,xi2,xi3 = symbols('xi_1,xi_2,xi_3') N1 = 1-xi1-xi2-xi3 N2 = xi3 N3 = xi1 N4 = xi2 x1,x2,x3,x4 = symbols('x_1, x_2, x_3, x_4') x = N1*x1+N2*x2+N3*x3+N2*x4 subdict = {x1:Matrix([0.025,1.0,0.0]), x2 : Matrix([0,1,

以下是我在一个研讨会上所做的:

from sympy import *
xi1,xi2,xi3 = symbols('xi_1,xi_2,xi_3')
N1 = 1-xi1-xi2-xi3
N2 = xi3
N3 = xi1
N4 = xi2
x1,x2,x3,x4 = symbols('x_1, x_2, x_3, x_4')
x = N1*x1+N2*x2+N3*x3+N2*x4
subdict = {x1:Matrix([0.025,1.0,0.0]), x2 : Matrix([0,1,0]), x3:Matrix([0, 0.975, 0]), x4:Matrix([0,0.975,0.025])}
x.subs(subdict)
test.subs({xi1:1, xi2:0,xi3:0})
对我来说,我们只是将一些标量与一些向量相乘,然后将它们相加。然而,SymPy不同意并抛出一个巨大错误,最后一行是:

TypeError: cannot add <class 'sympy.matrices.immutable.ImmutableDenseMatrix'> and <class 'sympy.core.numbers.Zero'>
TypeError:无法添加和

为什么这是一个问题?我正在尝试做什么有解决办法吗?

我怀疑发生的事情是,在矩阵被替换之前,您将替换一个0,使
0*矩阵_usymbol=0
而不是0的矩阵。不能将最终成为矩阵的项添加到0,从而导致错误。我尝试使用
同步
标志或xreplace代替subs,得到了相同的结果(在sympy.live.org上)。然后,我尝试以相反的顺序进行替换,首先将它们作为列表与矩阵一起传递。还是不行。看起来subs假设
0*foo
为0。如果尚未存在问题,则应在上提出问题

解决方法是首先进行标量替换,允许零项消失。然后用矩阵做一个subs。因此,这将需要2次调用subs

使用0进行替换的一个真正的黑客解决方法是:

def remul(m):
  rv = 1
  for i in m.args:
    rv *= i
  return rv

expr = x*y
mat = expr.subs(x, randMatrix(2)) # replace x with matrix
expr = mat.replace( # replace y with scalar 0
    lambda m: m.is_Mul,
    lambda m: remul(Mul(*[i.subs(y, 0) for i in m.args], evaluate=False)))

问题似乎不限于0。。。下面是一个最小的例子,它抛出了与SymPy 1.1.1中描述的OP相同的错误:
x,y=symbols('xy')
then
(x+y).subs({x:Matrix([1,2]),y:Matrix([3,4])
我在SymPy.live.org上得到了一个不同的错误,但将使用当前版本进行调查并报告。谢谢提醒。这些错误都与Mul(@32882的问题)和Add(@Michelle的问题)的展平例程中的问题有关。我已经打开了一个修复这些问题的PR。但是,替换仍然依赖于顺序,因此如果(修复后)希望将结果保留为矩阵,则需要使用
synchronous=True
。对于非Symphy开发人员,我们有简单的解决方案吗?这是一个简单的标量时间向量的例子……您下载了最新版本的Symphy并尝试了一下吗?