Aiuto per una principiante ;)

di Anonimizzato9596 il
11 risposte
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

  • Quale valore di x stai passando alla funzione?
    (essendo x un vettore è sufficiente scrivere phi=x(1)^2+x(2)^2)
  • 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?
  • 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.
  • 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);
  • Probabilmente l'indice della f non è un valore intero come lui si aspetta.
  • 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!
  • Fai funzionare il codice riga per riga per capire dov'è l'errore (o dove devi approfondire lo studio!). A presto!
  • Che errore è??
    Error in color/linetype argument.
  • Prova a postare la riga che ti da l'errore. Senza vedere il codice è difficile capire dov'è lo sbaglio...
  • 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
  • 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