Python печатает симпли матрицу быстрее - PullRequest
0 голосов
/ 11 июня 2018

Мой код 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()должен преобразовать их в строки.

Есть ли более быстрый способ напечатать мое решение?

1 Ответ

0 голосов
/ 13 июня 2018

Замедление скорости происходит главным образом из-за того, что 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)

...