<br><br><div class="gmail_quote">On Tue, Feb 26, 2008 at 5:42 PM, Robert Dodier &lt;<a href="mailto:robert.dodier@gmail.com">robert.dodier@gmail.com</a>&gt; wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
<br>
If you post the rules you want to implement, in some non-Maxima<br>
notation, I can help you translate them (or I&#39;ll try, anyway)<br>
into Maxima rules.<br>
<br>
best<br>
<font color="#888888"><br>
Robert Dodier<br>
</font></blockquote></div><br>I have the following code, which seems to work, the function diff_in_steps(x^2*sin(x^3))<br>differentiates with respect to x and shows steps, but it fails for diff_in_steps(x^2*sin(y))<br><br>
It remains to solve this problem (it is not possible to use parameters or functions in more variables) and also to format the result for reading -- with tex and texput(derivace,[&quot;\\left(&quot;,&quot;\\right)^\\prime&quot;],matchfix)<br>
<br>Since I am new in Maxima (I use it for less than one year), I would like to post my code to this group. If you have any suggestions or improvements, let me know please.<br><br><br>Short explanation of the code:<br><br>
The string to be differentiated is in the function derivace(expr) - I use the Czech word in order not to break anything.<br><br>The function derivace is declared to be linear<br><br>We try the usual rules for basic elementary functions first. <br>
<br>If all the rules fail, we try to use product rule and if this fails as well, we try quotient rule. (here I observed a strange thing: op(u/v) gives &quot;//&quot; on debian and &quot;/&quot; on archlinux)<br><br>We try the product rule as follows: we replace the function derivace with derivsoucinu and this new function returns derivace(expr) if expr is not a product or derivace(u)*v+u*derivace(v). In a similar way we work with quotient.<br>
<br>We use small maxapplydepth to ensure that only one or few rules are applied on each step.<br>We finish if the word &quot;derivace&quot; is missing in the expression or after 100 steps.<br><br>Robert Marik<br><br>-------------------------------------------------------------------------------------------------------<br>
<br>constantp_not1 (x%) := constantp(x%) and x% # 1;<br>matchdeclare(g,true,n,constantp_not1,c,constantp);<br><br><br><br>/* formulas with chain rule */<br>defrule(c1, derivace(c), (print (&quot;constant: (&quot;,c,&quot;)&#39;=0&quot;), 0));<br>
defrule(x1, derivace(x), (print (&quot;x: (&quot;,x,&quot;)&#39;=1&quot;), 1));<br>defrule(r1, derivace(sin(g)), (print (&quot;sine: (sin(&quot;,g,&quot;))&#39;=cos(&quot;,g,&quot;)*(&quot;,g,&quot;)&#39;&quot;),if g=x then cos(x) else cos(g)*derivace(g)));<br>
defrule(r2, derivace(cos(g)), (print (&quot;cosine: (sin(&quot;,g,&quot;))&#39;=cos(&quot;,g,&quot;)*(&quot;,g,&quot;)&#39;&quot;), if g=x then -sin(x) else -sin(g)*derivace(g)));<br>defrule(r3, derivace(tan(g)), (print (&quot;tangent: (tan(&quot;,g,&quot;))&#39;=1/cos^2(&quot;,g,&quot;)*(&quot;,g,&quot;)&#39;&quot;),&nbsp; if g=x then 1/(cos(x))^2 else 1/(cos(g))^2*derivace(g)));<br>
defrule(r4, derivace(cot(g)), ( print (&quot;cotangent: (cot(&quot;,g,&quot;))&#39;=1/sin^2(&quot;,g,&quot;)*(&quot;,g,&quot;)&#39;&quot;), if g=x then -1/(sin(x))^2 else -1/(sin(g))^2*derivace(g)));<br>defrule(r5, derivace(n), (print (&quot;constant&quot;,n),0));<br>
defrule(r6, derivace(g^n), (print (&quot;power: (&quot;,g^n,&quot;)&#39;=&quot;,n*g^(n-1),&quot;*(&quot;,(g),&quot;)&#39;&quot;), if g=x then n*x^(n-1) else n*(g)^(n-1)*derivace(g)));<br>defrule(r7, derivace(exp(g)), (print (&quot;natural eponential: (&quot;,exp(g),&quot;)&#39;=&quot;,exp(g),&quot;*(&quot;,(g),&quot;)&#39;&quot;), if g=x then exp(x) else exp(g)*derivace(g)));<br>
defrule(r8, derivace(n^g), (print (&quot;eponential: (&quot;,n^g,&quot;)&#39;=&quot;,log(n)*n^g,&quot;*(&quot;,(g),&quot;)&#39;&quot;), if g=x then log(n)*n^g else log(n)*n^(g)*derivace(g)));<br>defrule(r9, derivace(log(g)), (print (&quot;logarithm: (&quot;,log(g),&quot;)&#39;=&quot;,1/g,&quot;*(&quot;,(g),&quot;)&#39;&quot;), if g=x then 1/g else 1/(g)*derivace(g)));<br>
defrule(r10, derivace(log10(g)), (print (&quot;decadic logarithm: (&quot;,log10(g),&quot;)&#39;=&quot;,1/(g*log(10)),&quot;*(&quot;,(g),&quot;)&#39;&quot;), if g=x then 1/(g*log(10)) else 1/(g*log(10))*derivace(g)));<br>defrule(r11, derivace(asin(g)), (print (&quot;arcsin: (&quot;,asin(g),&quot;)&#39;=&quot;,1/sqrt(1-g^2),&quot;*(&quot;,(g),&quot;)&#39;&quot;), if g=x then 1/sqrt(1-g^2) else 1/sqrt(1-g^2)*derivace(g)));<br>
defrule(r12, derivace(acos(g)), (print (&quot;arccos: (&quot;,acos(g),&quot;)&#39;=&quot;,-1/sqrt(1-g^2),&quot;*(&quot;,(g),&quot;)&#39;&quot;), if g=x then -1/sqrt(1-g^2) else -1/sqrt(1-g^2)*derivace(g)));<br>defrule(r13, derivace(atan(g)), (print (&quot;arctan: (&quot;,atan(g),&quot;)&#39;=&quot;,1/(1+g^2),&quot;*(&quot;,(g),&quot;)&#39;&quot;), if g=x then 1/(1+g^2) else 1/(1+g^2)*derivace(g)));<br>
defrule(r14, derivace(acot(g)), (print (&quot;arccotan: (&quot;,acot(g),&quot;)&#39;=&quot;,-1/(1+g^2),&quot;*(&quot;,(g),&quot;)&#39;&quot;), if g=x then -1/(1+g^2) else -1/(1+g^2)*derivace(g)));<br><br><br><br>/* product and quotient rule */<br>
derivsoucinu(expr):= if (op(expr)=&quot;*&quot;) then (u:args(expr)[1], v:expr/u, print(&quot;product: (&quot;,u*v,&quot;)&#39;=...&quot;),derivace(u)*v+u*derivace(v)) else derivace(expr);<br>derivpodilu(expr):= if (op(expr)=op(u/v)) then (u:args(expr)[1], v:u/expr, print(&quot;quotient: (&quot;,u/v,&quot;)&#39;=...&quot;), (derivace(u)*v-u*derivace(v))/(v^2)) else derivace(expr);<br>
<br>declare(derivace,linear);<br><br>derivacep(expr):=numberp(ssearch(&quot;derivace&quot;,string(expr)));<br><br>diff_one_step(fce):=<br>&nbsp;&nbsp; if derivacep(fce) then <br>&nbsp;&nbsp;&nbsp;&nbsp; (<br>&nbsp;&nbsp;&nbsp;&nbsp; block(initfce:string(fce), <br>&nbsp;&nbsp;&nbsp;&nbsp; newfce:fce, <br>
&nbsp;&nbsp;&nbsp;&nbsp; for i:0 step 1 unless ((i&gt;100) or <br>&nbsp;&nbsp;&nbsp;&nbsp; (string(fce)#string(newfce))) do <br>&nbsp;&nbsp;&nbsp;&nbsp; (maxapplydepth:i, <br>&nbsp;&nbsp;&nbsp;&nbsp; newfce:apply2(fce,c1,x1,r5,r1,r2,r3,r4,r6,r7,r8,r9,r10,r11,r12,r13,r14))),<br>&nbsp;&nbsp;&nbsp;&nbsp; if fce#newfce then newfce else <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (aa:&#39;&#39;tryproduct(fce),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if aa#fce then aa else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (bb:&#39;&#39;tryquotient(fce),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if bb#fce then bb else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fce<br>&nbsp;&nbsp;&nbsp; &nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp; else print(&quot;nothing more to differentiate ...&quot;) ;<br>
<br><br>/* function to differentiate products and quotients */<br>tryproduct(expr):=<br>&nbsp;&nbsp; (<br>&nbsp;&nbsp; exprstr:string(expr),<br>&nbsp;&nbsp; newexprstr:ssubst(&quot;derivsoucinu&quot;,&quot;derivace&quot;,exprstr),<br>&nbsp;&nbsp; eval_string(newexprstr)<br>
&nbsp;&nbsp; );<br><br>tryquotient(expr):=<br>&nbsp;&nbsp; (<br>&nbsp;&nbsp; exprstr:string(expr),<br>&nbsp;&nbsp; newexprstr:ssubst(&quot;derivpodilu&quot;,&quot;derivace&quot;,exprstr),<br>&nbsp;&nbsp; eval_string(newexprstr)<br>&nbsp;&nbsp; );<br><br><br>diff_in_steps(expr):=<br>
&nbsp; (newfce:derivace(expr),<br>&nbsp; for counter:1 step 1 unless ((counter&gt;100) or (not(derivacep(newfce)))) do<br>&nbsp; (<br>&nbsp;&nbsp;&nbsp; newfce:diff_one_step(newfce),<br>&nbsp;&nbsp;&nbsp; print(&quot;y&#39;=&quot;,newfce)<br>&nbsp; )<br>&nbsp; );<br>