Esercizio semplice con matlab
Si considerino i due polinomi
$p(x)=\sum_{i=0}^m p_ix^i, q(x)=\sum_{i=0}^n q_ix^i$,
di gradi m ed n rispettivamente. Il polinomio prodotto r(x) = p(x)q(x), ha grado m + n
e denotandolo con $r(x)=\sum_{i=0}^(m+n) r_ix^i$, i suoi coefficienti ri, i = 0, . . . ,m + n sono definiti come segue:
$r(i)=\sum_{k=0}^i g_k$
$g_k={(0, se k>m oppure i-k>n), (p_k q_(i-k), text{altrimenti}):}$.
Scrivere una function Matlab che, ricevuti in input due vettori p e q contenenti i coefficienti
$p_i$ e $q_i$ dei polinomi p(x) e q(x), rispettivamente, fornisca in output il vettore r contenente
i coefficienti $r_i$ del polinomio prodotto r(x) .
La function deve effettuare le seguenti operazioni:
• determinare le dimensioni m ed n dei vettori p e q;
• effettuare un ciclo per calcolare le componenti $r_i$ del vettore r.
L'esercizio l'ho svolto nel seguente modo, ma credo che ci sia qualche errore, mi potreste aiutare? grazie
function r=polinomio(p,q)
m=length(p);
n=length(q);
for i=0:m+n
for k=0:i
if k>m | i-k>n
g(k)=0;
else
g(k)=p(k)*q(i-k);
end
end
end
$p(x)=\sum_{i=0}^m p_ix^i, q(x)=\sum_{i=0}^n q_ix^i$,
di gradi m ed n rispettivamente. Il polinomio prodotto r(x) = p(x)q(x), ha grado m + n
e denotandolo con $r(x)=\sum_{i=0}^(m+n) r_ix^i$, i suoi coefficienti ri, i = 0, . . . ,m + n sono definiti come segue:
$r(i)=\sum_{k=0}^i g_k$
$g_k={(0, se k>m oppure i-k>n), (p_k q_(i-k), text{altrimenti}):}$.
Scrivere una function Matlab che, ricevuti in input due vettori p e q contenenti i coefficienti
$p_i$ e $q_i$ dei polinomi p(x) e q(x), rispettivamente, fornisca in output il vettore r contenente
i coefficienti $r_i$ del polinomio prodotto r(x) .
La function deve effettuare le seguenti operazioni:
• determinare le dimensioni m ed n dei vettori p e q;
• effettuare un ciclo per calcolare le componenti $r_i$ del vettore r.
L'esercizio l'ho svolto nel seguente modo, ma credo che ci sia qualche errore, mi potreste aiutare? grazie

