Novizio ed inesperto

di il
5 risposte

Novizio ed inesperto

Buongiorno a tutti! ho cominciato ieri a vedere come funziona matlab e quindi ho solo qualche nozione di base, stavo provando a vedere di far funzionare qualcosa ma non capisco come mai, non parte il run del seguente script:

a=-10; b=5;
while abs(a-b)>0.0000001
x=(a+b)/2;
f=x-2;
if abs(f)<0.00000001
break
elseif f<0
x=a;
else
x=b;
end
end
x=(a+b)/2

quando faccio run non fa nulla, non da errori ne mi da x non capisco come mai! qualche buona anima mi direbbe cosa sto sbagliando? grazie in anticipo ragazzi

5 Risposte

  • Re: Novizio ed inesperto

    Benvenuto in MatLab

    Cosa intendi con
    non parte il run del seguente script ...

    quando faccio run non fa nulla, non da errori ne mi da x non capisco come mai
    In realtà lo script "parte" e fa tanto (tantissimo); in particolare entra nel ciclo while e non ne esce più perchè nello script c'è un "baco" fondamentale, ma molto semplice da individuare.

    Non "vedi" niente (a schermo - nella Command Window) perchè all'ìinterno del ciclo "while" non ci sono istruzioni che stampino qualcosa a video (es. disp) e tutte le istruzioni terminano con ";" (se cancelli ";" il valore dell'espressione viene scritto a schermo).
    Se cancelli i ";" vedrai che "qualcosa" viene scritto (... dopo un po' premi "Ctrl+C ...).

    Prova ad aggiunge prima dell'istruzione while abs(a-b)>0.0000001

    k=0

    Inserisci, poi, prima dell'istruzione x=(a+b)/2 l'struzione (senza ";")

    k=k+1

    Cosa succede?
    Lo script "fa qualcosa"?

    Per scoprire il baco, prova a "debuggare" lo script ed a vedere quali valori assumono le variabili.

    Comincia a mettere un breakpoint all'istruzione x=(a+b)/2; e poi esegui il codice una riga alla volta (premi F10).

    Cosa succede?
    Che valori assumono le variabili "x" e "f" al termine di ogni iterazione?
    Quali sono le condizioni che consentono di "uscire" dal ciclo while?
    Perchè queste condizioni non si verificano?

    Fammi sapere se sei riuscito a trovare il baco o se hai bisogno di ulteriori informazioni (visto che hai cominciato da poco a programmare in MatLab, è importante che tu accumuli esperienza anche nella ricerca degli errori e nell'uso del debug).

    Hope this helps.
  • Re: Novizio ed inesperto

    Raf ti ringrazio molto adesso so anche dell'esistenza del debugger!! l'errore era nelle istruzioni, ho scoperto che la variabile è a sx di un = e il valore che assume è a dx, pertanto nell'algoritmo di bisezione elementare che avevo scritto dire x=a bloccava tutto li perchè a,b ed x non venivano mai riassegnati!!

    invertendo con a=x o b=x si è sistemato tutto!!
  • Re: Novizio ed inesperto

    costa ha scritto:


    ho scoperto che la variabile è a sx ...
    Scusa ... e quando hai scritto

    x=(a+b)/2;

    cosa pensavi di avere fatto?
  • Re: Novizio ed inesperto

    Avevo capito male il modo di operare, dal momento che a e b le avevo definite prima del ciclo pensavo che potessero essere riassegnate anche con x=a o x=b, mentre con x=(a+b)/2 volevo il valore assunto con gli ultimi a e b, dico la verità non ho mai utilizzato linguaggi di programmazione sebbene io sia all ultimo anno di ingegneria.

    Ho sempre svolto tutto con excel, che fossero cicli iterativi o qualsiasi altra cosa, ora però sto svolgendo una colonna di distillazione e mi trovo con una decina di fogli di calcolo che si iterano l uno con l'altro e alla fine di ogni giro devo fare copia-incolla di 4 colonne di dati per poi riprendere i valori finali e così via fino a quando uno specifico valore che si riferisce ad una funzione da minimizzare va a d 1 con un errore di circa 10^-5. Funziona molto bene ma ora devo fare ripartire le iterazioni con un altra cartella ed in base ai valori che ottengo da un altra serie di matrici inverse volte vettori composizione riutilizzare le portate di vapore che saranno ridefinite nel ciclo di cui parlavo prima e ripartire. Le cose funzionano ma è lungo e soprattutto noioso

    Per questo ho deciso di vedere se riesco a scriverlo su matlab, però sono davvero alle primissime armi. So perfettamente che giri deve fare un ipotetico programma (perchè al momento sono io il ciclo while/if su excel ) e so già che i problemi saranno dovuti a comandi scritti male, quindi sto vedendo di capire le cose di base e domani provo a cominciare qualcosina, spero di poter essere aiutato un poco dagli esperti del forum!

    Se ho capito bene i valori assegnati alle variabili sono riassegnati ogniqualvolta scrivo un comando che le cambia, eliminando la memoria dei valori che avevano prima del comando o del ciclo corretto?

    quindi se per esempio comincio con un vettore temperature e lo butto in un ciclio while che mi torna un altro vettore temperature, se poi io mi riferisco al vettore temperature matlab utilizzerà quello uscito dal ciclo corretto?

    grazie ragazzi e scusate se ho dubbi base base!
  • Re: Novizio ed inesperto

    Negli script le variabili mantengono il valore loro assegnato fino a quando non ne viene riassegnato un'altro e sono "visibili" da tutti gli script.
    Fanno eccezione le funzioni.
    Le variabili "interne" (locali) delle funzioni conservano il loro valore solo per il tempo nel quale la funzione viene eseguita ed il loro valore (la variabile stessa, in realtà) è "visibile" solo all'interno della funzione stessa.
    E' possibile, ad esempio definire due funzioni le quali usino, al loro interno, la variabile (locale) "x".
    E' anche possibile, però, definire delle variabili "globali" (istruzione "global").

    Per informazioni dettagliate sulla "visibilità" (scope) delle variabili in MatLab, si può fare riferimento alla documentazione MatLab (disponibile anche on-line: http://it.mathworks.com/help/matlab/matlab_env/what-is-the-matlab-workspace.html

    Non lasciarti scoraggiare dalle prime difficoltà
Devi accedere o registrarti per scrivere nel forum
5 risposte