Python против MATLAB в символьной интеграции

В питоне я пытался решить этот символический интеграл

t = symbols('t')
inte = sympy.Matrix( " long and complex expresion with many exp(t*numbers) in a matrix " )

Gam = sympy.integrate( inte , (t , 0 , 0.1 ) )
Gam = Gam.evalf()
Gam = np.array( Gam ) # to turn the expression into a numpy array

В Matlab я пытался решить одно и то же выражение

syms t
inter = eval( int( inte , t , 0 , 0.1 ) ) % to turn the expression into a  numerical array

Дело в том:

В Matlab я получил результат, который (до того, как он будет оценен в eval) содержит форму cos (t) внутри, и когда он будет оценен в eval, он дал мне массив только с действительными числами, также это правильный ответ в целом упражнение.

Но когда я делаю ту же задачу в python, я получаю выражение, которое не содержит символического результата с cos (t), вместо этого оно имеет много exp (I * t). Итак, когда я оцениваю результат, чтобы получить массив, у меня есть массив только с комплексными числами.

Из-за этого можно подумать, что Matlab лучше решает символические интегралы, чем Python.

Мой вопрос: есть ли способ достичь того же результата в python? Я отказываюсь верить, что невозможно получить тот же результат с помощью некоторых алгебраических манипуляций или, может быть, путем решения интеграла другим способом.

Конечно, я уже сделал обычное, упростил и расширил. Если вы хотите запустить код Python, он здесь.

t  =  symbols( 't ' )
init_printing(use_unicode=True)

tini = 0
tfin = 10
T    = 1e-1

time = np.array( np.arange( tini , tfin , T ) , ndmin=2 )

A = np.array([[-8, 1, 0, ],
              [-5, 0, 1, ],
              [-6, 0, 0, ]])
B = np.array([[0],
              [1],
              [0]])

V , R = np.linalg.eig(A) # Eigvalues in a vector, Matrix Diagonalizante

M = np.round( np.linalg.inv(R) @ A @ R , 4) # Diagonal Matrix

ExpA_t = np.diag( e**(V*t) )

R      = smp.Matrix(R)
B      = smp.Matrix(B)
ExpA_t = smp.Matrix(ExpA_t)

inte = ( R @ ExpA_t @ R**-1 ) @ B

Gam = integrate( inte , (t , tini , T) ) # here is the issue

Gam = np.array( Gam , dtype = complex ) 

Спасибо.


person VEBP    schedule 08.08.2020    source источник
comment
помните: e^(ix) = cos(x) + i sin(x)   -  person Natsfan    schedule 08.08.2020
comment
numpy и sympy не интегрированы. Было бы неплохо различать по именам переменные числовые numpy, объектные dtype numpy с символическими элементами (все, что связано с символом t) и чистые sympy выражения. Не смешивайте случайно numpy и sympy — делайте это только с явным намерением.   -  person hpaulj    schedule 08.08.2020
comment
R имеет комплексные значения, которые переносятся до конца.   -  person hpaulj    schedule 08.08.2020
comment
Да, но то же самое происходит и в Matlab, так что проблема не в матрице, а в процессе интеграции   -  person VEBP    schedule 08.08.2020


Ответы (1)


Решение состояло в том, чтобы добавить расширение к inte

расширить (инте)

person VEBP    schedule 09.08.2020