如何使用 SymPy 求解矩阵系统

问题描述 投票:0回答:1
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]])
python scipy sympy
1个回答
0
投票

正如评论中提到的,您不应将符号库(例如 sympy)与数字库(例如 numpy 和 scipy)混合使用,因为它们的数据类型不兼容。 (您真正切换的唯一时间是当您有意从符号转换为数字时,例如使用

sympy.lambdify
时。)

由于您有

ke
f
的 sympy 矩阵,您可以根据 文档求解系统:

u = ke.solve(f)

我不确定你问题中的最后一个矩阵是否是

ke
矩阵,但如果是,那么你将无法解决这个问题,因为该矩阵的行列式是0。但这是一个线性代数问题,不是同情问题。

© www.soinside.com 2019 - 2024. All rights reserved.