Вычислительные производные в Mathematica/Mathlink
Я пытаюсь понять, как использовать Mathematica из C через Mathlink.
Если я просто хочу вычислить значение встроенной функции, я могу сделать
MLPutFunction( lp, "RiemannSiegelZ", 1L);
MLPutDouble(lp, val);
и все в порядке.
Теперь, если я хочу значение производной, все становится хуже:
MLPutFunction( lp, "RiemannSiegelZ'", 1L);
MLPutDouble(lp, val);
не работает. Я пытался вставить функцию "D", но мне не удалось заставить ее работать. Лучший способ найти это далеко это
char query[128];
sprintf(query, "N[RiemannSiegelZ'[%.20lf]]", val);
MLPutFunction(lp, "ToExpression", 1);
MLPutString(lp, query);
это работает, но это очень медленно, вероятно потому, что я прошу Mathematica разобрать выражение, а не просто вызывать функцию... Есть ли лучший способ?
1 ответ
Решение
Полная форма f'[x]
в математике есть Derivative[1][f][x]
, Для этого вам нужно использовать MLPutNext более низкого уровня, например
MLPutNext(lp, MLTKFUNC); // Derivative[1][Sin][_]
MLPutArgCount(lp, 1); // 1.23456
MLPutNext(lp, MLTKFUNC); // Derivative[1][_]
MLPutArgCount(lp, 1); // Sin
MLPutNext(lp, MLTKFUNC); // Derivative[_]
MLPutArgCount(lp, 1); // 1
MLPutSymbol(lp, "Derivative");
MLPutInteger(lp, 1);
MLPutSymbol(lp, "Sin");
MLPutDouble(lp, 1.23456);