import sys
import os
sys.path.append(os.getcwd())
import sympy as sp
import numpy as np
from includes.Truss import Truss
U = sp.Matrix([[0,0],[0,10]])
boundary_conditions=[]
boundary_conditions.append([0])
boundary_conditions.append([''])
truss = Truss(U,boundary_conditions,30000000,2.0,10.0,2)
ke = truss.ke(10.0)
f = sp.Matrix([[0,-100.0]])
u = np.linalg.solve(ke,f)
ux = u[0]
uy = u[1]
print(f'ux = {ux}, uy = {uy}')
我有一个 2x2 SymPy 矩阵 ke。我需要求解系统 keu=f(f 已给出......)。 u 是 ux 和 uy 的占位符,它们是要求解的未知位移量。此时我已经尝试了所有不同的方法,但仍无法解决 keu=f 的 ux,uy 问题。目前的问题是:
Traceback (most recent call last):
File "c:\Users\famatto\OneDrive\Documents\birnic\test\trussexample002.py", line 19, in <module>
u = np.linalg.solve(ke,f)
^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\famatto\OneDrive\Documents\birnic\.venv\Lib\site-packages\numpy\linalg\linalg.py", line 409, in solve
r = gufunc(a, b, signature=signature, extobj=extobj)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
numpy.core._exceptions._UFuncInputCastingError: Cannot cast ufunc 'solve' input 0 from dtype('O') to dtype('float64') with casting rule 'same_kind'
PS C:\Users\famatto\OneDrive\Documents\birnic>
有没有办法通过 SymPy、numpy 或任何可能的方式从 python 中获得 ux,uy 的解决方案,对我来说都可以。我真的很想看到 ux 和 uy 的浮点值开始出现......
这就是 ke 的样子:
Matrix([[5000000.00000000, -5000000.00000000], [-5000000.00000000, 5000000.00000000]])
正如评论中提到的,您不应将符号库(例如 sympy)与数字库(例如 numpy 和 scipy)混合使用,因为它们的数据类型不兼容。 (您真正切换的唯一时间是当您有意从符号转换为数字时,例如使用
sympy.lambdify
时。)
由于您有
ke
和 f
的 sympy 矩阵,您可以根据 文档求解系统:
u = ke.solve(f)
我不确定你问题中的最后一个矩阵是否是
ke
矩阵,但如果是,那么你将无法解决这个问题,因为该矩阵的行列式是0。但这是一个线性代数问题,不是同情问题。