123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102 |
- module numeric; % Header module for the numeric package and
- % support of numerical evaluation of symbolic
- % expressions.
- % Author: Herbert Melenk.
- % Copyright (c) 1993 ZIB Berlin, RAND. All rights reserved.
- create!-package('(numeric numeval numsolve gauss newton steepstd
- bounds numint numfit chebysh rungeku),
- '(contrib numeric));
- fluid '(!*noequiv);
- fluid '(accuracy!*);
- global '(iterations!* !*trnumeric);
- switch trnumeric;
- % Create .. as infix operator.
- newtok '( (!. !.) !*interval!*);
- if null get('!*interval!*,'simpfn) then
- <<precedence .., or;
- algebraic operator ..;
- put('!*interval!*,'prtch,'! !.!.! );
- >>;
- % some common utilities
- fluid '(minus!-infinity!*);
- minus!-infinity!* := '(minus infinity);
- % intervals
- symbolic procedure adomainp u;
- numberp u or (pairp u and idp car u and get(car u,'dname));
- symbolic procedure revalnuminterval(u,num);
- % Evaluate u as interval; numeric bounds required if num=T.
- begin scalar l;
- if not eqcar(u,'!*interval!*) then typerr(u,"interval");
- l:={reval cadr u,reval caddr u};
- if adomainpx(car l,num) and adomainpx(cadr l,num)then return l;
- typerr(u,"numeric interval");
- end;
- symbolic procedure adomainpx(u,num);
- % extended algebraic domainp test:
- % num = t: u is a domain element;
- % num = inf: u is a domain element or inf or (minus inf)
- % num = nil: u is arbitrary.
- null num or adomainp u or num='infinity
- and member(u,'(infinity (minus infinity)));
-
- symbolic procedure evalgreaterpx(a,b);
- if a =minus!-infinity!* or b = 'infinity then nil else
- a='infinity or b=minus!-infinity!* or evalgreaterp(a,b);
- symbolic procedure mkinterval(u,v);
- list('!*interval!*,u,v);
- % Easy coding of numerical procedures with REDUCE:
- %
- % In statements or procedure bodies tagged with "dm:" all
- % arithmetic function calls are replaced by REDUCE domain
- % arithmetic.
- symbolic macro procedure dm!: u;
- subla('((plus2 . !:plus)(times2 . !:times)
- (plus . !:plusn)(times . !:timesn)
- (quotient . !:!:quotient)
- (difference . !:difference)
- (minus . !:minus)
- (minusp . !:minusp)
- (zerop . !:zerop)
- (lessp . (lambda(a b)(!:minusp (!:difference a b))))
- (greaterp . (lambda(a b)(!:minusp (!:difference b a))))
- (leq . (lambda(a b)(not (!:minusp (!:difference b a)))))
- (geq . (lambda(a b)(not (!:minusp (!:difference a b)))))
- (sqrt . num!-sqrtf)
- (abs . absf)
- (min2 . dm!:min)
- (max2 . dm!:max)
- (min . dm!:min)
- (max . dm!:max)
- ) , cadr u);
- %wrappers for n-ary plus and times
- symbolic macro procedure !:plusn u;
- if null cddr u then cadr u else
- list('!:plus,cadr u,'!:plusn . cddr u);
- symbolic macro procedure !:timesn u;
- if null cddr u then cadr u else
- list('!:times,cadr u,'!:timesn . cddr u);
- endmodule;
- end;
|