intervals.... more
- Subject: intervals.... more
- From: S. Newhouse
- Date: Thu, 13 Dec 2007 22:31:12 -0500
Richard Fateman wrote:
> here's a sketch of a working (but incomplete) interval evaluator.
> More stuff is needed from my generic arithmetic package, on my web page..
>
>
> #| a Maxima interpreter for intervals |#
>
> (in-package :ri) ; real intervals
>
> (defun maxima::$IEVAL(expr)(ieval (meval expr)))
>
> (defun ieval(e)
>
> (cond ((realp e) (widen-ri e e)) ;3.0 -> [3-eps,3+eps]
>
> ((atom e)
> (error "IEVAL cannot handle ~s" e))
> (t (case
> (caar e)
>
> (maxima::MPLUS
> (cond ((null (cdr e)) 0)
> ((null (cddr e))(ieval (cadr e)))
> (t (+ (ieval (cadr e)) ;this + is a real-interval +
> (ieval (cons (car e) (cddr e)))))))
> (maxima::MTIMES
> (cond ((null (cdr e)) 0)
> ((null (cddr e))(ieval (cadr e)))
> (t (* (ieval (cadr e)) ; this * is a real-interval *
> (ieval (cons (car e) (cddr e)))))))
> (maxima:: MLIST
> ;; make a real interval, a structure of type ri
> ;; check it is a list of 2 items
> ;; both numbers, in order,
> (let ((a (second e))(b (third e)))
> (if (and (realp a)
> (realp b) ;; optional? (<= a b)
> (null(cdddr e)))
> (widen-ri (cadr e)(caddr e))
> (error "can't convert ~s to interval")))
> (otherwise
> ;; look on property list of (car e)
> ;; to see if it has an ieval property. eg.
> (if (setf fn (get (caar e)
> 'ieval))
> (apply fn (mapcar #'ieval (cdr e)))
> (error "IEVAL cannot handle ~s" e)))))))
>
>
> (setf (get '$includes 'ieval) #'include-ri)
> (setf (get '$intersects 'ieval) #'intersect-ri)
> (setf (get '$min 'ieval) #'(lambda(x)(ri-lo x)))
> (setf (get '$max 'ieval) #'(lambda(x)(ri-hi x)))
>
> (setf (get '$sin 'ieval) #'intsin) ;; etc etc
>
> (defun maxima::$RealInterval(a b )(ri a b))
>
> ;; etc
> _______________________________________________
> Maxima mailing list
> Maxima at math.utexas.edu
> http://www.math.utexas.edu/mailman/listinfo/maxima
> .
>
>
What is the link on your web page is the interval package?
TIA,
-sen