Maximaで微分演算子
知恵袋で聞いたらなぜか日本語が通じなかったので、okwaveにしました。
こっちならその都度捕捉できますし。
重複すいません。
数式処理システムMaximaで微分演算子を定義しようと思っています。
具体的には、1引数関数f(x)を受け取って、(例えば)x^2*f'(x)を返す関数d(f)を定義します。
理想的には、hoge(t):=sin(t);などとしたとき,d(hoge)(x)がx^2*cos(x)を返し、d(d(hoge))(p)がp^2*(2*p*cos(p)-p^2*sin(p))を返す、といった具合です。
素朴に思いつくのは、
d1(f,x):=x^2*diff(f(x),x);
ですが、まずxも引数に取らねばならず、返り値が関数ではありません。
また、hoge(x):=sin(x);としてd1(hoge,5)などとすると、5^2*diff(sin(5),5)としてしまいます。
そこで、
d2(f,x):=subst(x,y,y^2*diff(f(y),y));
とすれば、先ほどの問題(d1(hoge,5))は解決しますが、やはり関数を返すのではなく値を返しています。
これだと、d2(d2(f,x),x)のようにできず、d2(lambda([x],d2(f,x)),x)としなければなりません。
d2(d2(d2(f)))とかだと、さらに面倒になります。
関数を返すために、lambdaを使って
d3(f):=lambda([x],subst(x,y,y^2*diff(f(y),y)));
としても、hoge(x):=sin(x);d3(hoge)(x)とすると、x^2*('diff(f(x),x,1))となります。
d1,d2については、うまくいかない理由は理解できるのですが、
d3についてはわかりません。
d3がうまくいかない理由と、当初の意図した関数はどうすれば実装できるのか、教えてください。
あと、n階微分ならdiff(f(x),x,n)とすれば良いですが、dをn回作用させる(つまり、d(d(...d(f)..))とする)にはどうすればよいでしょうか。やはり再帰しかないですかね。
Maximaの情報はググってもあまり出てこないので、誰か詳しい人、教えてください!