使用Sympy转换4个边界条件方程为矩阵时第4行输出错误,求协助
搞定Sympy边界条件矩阵第四行不符预期的问题
嘿,我看了你的代码、当前输出和期望结果,马上就发现问题啦——Sympy的linear_eq_to_matrix默认会自动简化方程,把你第四个边界条件里的k²给消掉了,所以才和你想要的不一样。
为啥会出现这个问题?
先捋捋你的第四个边界条件:
原函数的二阶导数是:
fnc.diff(z,2) = -C*k²*sin(k*z) - D*k²*cos(k*z)
代入z=L后得到的方程是-C*k²*sin(kL) - D*k²*cos(kL) = 0。Sympy默认会自动简化这个方程,两边同时除以-k²(默认假设k≠0),就变成了C*sin(kL) + D*cos(kL) = 0,所以矩阵第四行的系数就没了k²,和你期望的形式不符。
两种修正办法任你选
办法一:手动构造方程,保留原始系数
你可以直接把二阶导数的结果原封不动地放进方程里,不让Sympy偷偷简化:
from sympy import linear_eq_to_matrix, symbols, sin, cos, Eq, pprint A, B, C, D, z, L, k = symbols('A, B, C, D, z, L, k') fnc = A + B*z + C*sin(k*z) + D*cos(k*z) # 定义四个边界条件 bc1 = Eq(0, fnc.subs(z, 0)) bc2 = Eq(0, fnc.subs(z, L)) bc3 = Eq(0, fnc.diff(z, 2).subs(z, 0)) # 手动提取二阶导数在z=L处的结果,直接构造方程,不简化 second_deriv_at_L = fnc.diff(z, 2).subs(z, L) bc4 = Eq(second_deriv_at_L, 0) # 生成矩阵 a, b = linear_eq_to_matrix([bc1, bc2, bc3, bc4], [A, B, C, D]) # 打印验证 pprint(bc1) pprint(bc2) pprint(bc3) pprint(bc4) pprint(a)
办法二:关闭自动简化功能
如果你用的是较新版本的Sympy,可以直接在linear_eq_to_matrix里加个参数,禁用自动简化:
# 其他代码不变,生成矩阵时加上auto_simplify=False a, b = linear_eq_to_matrix([bc1, bc2, bc3, bc4], [A, B, C, D], auto_simplify=False)
结果验证
修正之后,矩阵的第四行就会变成[0, 0, -k² sin(kL), -k² cos(kL)],和你期望的输出完全一致啦~如果想要调整符号,只需要把bc4改成Eq(-second_deriv_at_L, 0)就行。
内容的提问来源于stack exchange,提问作者m4s
相关产品推荐
相关产品推荐

