first impl of builtin member methods (thus far, string.size implemented. more to...
[aqualang.git] / examples / derivatives.jtc
blob764cd3fd2a1b6ea31bf8af01bf6fe7bff370f3d8
1 // use jtc's introspection abilities to calculate symbolic derivatives
2 // of simple functions.
4 derive_expr = func(expr, var)
6     expansion = expand_node(expr)
7     if(size(expansion) == 1)
8     {
9         if(type(expansion[0]) == "string")
10         {
11             if(expansion[0] == var)
12             {
13                 return "1"
14             }
15             else
16             {
17                 return "0"
18             }
19         }
20         else
21         {
22             return derive(expansion[0], var)
23         }
24     }
25     else if(expansion[0] == "(")
26     {
27         return derive_expr(expansion[1], var)
28     }
29     else
30     {
31         dleft = derive_expr(expansion[0], var)
32         dright = derive_expr(expansion[2], var)
33         left = tostring(expansion[0])
34         right = tostring(expansion[2])
35         if(expansion[1] == "+")
36         {
37             return "(" + dleft + "+" + dright + ")"
38         }
39         else if(expansion[1] == "-")
40         {
41             return "(" + dleft + "-" + dright + ")"
42         }
43         else if(expansion[1] == "*")
44         {
45             return "(" + left + "*" + dright + "+" + dleft + "*" + right + ")"
46         }
47         else if(expansion[1] == "/")
48         {
49             return "(" + dleft + "*" + right + "-" + dright + "*" + left + ")/(" + right + "*" + right + ")"
50         }
51     }
54 derive = func(fun, var)
56     expansion = expand_node(fun)
57     vars = tostring(expansion[1])
58     if(var == nil)
59     {
60         var = tostring(expand_node(expansion[1])[1])
61     }
62     expr = expand_node(expansion[2])[1]
63     source = "func"+vars+" return "+derive_expr(expr, var)+""
64     return eval(parse_expression(source))
67 f = func(x) return x*x
68 df = derive(f)
70 g = func(x, y) return x*y
71 dg = derive(g "y")
73 print(tostring(df) "\n")
74 print(tostring(dg) "\n")