I polinomi sono definiti in modo ricorsivo utilizzando i coefficienti alpha
e norm2
dell'oggetto poly
che è stato creato. Diamo un'occhiata a un esempio:
z <- poly(1:10, 3)
attributes(z)$coefs
# $alpha
# [1] 5.5 5.5 5.5
# $norm2
# [1] 1.0 10.0 82.5 528.0 3088.8
per la notazione, chiamiamolo a_d
l'elemento nell'indice d
di alpha
e chiamiamolo n_d
l'elemento nell'indice d
di norm2
. F_d(x)
sarà il polinomio ortogonale del grado d
generato. Per alcuni casi di base abbiamo:
F_0(x) = 1/sqrt(n_2)
F_1(x) = (x-a_1)/sqrt(n_3)
Il resto dei polinomi sono ricorsivamente definito:
F_d(x) = [(x-a_d) * sqrt(n_{d+1}) * F_{d-1}(x) - n_{d+1}/sqrt(n_d) * F_{d-2}(x)]/sqrt(n_{d+2})
Per confermare con x=2.1
:
x <- 2.1
predict(z, newdata=x)
# 1 2 3
# [1,] -0.3743277 0.1440493 0.1890351
# ...
a <- attributes(z)$coefs$alpha
n <- attributes(z)$coefs$norm2
f0 <- 1/sqrt(n[2])
(f1 <- (x-a[1])/sqrt(n[3]))
# [1] -0.3743277
(f2 <- ((x-a[2]) * sqrt(n[3]) * f1 - n[3]/sqrt(n[2]) * f0)/sqrt(n[4]))
# [1] 0.1440493
(f3 <- ((x-a[3]) * sqrt(n[4]) * f2 - n[4]/sqrt(n[3]) * f1)/sqrt(n[5]))
# [1] 0.1890351
Il modo più compatto per esportare i polinomi al tuo codice C++ sarebbe probabilmente quello di esportare attributes(z)$coefs$alpha
e attributes(z)$coefs$norm2
e quindi utilizzare la formula ricorsiva in C++ per valutare i tuoi polinomi.
Puoi aggiungere un [esempio riproducibile] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) con alcuni dati di esempio e mostrare esattamente cosa sei tu? stai cercando di estrarre? – MrFlick