У меня есть существующая кодовая база, которая выполняет некоторое преобразование координат и вычисление динамики для модели робота, я хочу добавить Cppad ко всем параметрам робота, но я столкнулся с такой проблемой:
Насколько я знаю, нормальная процедура CppAD заключается в настройке динамического вектора a
затем позвоните Independent(a)
, затем делает некоторые вычисления, а затем определить функцию CppAD::ADFun<double> f(a,b);
построить график между входом и выходом, где b
результат, который зависит от a
,
Вопрос в том, что у меня есть матрица инерции M
размером 3 на 3 (тип Eigen), и я хочу вычислить производные динамической переменной result
размером 3, относительно только диагональных элементов M
(так что есть 3). Все вычисления от M до D выполняются в базе кода, и то, что я делаю, вроде
Eigen::Matrix<Scalar, Eigen::Dynamic, 1> AD_M(3); //input, or parameter of the function
Eigen::Matrix<Scalar, Eigen::Dynamic, 1> AD_result(3); //output, or the value of the function
AD_M << M(0,0), M(1,1), M(2,2); // only taking the diagonal values
Independent(AD_M);
... compute() //some function that calculates AD_result.
CppAD::ADFun<double> f(AD_M,AD_result);
f.jacobian(x_M); // x_M is some initialize parameter of M
Когда я делаю это, я получаю все нулевые выходы якобиана. Я думаю, что причина этого заключается в том, что, делая AD_M << M(0,0), M(1,1), M(2,2);
Я на самом деле делаю глубокую копию M(0,0), M(1,1), M(2,2)
на самом деле не ссылаясь на них или не делая их мелкую копию. И функция compute()
принимают значения из оригинала M
вместо построения графика на основе AD_M
так что все якобиане равны 0.
Может кто-нибудь сказать мне, если возможно построить динамический массив, используя ссылку, или как работать иначе в этой ситуации? Или, например, если я знаю адрес какого-либо параметра, как я могу построить динамический массив, используя эти адреса для функции ADfun ()? Любые предложения будут оценены.
Задача ещё не решена.
Других решений пока нет …