Esercizio semplice con matlab

serway2
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 :D

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
apatriarca
C'è un errore nel modo in cui hai scritto length nella terza riga di codice.

serway2
per il resto sta bene o devo correggere qualcosa?

apatriarca
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).

serway2
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

apatriarca
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):
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

serway2
scusa ma purtroppo non ho capito il ragionamenti che usi in entrambe le soluzioni, ti potresti spiegare meglio?

serway2
cmq quando definisci le sommatorie, secondo me hai fatto qualche errore di indice

serway2
"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}$

serway2
ho provato a far eseguire il tuo file e non esce il risultato che deve uscire, esce un risultato errato

apatriarca
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.