78 lines
2.5 KiB
Plaintext
78 lines
2.5 KiB
Plaintext
; Linear regression calculator in N8A for n808 VM
|
|
; Enter the pairs number by number, end with 0,0 pair
|
|
; The program will then output A and B parameters of A + Bx
|
|
; linear function and then the correlation coefficient r
|
|
; Created by Luxferre in 2025, released into public domain
|
|
|
|
; variable/constant definitions
|
|
#1 xi ; data x component
|
|
#2 yi ; data y component
|
|
#3 xs ; xi squared
|
|
#4 ys ; yi squared
|
|
#5 xy ; xy
|
|
#6 buf ; buffer
|
|
#7 r1 ; r-coefficient buffer 1
|
|
#8 r2 ; r-coefficient buffer 2
|
|
#10 Sxi ; x sum
|
|
#11 Syi ; y sum
|
|
#12 Sxx ; x squared sum
|
|
#13 Syy ; y squared sum
|
|
#14 Sxy ; xy sum
|
|
#15 n ; data element counter
|
|
#16 A ; coefficient A
|
|
#17 B ; coefficient B
|
|
#18 RC ; coefficient R
|
|
; zero out all sums
|
|
dca 0 @Sxi
|
|
dca 0 @Syi
|
|
dca 0 @Sxx
|
|
dca 0 @Syy
|
|
dca 0 @Sxy
|
|
dca 0 @n
|
|
; data input loop
|
|
:lp inp @xi @yi ; loop start, input xi and yi pair
|
|
dva @xi @xs ; prepare x
|
|
mul @xs @xs ; square x
|
|
dva @yi @ys ; prepare y
|
|
mul @ys @ys ; square y
|
|
dva @yi @xy ; prepare y
|
|
mul @xi @xy ; save xy
|
|
add @xi @Sxi ; update x sum
|
|
add @yi @Syi ; update y sum
|
|
add @xs @Sxx ; update x squared sum
|
|
add @ys @Syy ; update y squared sum
|
|
add @xy @Sxy ; update xy sum
|
|
inc @n ; increment element count
|
|
add @ys @xs ; add y-squared to x-squared
|
|
jgt @xs :lp ; loop back if the square sum is over zero
|
|
dec @n ; decrement last n to omit the (0,0) input
|
|
; processing and output part
|
|
dva @n @buf ; n => buffer
|
|
mul @Sxy @buf ; n * Sxy => buffer
|
|
dva @Syi @r1 ; Syi => r-buffer 1
|
|
mul @Sxi @r1 ; Sxi * Syi => r-buffer 1
|
|
sub @buf @r1 ; n * Sxy - Sxi * Syi => r-buffer 1 (to be stored)
|
|
dva @n @buf ; n => buffer
|
|
mul @Sxx @buf ; n * Sxx => buffer
|
|
dva @Sxi @r2 ; Sxi => r-buffer 2
|
|
mul @r2 @r2 ; Sxi squared => r-buffer 2
|
|
sub @buf @r2 ; n * Sxx - Sx^2 => r-buffer 2 (to be stored)
|
|
dva @r2 @B ; prepare coefficient B
|
|
div @r1 @B ; store coefficient B
|
|
dva @Sxi @buf ; copy Sxi to buffer
|
|
mul @B @buf ; B * Sxi => buffer
|
|
sub @Syi @buf ; Syi - B * Sxi => buffer
|
|
dva @n @A ; prepare coefficient A
|
|
div @buf @A ; calculate coefficient A
|
|
dva @Syi @buf ; Syi => buffer
|
|
mul @Syi @buf ; Syi squared => buffer
|
|
dva @n @xi ; reuse xi for the second buffer
|
|
mul @Syy @xi ; n * Syy => second buffer
|
|
sub @xi @buf ; n * Syy - Sy^2 => buffer
|
|
dva @r2 @xi ; r-buffer 2 to xi
|
|
mul @buf @xi ; buffer * xi => xi
|
|
sqr @xi @RC ; sqrt(xi) => prepare RC
|
|
div @r1 @RC ; calculate correlation coefficient
|
|
out @A @RC ; output all three resulting numbers
|
|
|