Files
2025-05-04 11:46:54 +03:00

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