function r=polinomio(p,q)
m=length(p);
n=length(q);
for i=0:m+n
for k=0:i
if k>m | i-k>n
g(k)=0;
else
g(k)=p(k)*q(i-k);
end
end
end
Risposte
C'è un errore nel modo in cui hai scritto length nella terza riga di codice.
per il resto sta bene o devo correggere qualcosa?
Non ho risposto prima perché non avevo Matlab sotto mano e volevo essere certo di ciò che ti stavo dicendo.
Prima di tutto gli indici in Matlab iniziano da 1 e non da 0, per cui p(0) è oltre i limiti dell'array e quindi viene restituito errore quando viene calcolato. Devi quindi aggiungere 1 a tutti gli indici nelle formule. Per cui i polinomi sono definiti da:
$p(x) = \sum_{i = 1}^{m+1} p_i x^{i-1}$
$q(x) = \sum_{i = 1}^{n+1} q_i x^{i-1}$
$r(x) = p(x)q(x) = \sum_{i = 1}^{m+1} \sum_{j = 1}^{n+1} p_i q_j x^{i + j - 2} = \sum_{i=1}^{m+n+1} r_i x^{i-1}$
Il secondo errore è che in effetti il tuo codice non fa quello che deve fare. O meglio non restituisce valori. La definizione dei coefficiente $r_i$ è comunque molto carente, in particolare quella dei $g_k$. Per il codice ci devo pensare un po' che devo riscrivere bene tutte le formule (per adeguarsi ai nuovi indici).
Prima di tutto gli indici in Matlab iniziano da 1 e non da 0, per cui p(0) è oltre i limiti dell'array e quindi viene restituito errore quando viene calcolato. Devi quindi aggiungere 1 a tutti gli indici nelle formule. Per cui i polinomi sono definiti da:
$p(x) = \sum_{i = 1}^{m+1} p_i x^{i-1}$
$q(x) = \sum_{i = 1}^{n+1} q_i x^{i-1}$
$r(x) = p(x)q(x) = \sum_{i = 1}^{m+1} \sum_{j = 1}^{n+1} p_i q_j x^{i + j - 2} = \sum_{i=1}^{m+n+1} r_i x^{i-1}$
Il secondo errore è che in effetti il tuo codice non fa quello che deve fare. O meglio non restituisce valori. La definizione dei coefficiente $r_i$ è comunque molto carente, in particolare quella dei $g_k$. Per il codice ci devo pensare un po' che devo riscrivere bene tutte le formule (per adeguarsi ai nuovi indici).
hai ragione ti ringrazio di avermi risposto, infatti una settimana fa circa il mio professore mi aveva detto a ricevimento che gli indici matlab iniziano da 1 e non da 0, me ne ero dimenticato, hai fatto benissimo a ricordarmelo, proprio oggi purtroppo sono stato bocciato alla prova di idoneità di matlab, (non per questo errore perchè l'esercizio riguardava un'altra cosa), cmq se continuo così finirò per non riuscire mai a passare la prova di idoneità di matlab, aspetterò pazientemente che tu mi dia la soluzione definitiva dell'esercizio, ciao e grazie tantissime
Dalla formula scritta in precedenza si ottiene facilmente
$r_k = \sum_{i + j - 1 = k} p_i q_j$
Un primo metodo è quindi quello di iterare su tutti gli i=1 : (m+1) e j=1 : (n+1) e aggiungere questo valore all'array $r$ precedentemente allocato. Il codice sarebbe semplicemente il seguente ($m$ ed $n$ nel codice sarebbero uguali a $m+1$ e $n+1$ nelle formule):
Mi pare comunque evidente che il tuo professore vuole calcolare i coefficienti $r_i$ in ordine e non tutti insieme come nel mio codice precedente. In questo caso si devono analizzare i termini $g_i$. Ogni $g_i$ non nullo corrisponde ad un termine $p_{i}*q_{k-i+1}$. Questi termini esistono nell'intervallo $\max(1, k - n):\min(k, m + 1)$.
$r_k = \sum_{i + j - 1 = k} p_i q_j$
Un primo metodo è quindi quello di iterare su tutti gli i=1 : (m+1) e j=1 : (n+1) e aggiungere questo valore all'array $r$ precedentemente allocato. Il codice sarebbe semplicemente il seguente ($m$ ed $n$ nel codice sarebbero uguali a $m+1$ e $n+1$ nelle formule):
function r = polinomio(p, q) m = length(p); n = length(q); r = zeros(1,m+n-1); for i=1:m for j=1:n r(i+j-1) += p(i)*q(j); end end
Mi pare comunque evidente che il tuo professore vuole calcolare i coefficienti $r_i$ in ordine e non tutti insieme come nel mio codice precedente. In questo caso si devono analizzare i termini $g_i$. Ogni $g_i$ non nullo corrisponde ad un termine $p_{i}*q_{k-i+1}$. Questi termini esistono nell'intervallo $\max(1, k - n):\min(k, m + 1)$.
function r = polinomio(p, q) m = length(p); n = length(q); r = zeros(1,m+n-1); for k=1:(m+n-1) for i=max(1,k-n+1):min(k,m) r(k) += p(i)*q(k-i+1); end end
scusa ma purtroppo non ho capito il ragionamenti che usi in entrambe le soluzioni, ti potresti spiegare meglio?
cmq quando definisci le sommatorie, secondo me hai fatto qualche errore di indice
"apatriarca":
$p(x) = \sum_{i = 1}^{m+1} p_i x^{i-1}$
$q(x) = \sum_{i = 1}^{n+1} q_i x^{i-1}$
$r(x) = p(x)q(x) = \sum_{i = 1}^{m+1} \sum_{j = 1}^{n+1} p_i q_j x^{i + j - 2} = \sum_{i=1}^{m+n+1} r_i x^{i-1}$
in realtà dovrebbe essere
$p(x) = \sum_{i = 1}^{m+1} p_(i-1) x^{i-1}$
$q(x) = \sum_{i = 1}^{n+1} q_(i-1) x^{i-1}$
$r(x) = p(x)q(x) = \sum_{i = 1}^{m+1} \sum_{j = 1}^{n+1} p_(i-1) q_(j-1) x^{i + j - 2} = \sum_{i=1}^{m+n+1} r_(i-1) x^{i-1}$
ho provato a far eseguire il tuo file e non esce il risultato che deve uscire, esce un risultato errato
Quale dei due? Che cosa hai inserito in input? Ricordati sempre che non è mai sufficiente dire che qualcosa non funziona. Nelle poche prove che ho fatto il codice aveva restituito il risultato corretto.
Il motivo per cui avevo scritto $p_i$ e non $p_{i-1}$ è che ho interpretato $p_i$ come l'$i$-simo elemento dell'array. Per cui se il tuo array è p = [2 3 4] allora il tuo polinomio è $p(1) + p(2)*x + p(3)*x^2 = 2 + 3x + 4x^2$. Come vedi l'indice dell'array è maggiore di quello dell'esponente in questo caso.
Il motivo per cui avevo scritto $p_i$ e non $p_{i-1}$ è che ho interpretato $p_i$ come l'$i$-simo elemento dell'array. Per cui se il tuo array è p = [2 3 4] allora il tuo polinomio è $p(1) + p(2)*x + p(3)*x^2 = 2 + 3x + 4x^2$. Come vedi l'indice dell'array è maggiore di quello dell'esponente in questo caso.