-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsymbolic.js
More file actions
11 lines (10 loc) · 3.81 KB
/
symbolic.js
File metadata and controls
11 lines (10 loc) · 3.81 KB
1
2
3
4
5
6
7
8
9
10
(function(){
CindyJS.registerPlugin(1,"symbolic",function(h){function l(a){if(null==a||"object"!=typeof a)return a;if(a instanceof Array){var b=[];for(var c=0,f=a.length;c<f;c++)b[c]=l(a[c]);return b}if(a instanceof Object){b={};for(c in a)a.hasOwnProperty(c)&&0<="oper impl args ctype stack name arglist value real imag key obj body".split(" ").indexOf(c)&&(b[c]=l(a[c]));a.modifs&&(b.modifs=a.modifs);return b}}var d=function(a){return{ctype:"number",value:{real:a,imag:0}}},e=function(a,b){return{ctype:"function",
oper:a,args:b,modifs:{}}},v={sin$1:a=>[e("cos$1",[a[0]])],cos$1:a=>[e("sub$2",[d(0),e("sin$1",[a[0]])])],exp$1:a=>[e("exp$1",[a[0]])],log$1:a=>[e("div$2",[d(1),a[0]])],sqrt$1:a=>[e("div$2",[d(.5),e("sqrt$1",[a[0]])])],add$2:a=>[d(1),d(1)],sub$2:a=>[d(1),d(-1)],mult$2:a=>[a[1],a[0]],div$2:a=>[e("div$2",[d(1),a[1]]),e("div$2",[e("sub$2",[d(0),a[0]]),e("mult$2",[a[1],a[1]])])],pow$2:a=>[e("mult$2",[a[1],e("pow$2",[a[0],e("sub$2",[a[1],d(1)])])]),e("mult$2",[e("log$1",[a[0]]),e("pow$2",[a[0],a[1]])])],
";":a=>"void"==a[1].ctype?[d(1),d(0)]:[d(0),d(1)]},x={sin$1:(a,b)=>Infinity,cos$1:(a,b)=>Infinity,exp$1:(a,b)=>Infinity,log$1:(a,b)=>Infinity,sqrt$1:(a,b)=>Infinity,add$2:(a,b)=>Math.max(g(a[0],b),g(a[1],b)),sub$2:(a,b)=>Math.max(g(a[0],b),g(a[1],b)),mult$2:(a,b)=>g(a[0],b)+g(a[1],b),div$2:(a,b)=>0===g(a[1],b)?g(a[0],b):Infinity,pow$2:(a,b)=>0===g(a[1],b)?g(a[0],b)*h.evaluate(a[1]).value.real:Infinity,";":function(a,b){if("void"===a[1].ctype)return g(a[0],b);h.evaluate(a[0]);return g(a[1],b)}},r=
{"+":"add$2","-":"sub$2","*":"mult$2","/":"div$2","^":"pow$2"},p=function(a,b){if("variable"===a.ctype&&b[a.name])return b[a.name];a.args&&(a.args=a.args.map(c=>p(c,b)));return a},k=function(a,b){return a&&"number"===a.ctype&&0===a.value.imag&&a.value.real===b},n=function(a){if(a.args&&(a.args=a.args.map(n),a.args.every(b=>"number"===b.ctype)))return h.evaluate(a);if("add$2"===a.oper||"+"===a.oper){if(k(a.args[0],0))return a.args[1];if(k(a.args[1],0))return a.args[0]}else if("sub$2"===a.oper||"-"===
a.oper){if(k(a.args[1],0))return a.args[0]}else if("mult$2"===a.oper||"*"===a.oper){if(k(a.args[0],0)||k(a.args[1],0))return d(0);if(k(a.args[0],1))return a.args[1];if(k(a.args[1],1))return a.args[0]}else if(("pow$2"===a.oper||"^"===a.oper)&&k(a.args[1],1))return a.args[0];return a},u=function(a,b){if("variable"===a.ctype)return b[a.name]?b[a.name]:d(0);if("number"===a.ctype)return d(0);if("infix"===a.ctype||"function"===a.ctype){let m=h.getMyfunction(a.oper),q=d(0),w={};if(m)for(var c in a.args)w[m.arglist[c].name]=
a.args[c];for(let t in a.args){c=u(a.args[t],b);var f=d(0);k(c,0)||(m?(f={},f[m.arglist[t].name]=d(1),f=p(l(u(l(m.body),f)),w)):v[r[a.oper]||a.oper]&&(f=v[r[a.oper]||a.oper](a.args)[t]),k(f,0)||(k(c,1)||(f=e("mult$2",[f,c])),q=k(q,0)?f:e("add$2",[q,f])))}return q}console.error("Do not know how to differentiate:");console.log(a);return d(0)},g=function(a,b){if("variable"===a.ctype)return b[a.name]?b[a.name]:0;if("number"===a.ctype)return 0;if("infix"===a.ctype||"function"===a.ctype){if(";"!=a.oper&&
a.args.every(f=>0===g(f,b)))return 0;var c=h.getMyfunction(a.oper);if(c){let f={};for(let m in a.args)f[c.arglist[m].name]=g(a.args[m],b);return g(n(l(c.body)),f)}if(c=x[r[a.oper]||a.oper])return c(a.args,b)}else if("void"===a.ctype)return 0;console.log("Do not know how to compute the degree of:");console.log(a);return Infinity};h.defineFunction("diff",3,function(a,b){b={};if(!a[1].name)return h.nada;b[a[1].name]=d(1);b=n(u(l(a[0]),b));return h.evaluate(p(l(a[2]),{"#":b}))});h.defineFunction("simplify",
2,function(a,b){return h.evaluate(p(l(a[1]),{"#":n(l(a[0]))}))});var y=function(a,b){b={};for(let c in a)if(1<=c)if("variable"===a[c].ctype)b[a[c].name]=1;else return h.nada;a=g(n(l(a[0])),b);Infinity==a&&(a=-1);return d(a)};for(let a=1;3>=a;a++)h.defineFunction("degree",1+a,y)});
}).call(this);//# sourceMappingURL=symbolic.js.map