Вычислительные производные в Mathematica / Mathlink - PullRequest
1 голос
/ 25 сентября 2010

Я пытаюсь выяснить, как использовать 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 Ответ

2 голосов
/ 25 сентября 2010

Полная форма f'[x] в Mathematica - 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);
...