Sempre matlab
Assegnato un polinomio p(x) di grado n (con n + 1 coefficienti):
$p(x)=\sum_{i=0}^n p_ix^i = p_0 + p_1x + . . . + p_nx^n$
l’algoritmo di Horner calcola il valore assunto da p(x) in un punto $x_0$ nel seguente modo:
$p(x_0) = p_0 + x_0(p_1 + x_0(p_2 + x_0(p_3 + x_0(. . . x_0(p_(n-2) + x_0(p_(n-1) + x_0p_n))))))$.
Modificare l’algoritmo in modo da calcolare la derivata prima di un polinomio:
$p'(x) = \sum_{i=0}^n ip_ix^(i-1)$.
Scrivere una function Matlab che, ricevuti in input il vettore p contenente i coefficienti $p_i$
del polinomio p(x) ed un punto $x_0$, fornisca in output il valore che il polinomio derivata
prima assume nel punto $x_0$ (ovvero $p'(x_0)$).
La function deve effettuare le seguenti operazioni:
• determinare il grado n del polinomio p(x) (utilizzando la dimensione del vettore dei
coefficienti);
• applicare l’algoritmo di Horner per effettuare il calcolo del valore del polinomio
derivata prima nel punto assegnato $x_0$.
$p(x)=\sum_{i=0}^n p_ix^i = p_0 + p_1x + . . . + p_nx^n$
l’algoritmo di Horner calcola il valore assunto da p(x) in un punto $x_0$ nel seguente modo:
$p(x_0) = p_0 + x_0(p_1 + x_0(p_2 + x_0(p_3 + x_0(. . . x_0(p_(n-2) + x_0(p_(n-1) + x_0p_n))))))$.
Modificare l’algoritmo in modo da calcolare la derivata prima di un polinomio:
$p'(x) = \sum_{i=0}^n ip_ix^(i-1)$.
Scrivere una function Matlab che, ricevuti in input il vettore p contenente i coefficienti $p_i$
del polinomio p(x) ed un punto $x_0$, fornisca in output il valore che il polinomio derivata
prima assume nel punto $x_0$ (ovvero $p'(x_0)$).
La function deve effettuare le seguenti operazioni:
• determinare il grado n del polinomio p(x) (utilizzando la dimensione del vettore dei
coefficienti);
• applicare l’algoritmo di Horner per effettuare il calcolo del valore del polinomio
derivata prima nel punto assegnato $x_0$.
Risposte
L'algoritmo di Horner si implementa con una serie di multiply-add (operazioni del tipo $a + b*x$) partendo dalla parentesi più interna e poi proseguendo verso quella più esterna. La parentesi più interna è
$r_{n} = p_{n}$
$r_{n-1} = p_{n-1} + x r_n$
...
$r_0 = p_{0} + x r_1$
La derivata di $p$ è a questo punto semplicemente un polinomio di grado $n-1$ con coefficienti $q_i = (i+1)p_{i+1}$ e si può quindi applicare l'algoritmo sopra esposto ottenendo
$r_{n-1} = q_{n-1} = n p_{n}$
$r_{n-2} = q_{n-2} + x r_{n-1} = (n-1)p_{n-1} + x*r_{n-1}$
...
$r_0 = q_0 + x r_1 = p_1 + x r_1$
$r_{n} = p_{n}$
$r_{n-1} = p_{n-1} + x r_n$
...
$r_0 = p_{0} + x r_1$
La derivata di $p$ è a questo punto semplicemente un polinomio di grado $n-1$ con coefficienti $q_i = (i+1)p_{i+1}$ e si può quindi applicare l'algoritmo sopra esposto ottenendo
$r_{n-1} = q_{n-1} = n p_{n}$
$r_{n-2} = q_{n-2} + x r_{n-1} = (n-1)p_{n-1} + x*r_{n-1}$
...
$r_0 = q_0 + x r_1 = p_1 + x r_1$