Problema ciclo for

di il
3 risposte

Problema ciclo for

Salve a tutti,dovrei creare un ciclo for che mi dia
wr(k+1)=(Cm-Cr/J)(t(k+1)-t(k))+wr(k)
supponendo che siano noti Cm,Cr,J e t
Ho che k=0:0.001:0
devo creare un ciclo in cui wr(k) del ciclo successivo sarà la wr(k+1) calcolata precedentemente.

3 Risposte

  • Re: Problema ciclo for

    Ci sono alcune "inesattezze" nella domanda e nell'impostazione:

    [*] probabilmente è solo un errore di "battitura", ma k=0:0.001:0 equivale a k=0: il limite superiore è uguale a quello inferiore

    [*] ammesso di aver corretto la definizione di k non puoi usare k come indice per il vettore wr: k assume valori "reali" (double) mentre gli indici di un vettore devono essere "interi" (>0).
    Ricorda che in MatLab gli indici dei vettori cominciano da 1

    [*] lo stesso vale per t (ammesso che sia un vettore e non una funzione
    Puoi risolvere il problema dell'indicizzazione dei vettori utilizzando un contatore il quale, inizializzato a 1 prima del ciclo venga incrementato dopo ogni iterazione

    [*] dal momento che utilizzi wr "a destra" dell'uguale, devi inizializzarne il valore del primo elemento, altrimenti, nella prima iterazione, il valore di wr risulta indefinito (e genererà un errore).
    Non saprei suggerirti a quale valore inizializzarlo (ad esempio a 0?), dipende dall'algoritmo che vuoi implementare

    [*] tra (Cm-Cr/J) e (t(k+1)-t(k)) manca l'operatore. Intendi (Cm-Cr/J)*(t(k+1)-t(k))?

    [*] il valore k è usto solo come indice in t (sempre che sia un vettore) e in wr (per accedere al valore del ciclo precedente). In questo caso che senso ha farlo incrementare con un passo di 0.001? Quante iterazioni vuoi che faccia il ciclo for?
  • Re: Problema ciclo for

    Ti ringrazio per la risposta.

    Si, cmq vi era un errore di battitura. la mia domanda ora è essendo un errore scrivere k=0:0.001:1 come faccio a scrivere che k deve assumere valori da 0 ad 1, con un passo di 0.001??

    Provo ad essere più chiara su ciò che mi servirebbe capire.
    Se all'istante 0, quindi per k=0, avrò tk=0 e wr(k)=0, ottengo wr(k+1), ossia ottengo la wr nuova.
    Ad un certo istante che sarà 0.001 secondi, allora avrò tk=0.001 e wr(k) sarà la wr(k+1) calcolata in precedenza.
    In conclusione mi serve una formula iterativa che mi consenta di calcolare la nuova wr, partendo da quella dell' istante precedente.

    forse dovrei fare un ciclo for con if?
  • Re: Problema ciclo for

    Di per sè, impostare un ciclo for con k=0:0.001:1 non è sbagliato, il ciclo for in questo caso effettuerà 1001 iterazioni; il problema (l'errore) consiste nel fatto che, in questo caso, non puoi usare k come indice per il vettore wr perchè:
    [*] nella prima iterazione ==> wr(k) ==> wr(0) ==> errore: gli indici di un vettore devono essere interi positivi > 0
    [*] nella seconda iterazione ==> wr(k) ==> wr(0.001) ==> errore: gli indici di un vettore devono essere interi positivi > 0

    Come riportato nella precedente risposta, se vuoi impostare il ciclo con k=0:0.001:1 devi utilizzare un contatore come indice per i vettori ed incrementarlo ad ogni iterazione.

    Ad esempio:
    cont=1;
    wr(1)=1;
    for k=0:0.001:1
       wr(cont+1)=wr(cont)+k;
       cont=cont+1
    end
    
    Inoltre, nella prima domanda, hai scritto:
    wr(k+1)=(Cm-Cr/J)(t(k+1)-t(k))+wr(k)
    dove t sembrava essere un vettore, mentre oggi hai scritto:
    ... Ad un certo istante che sarà 0.001 secondi, allora avrò tk=0.001 ....
    ti rinnovo la domanda: cosa è t?

    Sembrerebbe che t non sia un vettore, ma una variabile (un tempo?) che assume i valori da 0 a 1 con passo 0.001.
    se è così, questo caso, t coincide con k; oltre a questo,
    t(k+1)-t(k)
    sarà costante ad ogni iterazione e corrisponderà all'incremento dell'indice del loop (0.001).

    Puoi confermare che "t" sia effettivamente il passo del loop (0.001)? e non un vettore?

    Da ultimo, assumo che, a parte le considerazioni sugli indici dei vettori,
    wr(k+1)=(Cm-Cr/J)(t(k+1)-t(k))+wr(k)
    stia per
    wr(k+1)=(Cm-Cr/J) * (t(k+1)-t(k))+wr(k)
    (in ogni caso, manca l'operatore tra (Cm-Cr/J) e (t(k+1)-t(k))

    Se ho capito quello che vuoi realizzare (e non ne sono affatto sicuro), una possibilità potrebbe essere quella che segue.

    Nota che, per rendere "eseguibile" il codice ho definito, in modo arbitrario valori delle costanti "Cm", "Cr" e "J".
    Ovviamente dovrai usare i "tuoi valori".

    Nota ancora, che bisogna inizializzare in qualche modo il vettore "wr"; nell'esempio l'ho inizializzato a 0.

    Per favore VERIFICA CHE L'IMPOSTAZIONE SIA CORRETTA, come ti ripeto, NON SONO SICURO DI AVER COMPRESO LA DOMANDA E L'ESEMOIO CHE SEGUE POTREBBE NON ESSERE CORRETTO

    % Inizializzazione del contatore
    cont=1;
    % Inizializzazione del vettore "wr"
    wr(1)=0;
    % Inizializzazione delle costanti "Cm", "Cr" e "J"
    Cm=1;
    Cr=2;
    J=3;
    for k=0:0.001:1
    %    wr(k+1)=(Cm-Cr/J)(t(k+1)-t(k))+wr(k)
       wr(cont+1)=(Cm-Cr/J)*(0.001)+wr(cont);
       % Incremento del contatore
       cont=cont+1;
    end
    
Devi accedere o registrarti per scrivere nel forum
3 risposte