Aiuto per una principiante ;)

di il
11 risposte

Aiuto per una principiante ;)

Ho scritto queste due righe, devo definire una funzione in n dimensioni, ho pensato di passare alla funzione un vettore x colonna di n componenti
function [phi]=fobiettivo(x);
phi=(x(1,1))^2+(x(2,1))^2;

però mi dà errore
Error in ==> C:\MATLAB6p5\work\fobiettivo.m
On line 2 ==> phi=(x(1,1))^2+(x(2,1))^2;

Non riesco a sbloccarmi (

11 Risposte

  • Re: Aiuto per una principiante ;)

    Quale valore di x stai passando alla funzione?
    (essendo x un vettore è sufficiente scrivere phi=x(1)^2+x(2)^2)
  • Re: Aiuto per una principiante ;)

    Grazie ma per quello ora credo di aver risolto, però il programma che sto tentando di scrivere mi va andare matlab in busy...Se te lo passo te saresti in grado di aiutarmi?
  • Re: Aiuto per una principiante ;)

    Va in busy se deve fare calcoli complessi. Nella maggior parte dei casi basta aspettare che finisca per avere il risultato... comunque se hai qualche dubbio scrivi qui, se posso ti aiuto.
  • Re: Aiuto per una principiante ;)

    Questo che vuol dire??

    Subscript indices must either be real positive integers or logicals.

    Error in ==> C:\MATLAB6p5\work\prova.m
    On line 20 ==> if f(x+alfa*dn)<f(x);
  • Re: Aiuto per una principiante ;)

    Probabilmente l'indice della f non è un valore intero come lui si aspetta.
  • Re: Aiuto per una principiante ;)

    Grazie alla fine poi ci sono arrivata.. però il mio codice non funziona lo stesso (( mi sa che è un problema di fondo nel senso che non riguarda matlab ma riguarda quello che devo studiare!
  • Re: Aiuto per una principiante ;)

    Fai funzionare il codice riga per riga per capire dov'è l'errore (o dove devi approfondire lo studio!). A presto!
  • Re: Aiuto per una principiante ;)

    Che errore è??
    Error in color/linetype argument.
  • Re: Aiuto per una principiante ;)

    Prova a postare la riga che ti da l'errore. Senza vedere il codice è difficile capire dov'è lo sbaglio...
  • Re: Aiuto per una principiante ;)

    X0=[4 -5]';
    x=x0;
    xit=x'
    f=fobiettivo(x)
    =grad(x);
    f2=hessiana(x);
    epsilon1=10^-6;
    k=0;
    while norm(f1)>epsilon1 & k<1000;
    dn=-(f2)^-1*f1;
    if '*dn>0;
    d=-f1;
    else
    d=dn;
    end;
    d=d/norm(d)
    h=0;
    epsilon2=10^-5;
    y=x;
    f1h=grad(y)
    f2h=hessiana(y)
    while abs(f1h'*d)/norm(d)>epsilon2 & h<1000;
    beta=-f1h'*d/(d'*f2h*d);
    ynew=y+beta*d
    h=h+1
    alfa=d'*(ynew-y)/norm(d)^2
    if fobiettivo(y+alfa*d)<fobiettivo(y)
    break;
    end;
    end;
    xnew=x+alfa*d
    k=k+1
    x=xnew
    xmin=[x(1,1);x(2,1)]
    xit=[xit;xmin']
    end;
    plot(xit)
    axis 'square'


    Non so se ci puoi capire però, 1)non mi esce mai dai cicli while a meno che non metto che il contatore deve essere minore di un certo valore 2) vorrei sapere come faccio a considerare la x della k-esima iterata 3) In ogni caso non mi fa quello che mi dovrebbe fare, si avvicina alla soluzione ma non la centra
  • Re: Aiuto per una principiante ;)

    Allora...
    1. Non esce dal ciclo while perché all'interno del ciclo la funzione che usi come controllo (f1) non cambia all'interno del ciclo, quindi norm(f1) avrà sempre lo stesso valore e quindi sarà sempre maggiore di epsilon.
    2. Per considerare la x della k-esima iterata la devi indicizzare. Se scrivi x(k), otterrai un vettore con tutti i valori di x al variare di k.
    3. Probabilmente il fatto che il ciclo while non fa quello che dovrebbe non aiuta ad ottenere il risultato corretto.
Devi accedere o registrarti per scrivere nel forum
11 risposte