59 lines
2.4 KiB
Scheme
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))))
|