我的 Python 代码使用 LUsolve()
函数求解线性方程组。
这速度相当快。但问题是,即使变量数量很少,打印解决方案也需要很长时间。
这是我写的代码。
from sympy import *
from tkinter.filedialog import asksaveasfilename
import tkinter as tk
from tkinter import *
from tkinter import simpledialog
root = tk.Tk()
root.withdraw()
file_name = asksaveasfilename()
root.withdraw()
niso=tk.simpledialog.askinteger("Value of Niso","Value of Niso:")
MM = Matrix( niso, 1, lambda i,j:var('MM_%s' % (i+1) ) )
MA = Matrix( niso, 1, lambda i,j:var('m_%s%s' % ('A', chr(66+i)) ) )
MX = Matrix( niso, 1, lambda i,j:var('m_%s%s' % (chr(66+i), 'A')) )
RB = Matrix( niso-1, 1, lambda i,j:var('R_%s%s' % ('A'+chr(66+i),i+2)) )
R = Matrix( niso, niso-1, lambda i,j:var('R_%s%d' % (chr(65+i) , j+2 )) )
K = Matrix( niso-1, 1, lambda i,j:var('K_%d' % (i+2) ) )
A = Matrix(niso-1,niso-1, lambda i,j:var('A_%d' % i))
b = Matrix(niso-1,1, lambda i,j:var('A_%d' % i))
for i in range(0,niso-1):
b[i,0]=MM[0,0]*(1/(MA[i,0]*(RB[i,0]-R[0,i]))-1/(MX[i,0]*(-RB[i,0]+R[i+1,i])) )
for j in range(0,niso-1):
A[i,j]=MM[j+1,0]*(R[0,j]/(MA[i,0]*(RB[i,0]-R[0,i]))-R[i+1,j]/(MX[i,0]*(-RB[i,0]+R[i+1,i])) )
X = ( A.LUsolve(b) )
with open(file_name, 'w') as logFile:
for i in range(0,niso-1):
print(K[i,0],'=',X[i],file=logFile)
<小时/>
主要问题是向量X
的元素由许多sympy
符号和print()
组成> 必须将它们转换为字符串。
有没有更快的方法来打印我的解决方案?
最佳答案
速度下降主要是由于 SymPy 试图对术语进行排序。您可以通过直接使用 sstr
函数和 order='none'
来禁用此功能。例如,对于我来说 niso = 5
,str(X)
(print
默认使用 str
)超过 1 秒,sstr(X, order='none')
需要 360 毫秒。
换句话说,使用print(K[i,0], '=', sstr(X[i], order='none'), file=logFile)
关于Python 更快地打印 sympy 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50802583/