sympy:收集矩阵系数的符号?

3

我正在尝试将一个表达式分解,并将系数分离成矩阵形式,如下所示:

Generic

这与将sympy表达式因式分解为矩阵系数密切相关,其中使用Wild符号和match(form)来确定其矩阵形式的系数。然而,我无法让match(form)方法对以下内容起作用。

为什么match(form)方法会失败?

有哪些干净的替代方案可以实现这一目标?

#Linear Interpolation function: V(x)
v_1, theta_1, v_2, theta_2, x, L = symbols("v_1, theta_1, v_2, theta_2, x, L")
a_1, a_2, a_3, a_4 = symbols("a_1, a_2, a_3, a_4", real=True)
V = a_1*x**0 + a_2*x**1 + a_3*x**2 + a_4*x**3
#Solve for coefficients (a_1, a_2, a_3, a_4) with BC's: V(x) @ x=0, x=L
shape_coeffs = solve([Eq(v_1, V.subs({x:0})), 
                      Eq(theta_1, V.diff(x).subs({x:0})), 
                      Eq(v_2, V.subs({x:L})), 
                      Eq(theta_2, V.diff(x).subs({x:L}))], 
                     (a_1, a_2, a_3, a_4))
V = V.subs(shape_coeffs)
#Factor to matrix
V = sympy.collect(sympy.expand(V), (v_1, theta_1, v_2, theta_2))

设置

收集术语,直到矩阵形式变得明显。为了匹配表格:

C_1, C_2, C_3, C_4 = symbols("C_1, C_2, C_3, C_4", cls=Wild)
form = c_1*v_1 + c_2*theta_1 + c_3*v_2 + c_4*theta_2
mat_coeffs = V.match(form)
N = Matrix([C_1, C_2, C_3, C_4]).transpose()
N = N.subs(mat_coeffs)
v = Matrix([v_1, theta_1, v_2, theta_2])

Desired

与参考问题不同的是,V.match(form)返回None而不是包含{C_1:f(x), C_2:f(x), C_3:f(x), C_4:f(x)}dict()。为什么会失败?通过检查,答案很明显。

1个回答

2

由于collect(expand(V),...)已经将V表示为变量v_1,theta_1,v_2,theta_2的线性多项式,所以可以使用V.coeff方法直接获取系数,而不是使用V.match(form)

N = sy.Matrix([V.coeff(v) for v in (v_1, theta_1, v_2, theta_2)]).transpose()

import sympy as sy
#Linear Interpolation function: V(x)
v_1, theta_1, v_2, theta_2, x, L = sy.symbols(
    "v_1, theta_1, v_2, theta_2, x, L")
a_1, a_2, a_3, a_4 = sy.symbols("a_1, a_2, a_3, a_4", real=True)
V = a_1*x**0 + a_2*x**1 + a_3*x**2 + a_4*x**3
#Solve for coefficients (a_1, a_2, a_3, a_4) with BC's: V(x) @ x=0, x=L
shape_coeffs = sy.solve([sy.Eq(v_1, V.subs({x:0})), 
                      sy.Eq(theta_1, V.diff(x).subs({x:0})), 
                      sy.Eq(v_2, V.subs({x:L})), 
                      sy.Eq(theta_2, V.diff(x).subs({x:L}))], 
                     (a_1, a_2, a_3, a_4))
V = V.subs(shape_coeffs)
V = sy.collect(sy.expand(V), (v_1, theta_1, v_2, theta_2))
N = sy.Matrix([V.coeff(v) for v in (v_1, theta_1, v_2, theta_2)]).transpose()
print(N)

产量
Matrix([[1 - 3*x**2/L**2 + 2*x**3/L**3, x - 2*x**2/L + x**3/L**2, 3*x**2/L**2 - 2*x**3/L**3, -x**2/L + x**3/L**2]])

优秀的解决方案:我之前使用了.coeff()方法,但是没有你的列表推导式那么简洁。.coeff()似乎对于所有情况都很稳定。不过,你有猜测为什么.match(form)会失败吗?两种方法有什么优劣之处吗?再次感谢。 - OnStrike
抱歉,我不熟悉如何实现.match(form)。找到多项式的系数有一种确定性(保证成功)的算法。模式匹配是一个更加开放的问题。因此,如果一个问题可以采用这两种方法,只要V可以表示为vtheta变量的多项式,我肯定会选择使用.coeff() - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接