racket/collects/plot/fit.ss
2005-05-27 18:56:37 +00:00

59 lines
2.4 KiB
Scheme

(module fit mzscheme
(require (lib "math.ss" "plot"))
(require (lib "fit-low-level.ss" "plot"))
; a structure contain a the results of a curve-fit
(define-struct fit-result (
rms
variance
names
final-params
std-error
std-error-percent
function
) (make-inspector))
; fit-int : (number* -> number) (list-of (symbol number)) (list-of (vector number [number] number number)) -> fit-result
(define (fit-int function guesses data)
(let* ((independant-vars (- (procedure-arity function) (length guesses)))
(f-of-x-y (cond
[(= 1 independant-vars)
(lambda (x y . rest)
(apply function x rest))]
[(= 2 independant-vars)
function]
[else
(error "Function provided is eitehr not of one or two independant variables or the number of
guesses given is incorrect")]))
(x-vals (map vector-x data))
(y-vals (if (= 1 independant-vars)
x-vals
(map vector-y data)))
(z-vals (if (= 1 independant-vars)
(map vector-y data)
(map vector-z data)))
(err-vals (if (= 1 independant-vars)
(map vector-z data)
(map (lambda (vec) (vector-ref vec 4)) data)))
(result (fit-internal f-of-x-y x-vals y-vals z-vals err-vals (map cadr guesses))))
(if (null? result)
null
(begin
;(display result)
(make-fit-result
(list-ref result 3)
(list-ref result 4)
(map car guesses)
(car result)
(cadr result)
(caddr result)
(lambda args (apply function(append args (car result)))))))))
(provide fit-int (struct fit-result (rms
variance
names
final-params
std-error
std-error-percent
function))))