Ogólny algorytm iloczynu jest podany np. tu https://en.wikipedia.org/wiki/Product_rule.
Zauważmy, że stosuje się to także do funkcji stałych (w projekcie Constant
):
$$\frac{d}{dx}(2\cdot f(x))=\frac{d}{dx}(2)\cdot f(x) + 2\cdot \frac{d}{dx}f(x)$$ $$=0\cdot f(x) + 2\cdot \frac{d}{dx} f(x)$$
Stąd najprostsza implementacja ma postać:
Node diffVanilla(Variable var) { Sum r = new Sum(); for(int i=0;i<args.size();i++){ Prod m= new Prod(); for(int j=0;j<args.size();j++){ Node f = args.get(j); if(j==i)m.mul(f.diff(var)); else m.mul(f); } r.add(m); } return r; }