KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > lsmp > djep > djep > diffRules > PowerDiffRule


1 /* @author rich
2  * Created on 04-Jul-2003
3  *
4  * This code is covered by a Creative Commons
5  * Attribution, Non Commercial, Share Alike license
6  * <a HREF="http://creativecommons.org/licenses/by-nc-sa/1.0">License</a>
7  */

8 package org.lsmp.djep.djep.diffRules;
9
10 import org.lsmp.djep.djep.DJep;
11 import org.lsmp.djep.djep.DiffRulesI;
12 import org.lsmp.djep.xjep.*;
13 import org.nfunk.jep.*;
14
15
16 /**
17     * Diffrentiates a power with respect to var.
18     * If m is a a number
19     * diff(y^m,x) -> m * y^(m-1)
20     * otherwise
21     * diff(y^z,x) -> z * y^(z-1) * diff(y,x) + y^z * ln(z) * diff(z,x)
22     */

23
24  public class PowerDiffRule implements DiffRulesI
25  {
26     private String JavaDoc name;
27     private PowerDiffRule() {}
28     public PowerDiffRule(String JavaDoc inName)
29     {
30       name = inName;
31     }
32
33   public String JavaDoc toString()
34   { return name + " \t\tdiff(f*g,x) -> diff(f,x)*g+f*diff(g,x)"; }
35   public String JavaDoc getName() { return name; }
36     
37   public Node differentiate(ASTFunNode node,String JavaDoc var,Node [] children,Node [] dchildren,DJep djep) throws ParseException
38   {
39     OperatorSet op = djep.getOperatorSet();
40     NodeFactory nf = djep.getNodeFactory();
41     TreeUtils tu = djep.getTreeUtils();
42     FunctionTable funTab = djep.getFunctionTable();
43     
44     int nchild = node.jjtGetNumChildren();
45     if(nchild!=2)
46         throw new ParseException("Too many children "+nchild+" for "+node+"\n");
47     // x^y -> n*(pow(x,y-1)) x' + ln(y) pow(x,y) y'
48

49     if(tu.isConstant(children[1]))
50     {
51        ASTConstant c = (ASTConstant) children[1];
52        Object JavaDoc value = c.getValue();
53        if(value instanceof Double JavaDoc)
54        { // x^m -> m * x^(m-1) * x'
55
// Node a = TreeUtils.deepCopy(children[1]);
56
// Node b = TreeUtils.deepCopy(children[0]);
57
// Node cc = TreeUtils.createConstant( ((Double) value).doubleValue()-1.0);
58
// Node d = opSet.buildPowerNode(b,cc);
59
// Node e = opSet.buildMultiplyNode(a,d);
60

61          return nf.buildOperatorNode(op.getMultiply(),
62            djep.deepCopy(children[1]),
63            nf.buildOperatorNode(op.getMultiply(),
64             nf.buildOperatorNode(op.getPower(),
65                djep.deepCopy(children[0]),
66            nf.buildConstantNode( tu.getNumber(((Double JavaDoc) value).doubleValue()-1.0))),
67              dchildren[0]));
68        }
69        else
70        {
71          return nf.buildOperatorNode(op.getMultiply(),
72             djep.deepCopy(children[1]),
73             nf.buildOperatorNode(op.getMultiply(),
74                 nf.buildOperatorNode(op.getPower(),
75                    djep.deepCopy(children[0]),
76                    nf.buildOperatorNode(op.getSubtract(),
77                     djep.deepCopy(children[1]),
78                     nf.buildConstantNode(tu.getONE()))),
79              dchildren[0]));
80        }
81    }
82    else // z * y^(z-1) * diff(y,x) + y^z * ln(z) * diff(z,x)
83
{
84         return nf.buildOperatorNode(op.getAdd(),
85             nf.buildOperatorNode(op.getMultiply(), // z * y^(z-1) * diff(y,x)
86
nf.buildOperatorNode(op.getMultiply(), // z * y^(z-1)
87
djep.deepCopy(children[1]), // z
88
nf.buildOperatorNode(op.getPower(), // y^(z-1)
89
djep.deepCopy(children[0]), // y
90
nf.buildOperatorNode(op.getSubtract(), // z-1
91
djep.deepCopy(children[1]), // z
92
djep.getNodeFactory().buildConstantNode(tu.getONE()) ))),
93                 dchildren[0]), // diff(y,x)
94
nf.buildOperatorNode(op.getMultiply(), // + y^z * ln(z) * diff(z,x)
95
nf.buildOperatorNode(op.getMultiply(),
96                     nf.buildOperatorNode(op.getPower(), // y^z
97
djep.deepCopy(children[0]),
98                         djep.deepCopy(children[1])),
99                     djep.getNodeFactory().buildFunctionNode("ln",funTab.get("ln"), // ln(z)
100
new Node[]{djep.deepCopy(children[0])})),
101                 dchildren[1]));
102                 // TODO will NaturalLog always have the name "ln"
103
}
104  }
105  }
106
Popular Tags