Funzione di funzione

di il
12 risposte

Funzione di funzione

Ho una domanda: io ho usato la function solo con delle variabili, come posso invece mettere all’interno una seconda funzione? Nel senso che in uno script prima definisco una certa funzione che poi dovrà andare a lavorare nella function? Allego immagine per essere più chiaro

12 Risposte

  • Re: Funzione di funzione

    La domanda non è chiara.

    Pubblica direttamente il codice invece che un'immagine.

    Cosa hai scritto fino ad ora?
    Qual è il problema?

    Da quello che si capisce dalla figura, "Larghezza" e "risult" sono due funzioni sparate, che puoi scrivere in due file ".m".
    Il parametro "L" in input alla funzione "risult" viene calcolato dalla funzione "Larghezza" ed è disponibile nel workspace di MAtLab per cui è direttamente accessibile alla funzione "result"
  • Re: Funzione di funzione

    Questo è lo script, o per lo meno quello che voglio fare
    
    h = 500;
    
    function L = larghezza (x)
    L = 300-15*x;
    end
    
    dx = 0.01;
    n = 100;
    
    function C = risult(L,h,dx,n)
    C = 0;
     for i=1:n
         x = dx*(2*i-1)/2;
         eps = 0.004*(h/2-x)/(h/2);
         sigma = 20*(1-(1-eps/0.004)^2);
         % nella prox riga mi serve la L che ho trovato nella precedente funz
         % L e’ funzione della X che rappresenta la stessa quantita’
         C= C+L*dx*sigma;
      end
    end
    
    Sicuramente ci saranno degli errori dovuti al fatto che non so come comportarmi in una situazione del genere
  • Re: Funzione di funzione

    E' possibile dichiarare più funzioni nello stesso file .m, ma solo la prima viene vista dal workspace.

    La cosa più semplice che puoi fare è:
    [*] creare un "main file" che contenga la definizione delle variabili di inizializzazione e la chiamata alla funzione "risult" che sembra essere il punto di ingresso de tuo codice
    [*] creare un file .m nel quale inserire la funzione "risult" e salvalo con il nome della funzione (risult.m)
    [*] modificare la definizione della funzione "risult" eliminando il primo parametro "L" (che viene calcolato dalla funzione "larghezza"
    [*] aggiungere, nella funzione "risult" la chiamata alla funzione "larghezza nella funzione "risult" prima dell'utilizzo della variabile L
    [*] creare un file .m nel quale inserire la funzione "larghezza" e salvalo con il nome della funzione (larghezza.m)
    [*] chiamare la funzione risult dal main file
    [*] lanciare il mani file

    Prova ad eseguire il tutto in modalità debug e verifica che il codice funzioni correttamente.

    Di seguito un esempio dei tre files che devi creare; i commenti aggiunti dovrebbero spiegare le modifiche.

    main script
    
    
    dx = 0.01;
    n = 100;
    h = 500;
    
    %C = risult(L,h,dx,n)
    %
    % Call risult without the L parameter that is computed by the function
    % larghezza
    %
    C = risult(h,dx,n)
    
    funzione risult
    
    
    %function C = risult(L,h,dx,n)
    %
    % Define the function risult without the L parameter that is calculated by
    % the function larghezza called by the risult functioin
    %
    function C = risult(h,dx,n)
    C = 0;
     for i=1:n
         x = dx*(2*i-1)/2;
         eps = 0.004*(h/2-x)/(h/2);
         sigma = 20*(1-(1-eps/0.004)^2);
         % nella prox riga mi serve la L che ho trovato nella precedente funz
         % L e’ funzione della X che rappresenta la stessa quantita’
         %
         % calll larghezza
         %     
         L=larghezza(x)
         C= C+L*dx*sigma;
      end
    end
    
    funzione larghezza
    
    function L = larghezza (x)
    L = 300-15*x;
    end
    
  • Re: Funzione di funzione

    Non c'è un modo per mettere la funzione all'interno della lista delle variabili?
  • Re: Funzione di funzione

    Non capisco cosa intendi con "mettere la funzione all'interno della lista delle variabili".
    Hai due funzioni, "result" e "larghezza"; la prima chiama la seconda per ottenere il valore della variabile "L".
    Definire le due funzioni come nell'esempio riportato nella risposta precedente mi sembra la soluzione standard.
    Visto che la funzione "larghezza" è "semplice" potresti riportare il suo codice direttamente nella funzione "result", ma definirla come funzione a sè potrebbe essere essere utile nel caso in cui in latre parti del tuo codice dovessi avere bisogno di calcolare il valore della variabile "L".
  • Re: Funzione di funzione

    La voglio mettere dentro risult

    %function C = risult("larghezza",h,dx,n)
  • Re: Funzione di funzione

    Non mi sembra abbia alcun senso a meno che in altre chiamate alla funzione "result" tu non voglia passare come parametro il nome di un'altra funzione; in questo caso, dovresti descrivere esattamente cosa vorresti fare.

    Se passi il nome della funzione come stringa, in "result" devi comunque chiamare la funzione come descritto negli esempi precedenti.
    Se pensi di voler avere la possibilità di chiamare differenti funzioni in base al nome (passato come stringa) una possibilità potrebbe essere usare una serie di blocchi "if, else if" oppure, meglio, un blocco swithch.
    Anche in questo caso, però devi definire le varie funzioni come descritto precedentemente.

    Un'altra alternativa potrebbe essere definire dei function handle.

    In ogni caso tuttavia non puoi evitare di definire le funzioni.

    In mancanza di una spiegazione chiara di quello che vuoi fare, non credo di poter aggiungere altro.
  • Re: Funzione di funzione

    Io vorrei chiamare diverse funzioni "larghezza" all'interno della function "Result", dato che per me queste differenti versioni poi le uso in altre funzioni simili a result: di conseguenza non è conveniente fare tante result quante sono le versioni di larghezza ma avere una sola result che mi può lavorare con tutte le varie versioni.

    Vorrei fare una cosa del genere:
    function C = risult("larghezza",h,dx,n)
    .
    .
    .
    b = larghezza(x);
    .
    .
    end

    C = risult (larghezza_1, h, dx, n) <- qui vorrei che al posto di "larghezza" mi prendesse il valore di larghezza_1 quando vale x
  • Re: Funzione di funzione

    Come suggerito nella precedente risposta, in questo caso puoi passare il nome della funzione come stringa tra i parametri di input della funzione "risult".
    Nella funzione "risult" puoi gestire la chiamata alla funzione "larghezza" desiderata tramite un blocco "if-else" o, meglio, un blocco switch; ovviamente tutte le versioni della funzione "larghezza" devono essere definite separatamente.

    Chiamata alla funzione "risult":
    
    C = risult ('larghezza_1', h, dx, n)
    
    Nella funzione "risult":
    
    function C = risult(func_name,h,dx,n)
    %
    % codice della funzione
    % ...
    %
    
    % Selezione e chiamata della funzione "larghezza" definita in input
    switch(func_name)
        case 'larghezza_1'
            L=larghezza_1(x)
        case 'larghezza_2'
            L=larghezza_2(x)
        case 'larghezza_3'
            L=larghezza_3(x)
        otherwise
            disp('None funzione non valido')
    end
    %
    % altro codice della funzione
    % ...
    %
    
    
  • Re: Funzione di funzione

    Senza definirla prima non si può fare?
  • Re: Funzione di funzione

    Se il codice delle varie funzioni non è eccessivamente lungo lo si potrebbe inserire direttamente nei vari casi dello switch al posto della chiamata alla funzione.

    Detto questo, non capisco quale sia il problema nel definire delle funzioni invece di inserire del codice all'interno della funzione principale.
    Un codice "snello" è sicuramente più facilmente gestibile
  • Re: Funzione di funzione

    Va bene.
    TI ringrazio
Devi accedere o registrarti per scrivere nel forum
12 risposte