2016-11-22 19 views
1

我目前正在研究涉及矩阵的sympy符号表达式。 我想知道是否有可能将一个这样的矩阵乘以另一个符号。换句话说,我想矩阵Bn_Ksi的所有行下面由gN 乘这是我想尝试与我们如何将一个Sympy符号矩阵的所有条目乘以另一个符号?

B_Ksi = (1/H_KsiKSi) * (Bt + gN * Bn_Ksi) 

的问题来自:

ipdb> gN * Bn_Ksi 
    *** TypeError: can't multiply sequence by non-int of type 'Symbol' 

我使用MUL也尝试并获得:

ipdb> gN.__mul__(Bn_Ksi[1]) 
    NotImplemented 

这里是我的C部分允许得到错误:

from sympy import * 


x, y , Alpha, Ksi = symbols("x y Alpha Ksi") 
x1x, x1y, x2x, x2y, x3x, x3y = symbols("x1x x1y x2x x2y x3x x3y") 

N, nx, ny = symbols("N nx ny") 

# gap function and penalty stiffness 
gN, kpenN = symbols("gN, kpenN") 



S = Matrix([x, y]) 
x1 = Matrix([x1x, x1y]) 
x2 = Matrix([x2x, x2y]) 
x3 = Matrix([x3x, x3y]) 

N = Matrix([nx, ny]) 


# control points 
b0 = x2 + 0.5 * (x1 - x2) 
#b3 
b3 = x2 + 0.5 * (x3 - x2) 
#b1 
b1 = b0 + (x2- b0) * Alpha 
#b2 
b2 = x2 + (b3 - x2) * (1 - Alpha) 



# Berstein polynomials 
# B1 
B0 = (1./8.) * ((1 - Ksi)**3) 
# B1 
B1 = (3./8.) * (1 - Ksi)**2 * (1 + Ksi) 
# B3 
B2 = (3./8.) * (1 - Ksi) * (1 + Ksi)**2 
#B4 
B3 = (1./8.) *(1 + Ksi)**3 

# Berstein polynomials first order derivative 
B0_Ksi = diff(B0, Ksi) 
B1_Ksi = diff(B1, Ksi) 
B2_Ksi = diff(B2, Ksi) 
B3_Ksi = diff(B3, Ksi) 


x_interp = b0 * B0 + b1 * B1 + b2 * B2 + b3 * B3 


# first order derivative 
x_Ksi = diff(x_interp, Ksi) 
#second order derivative 
x_KsiKsi = diff(x_interp, Ksi, 2) 


Bn = Matrix([N, -B0 * N, -B1 * N, -B2 * N, -B3 * N]) 

Bn_Ksi = Matrix([0, B0_Ksi * N, B1_Ksi * N, B2_Ksi * N, B3_Ksi * N]) 

Bt  = Matrix([x_Ksi, -B0_Ksi * x_Ksi, B1_Ksi * x_Ksi, B2_Ksi * x_Ksi, B3_Ksi * x_Ksi]) 


H_KsiKSi = x_Ksi.dot(x_Ksi) - gN * N.dot(x_KsiKsi) 

B_Ksi = (1/H_KsiKSi) * (Bt + gN * Bn_Ksi) 

我是sympy和Python的初学者,所以我希望答案不是毫无意义的。 在此先感谢您的帮助

+0

您发布的代码并未在任何地方定义“Bn_Ksi”。 – user2357112

+0

对不起,我试图简化代码时犯了一些错误 – MarcoMag

+1

错误是由于'Bn_Ksi'的定义中的第一个元素是一个标量('0'),而所有其他元素都是矩阵。提供适当尺寸的“零”矩阵而不是“0”。 – Stelios

回答

1

矩阵Bn_Ksk的元素是矩阵。 SymPy Matrix对象旨在用于保存标量,而不是其他矩阵。您应该将矩阵平坦化以包含标量,或者如果需要块矩阵(矩阵矩阵),则使用sympy.BlockMatrix

相关问题