Codice Matlab

Sk_Anonymous
Salve, ho scritto un codice per la costruzione di un vettore (codice che successivamente dovrei richiamare in un altro codice che implementa un metodo numerico) ma i risultati che ottengo con il Matlab non coincidono con i risultati che ottengo con carta e penna. Il mio vettore deve contenere numeri della forma $\gamma=k+j*\alpha$ con $k,j\in\mathbb{N}$ e tali che $\gamma\leq (p-1)$, a partire da certi $\alpha$ e $p$ che fornisco in input. Vi riporto il codice.

function [a]=gam(alpha,p)

a=0:1:p-1 %costruisco il vettore degli elementi $0, 1, 2,..., p-1$ che corrispondono al caso j=0
j=1; %inizializzazione di j

%a questo punto comincio a lavorare su valori di j diversi da zero
for i=1:(p-1) 
    n=a(i)+j*alpha;
    
    while (n<=(p-1))
        a(end+1)=n;
        j=j+1; 
    end
    
    i=i+1;
end



in realtà ho provato a implementare il codice in modi diversi, anche con delle modifiche rispetto a quello che vi lascio, ma non ottengo mai il risultato atteso. Voi ci vedete qualcosa di strano? Se volete provarci, potete testare nel caso $p=3$ e $\alpha=0.7$:il mio vettore dovrebbe essere, a meno di miei errori di calcolo, il seguente $[0,0.7,1, 1.4,1.7,2 ]$. Spero che mi aiutiate a capire dove sbaglio! Grazie!

Risposte
Raptorista1
Ciao, due osservazioni.
1. Il ciclo while dipende da \(n\), che però non viene aggiornata all'interno del ciclo e quindi il ciclo è infinito
2. La variabile \(j\) credo debba essere resettata dentro il ciclo for da qualche parte, giusto?

Sk_Anonymous
Sì, effettivamente...

ho provato a correggere nel modo che segue:

function [a]=gam(alpha,p)

a=0:1:p-1 %costruisco il vettore degli elementi $0, 1, 2,..., p-1$ che corrispondono al caso j=0

%a questo punto comincio a lavorare su valori di j diversi da zero
for i=1:(p-1)
j=1;
n=a(i)+j*alpha;
while (n<=(p-1))
a(end+1)=n;
j=j+1;
n=a(i)+j*alpha;
end

end
Nel caso considerato prima, ossia per $p=3$ e $\alpha=0.7$ il risultato coincide, quindi penso sia corretto. Infatti:

>> [a]=gam(0.7,3)

a =

0 1.0000 2.0000 0.7000 1.4000 1.7000

A questo punto direi che il codice pu$ò$ andare, oppure ci sono delle migliorie da fare?

Raptorista1
Il caso \(i = p-1\) del ciclo for è superfluo e può essere rimosso.
Potresti mettere il codice in un ambiente appropriato, come ho fatto io modificando il tuo messaggio iniziale.
Perché metti le lettere accentate come formule??

Sk_Anonymous
Scusami! Farò più attenzione dal prossimo messaggio!

Ho provato a rimuovere il caso $i=p-1$ ma ottengo un risultato diverso:perdo l'ultimo elemento del vettore. Quindi l'ho reinserito e penso che lascerò il codice così.

Grazie mille per l'aiuto!

Raptorista1
"Annarella87":

Ho provato a rimuovere il caso $i=p-1$ ma ottengo un risultato diverso:perdo l'ultimo elemento del vettore. Quindi l'ho reinserito e penso che lascerò il codice così.

Non dovrebbe essere così: quando \(i = p-1 = 2\) non puoi ottenere l'elemento \(1.7\)...
Va beh, se funziona è comunque risolto :)

Sk_Anonymous
Sì, lascio così.
Grazie di nuovo per l'aiuto!

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