Funzione matlab

di il
2 risposte

Funzione matlab

Buongiorno,
non riesco a capire l'errore che mi dà questa funzione:
function x=Hxx(t)
Kt=60000;
Kn=20000;
x=s1(t)*(Kt*cos(phi1(t))+Kn*sin(phi1(t)))*sin(phi1(t))+s2(t)*(Kt*cos(phi2(t))+Kn*sin(phi2(t)))*sin(phi2(t));
con s1,s2,phi1,phi2 funzioni già definite in appositi m-file. Tutti compresa la Hxx dipendono da t.
Quando scrivo Hxx(0.01) mi dice "Subscript indices must either be real positive integers or logicals" e se metto 1 al posto dello 0.01 funziona. Come posso farlo funzionare anche con lo 0.01? Ringrazio in anticipo

2 Risposte

  • Re: Funzione matlab

    Il messaggio di errore che ottieni è tipico del caso nel quale si cerca di accedere ad una locazione di un vettore usando un indice non intero; ad esempio:
    % Definizione del vettore x
    x=[1 2 3 4 5]
    % Accesso corretto:
    y=x(3)
    % Accesso NON corretto:
    y=x(2.1)
    
    Messaggio di errore:

    Attempted to access x(2.1); index must be a positive integer or logical.
    Nel tuo caso, in base a quanto hai riportato, sembra che "Hxx" sia interpretato da MatLab come un vettore per cui:

    Hxx(0.01)

    viene interpretato come tentativo di accedere all'elemento in posizione "0.01" del vettore Hxx (analogamente a quanto succede nell'esempio riportato sopra nel caso nel quale si cerchi di accedere all'elemento "2.1) del vettore x); a conferma di questo, il fatto che se inserisci "1" al posto dio "0.01" non ottieni un messaggi di errore.

    Quello che puoi fare è:

    [*] leggere attentamente il messaggio di errore per verificare se (come dovrebbe) specifica quale sia la funzione che viene interpretata come vettore: potrebbe essere Hxx o un'altra delle funzioni che utilizzano "t" come parametro.
    [*] verificare se, per caso, tra i vari script che usi non ce ne sia uno nel quale hai creato un vettore di nome "Hxx" o con un nome uguale ad una delle altre tue funzioni
    [*] verificare che tutti i files delle tue funzioni siano in una cartella inserita nel "path" di MatLab

    Se pubblicassi il messaggio di errore completo che ottieni, forse si potrebbe provare a dare una risposta più precisa.
  • Re: Funzione matlab

    Ho trovato l'errore e sono riuscito a risolverlo.
    Non c'entra con l'argomento ma ora dovrei scrivere un'equazione differenziale di questo tipo:
    M*(D2x)+C*(Dx)+K*x(t) = b*H(t)*[x(t-tau)-x(t)]
    in cui M = m*I, C = 2*m*zeta*o*I, K = m*(o^2)*I ed I è la matrice identica. La H(t) è una matrice 2x2 con elementi Hxx, Hxy, Hyx, Hyy sempre in funzione di t e tutte e 4 hanno la funzione simile ad Hxx scritta sopra. Ho provato ad usare ode45 per la risoluzione ed ho omesso la tau perchè è il ritardo e per ora non sono in grado di aggiungerlo. Ho scritto in questo modo:
    function z=eqdiff(t,x)
    b = 1.000000000000000e-03;
    m = 0.013000000000000;
    z = 0.050000000000000;
    omegan = 4.885840000000000e+03;
    I = [1,3.637978807091713e-12;3.637978807091713e-12,1];
    M = m*I;
    C = 2*m*z*omegan*I;
    K = m*(omegan^2)*I;
    z = [x(2);((b*H(t)-K)/M)*x(1)-(C/M)*x(2)];
    end
    in un file M e poi sono andato nel workspace e ho digitato:
    [t,x] = ode45('eqdiff',[0,10],[1,2])
    e questi sono gli errori che si presentano:
    ??? Error using ==> vertcat
    CAT arguments dimensions are not consistent.

    Error in ==> eqdiff at 10
    z = [x(2);((b*H(t)-K)/M)*x(1)-(C/M)*x(2)];

    Error in ==> odearguments at 98
    f0 = feval(ode,t0,y0,args{:}); % ODE15I sets args{1} to yp0.

    Error in ==> ode45 at 172
    [neq, tspan, ntspan, next, t0, tfinal, tdir, y0, f0, odeArgs, odeFcn, ...
    Sapresti aiutarmi su come si utilizza la funzione ode? e poi come si può aggiungere la tau in questo caso? sapendo che tau è un numero finito che vale 0.012?
    Ti ringrazio in anticipo
Devi accedere o registrarti per scrivere nel forum
2 risposte