что это за ошибка: объект 'matrix' не имеет атрибута 'diff'

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

import math
import numpy as np
from sympy import *
from sympy import diff
import sympy as sp

p=np.matrix([[0],[0],[0],[1]])
pdash=p
zi=Matrix(2, 1, lambda i,j: Symbol('z%d' % (i+1)))
xi=Matrix(2, 1, lambda i,j: Symbol('x%d' % (i+1)))
alphai=Matrix(2,1, lambda i,j: Symbol('a%d' % (i+1)))
thetai=Matrix(2,1, lambda i,j: Symbol('t%d' % (i+1)))
transformed=np.matrix([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1]]) 
def transformation_fn(zi,xi,thetai,alphai):
    ca=cos((alphai))
    sa=sin((alphai))
    ct=cos((thetai))
    st=sin((thetai))
    transformation=np.matrix([[ct,-st*ca,st*sa,xi*ct],
                               [st,ct*ca,-ct*sa,xi*st],
                               [0,sa,ca,zi],
                               [0,0,0,1]])
    return transformation

for z,x,t,a in zip(zi,xi,thetai,alphai):
    transformed=transformed*transformation_fn(z,x,t,a)
e=transformed*p
jacobian=e.diff(t1)
print jacobian

Я также пробовал с образцом кода, работает ли diff () или нет, в этом случае import math import numpy as np from sympy import * from sympy import diff import sympy as sp

x, y, e1 = symbols('x y e1')
e=Matrix(2,1,lambda i,j:Symbol('e%d'%(i+1)))
I=np.matrix([[1 ,0 ],
             [0 ,1 ]])
k=I*e
print k.diff(e1)

person Yoyo    schedule 03.06.2016    source источник
comment
Это просто означает, что не существует метода члена с именем diff() для объекта matrix. Ясно, что нельзя делать matrix_object.diff()   -  person gaganso    schedule 03.06.2016
comment
Извините, вы хотите jacobian = np.diff(e, t1)? docs.scipy.org/doc/numpy- 1.10.0 / ссылка / сгенерировано /   -  person EdChum    schedule 03.06.2016
comment
@SilentMonk, спасибо, но могу ли я как-нибудь провести различие. А добавление diff () отлично работало со случайным кодом, чтобы проверить, работает он или нет.   -  person Yoyo    schedule 03.06.2016
comment
@yoyo, прочтите ссылку EdChum. numpy объект имеет метод diff().   -  person gaganso    schedule 03.06.2016
comment
@silentmonk Я пробовал, но это не сработало, и я думаю, что это только для числа. Ниже показан текст кода, о котором я упоминал ранее, который отлично работал с матрицами. x, y, e1 = символы ('xy e1') e = Matrix (2,1, lambda i, j: Symbol ('e% d'% (i + 1))) I = np.matrix ([[1 , 0], [0, 1]]) k = I * e print k.diff (e1)   -  person Yoyo    schedule 03.06.2016
comment
@edchum Спасибо. Но он не работает, и я думаю, что np, diff () используется только для чисел. Если вы можете предложить какую-либо другую функцию или другой способ действовать, это было бы здорово.   -  person Yoyo    schedule 03.06.2016
comment
похоже, что sympy diff не векторизован, то есть не будет работать со всем массивом, поэтому вам придется перебирать e и назначать результат diff каждой строке   -  person EdChum    schedule 03.06.2016


Ответы (1)


Как было сказано в комментариях, символьное дифференцирование не может применяться к объекту матрицы SymPy. Примените его к каждой записи отдельно. Пример:

t1 = Symbol('t1')
jacobian = Matrix(*e.shape, lambda i,j: e[i,j].diff(t1))

Вторая строка создает матрицу той же формы, что и e, в которой элементы являются производными элементов e по отношению к t1.

(На самом деле вы никогда не определяли t1 в коде, поэтому первая строка здесь необходима.)

person Community    schedule 04.06.2016
comment
Вы также можете использовать e.applyfunc(lambda i: diff(i, t1)) - person asmeurer; 07.06.2016