Artifact ba8e9755283c7e945318acd5e62489e48326a037f192b88a1c7032f33d844f22:
- Executable file
r37/packages/camal/hdiff.red
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 2904) [annotate] [blame] [check-ins using] [more...]
- Executable file
r38/packages/camal/hdiff.red
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 2904) [annotate] [blame] [check-ins using]
module hdiff; %% Harmonic differentiation and Integration. symbolic procedure hdiff(x, u); if null x then nil else fs!:plus(hdiff(fs!:next x,u), hdiffterm(x,u)); symbolic procedure hdiffterm(x, u); begin scalar n; n := getv!.unsafe(fs!:angle x, u); if n = 0 then return nil; n := multsq( n . 1, fs!:coeff x); if fs!:fn x = 'cos then return make!-term('sin, fs!:angle x, negsq n) else return make!-term('cos, fs!:angle x, n) end; symbolic procedure hdiff1(x, u); if null x then nil else begin scalar ans, aaa; ans := diffsq(fs!:coeff x, u); if ans then << aaa := mkvect 3; fs!:set!-coeff(aaa, ans); fs!:set!-fn(aaa, fs!:fn x); fs!:set!-angle(aaa,fs!:angle x); fs!:set!-next(aaa, hdiff1(fs!:next x, u)); return aaa >> else return hdiff1(fs!:next x, u) end; symbolic procedure simphdiff uu; begin scalar x, u; if not (length uu = 2) then rerror(fourier, 10, "Improper number of arguments to HDIFF"); x := car uu; uu := cdr uu; u := car uu; x := simp x; if not eqcar(car x, '!:fs!:) then x := !*sq2fourier x ./ 1; if not harmonicp u then return (get('fourier, 'tag) . hdiff1(cdar x, u)) ./ 1; x := hdiff(cdar x,get(u,'fourier!-angle)); if null x then return nil ./ 1; return (get('fourier, 'tag) . x) ./ 1 end; put('hdiff, 'simpfn, 'simphdiff); symbolic procedure hint(x, u); if null x then nil %% Bind fs!:zero!-generated ?? else fs!:plus(hint(fs!:next x,u), hintterm(x,u)); symbolic procedure hintterm(x, u); begin scalar n; n := getv!.unsafe(fs!:angle x, u); if n = 0 then return make!-term(fs!:fn x, fs!:angle x, fs!:coeff x); n := multsq( 1 ./ n, fs!:coeff x); if fs!:fn x = 'cos then return make!-term('sin, fs!:angle x, n) else return make!-term('cos, fs!:angle x, negsq n) end; symbolic procedure hint1(x , u); if null x then nil else begin scalar aaa; aaa := mkvect 3; fs!:set!-coeff(aaa, simpint list(prepsq fs!:coeff x, u)); fs!:set!-fn(aaa, fs!:fn x); fs!:set!-angle(aaa,fs!:angle x); fs!:set!-next(aaa, hint1(fs!:next x, u)); return aaa end; symbolic procedure simphint uu; begin scalar x, u; if not (length uu = 2) then rerror(fourier, 11, "Improper number of arguments to HINT"); x := car uu; uu := cdr uu; u := car uu; x := simp x; if not eqcar(car x, '!:fs!:) then x := !*sq2fourier x ./ 1; if not harmonicp u then return (get('fourier, 'tag) . hint1(cdar x, u)) ./ 1; x := hint(cdar x,get(u,'fourier!-angle)); if null x then return nil ./ 1; return (get('fourier, 'tag) . x) ./ 1 end; put('hint, 'simpfn, 'simphint); initdmode 'fourier; endmodule; end;