Dunque, un passo alla volta e riusciremo a venire a capo di questo problema
Innanzi tutto,
penso di aver capito (non del tutto, ma quasi) quello che mi hai risposto
cosa non era chiaro nella risposta?
Provo a chiarire meglio il procedimento partendo dalla funzione "eq" dell'esempio.
function vprime = eq(t,v)
vprime(1,1)=15*v(2);
vprime(2,1)=v(1);
end
Partendo dalla funzione "eq" ho scritto la funzione
eq_1 nella quale ho utilizzato "
varargin" e "
nargin":
[*]
varargin è un
cellarray all'interno del quale vengono inseriti i parametri di input passati alla funzione
[*]
nargin è un contatore nel quale viene settato il numero dei parametri di input (numero degli elementi di
varargin)
Ho anche modificato la definizione degli output della funzione, aggiungendo la variabile "
err_msg" che verrà utilizzata per memorizzare eventuali messaggi di errore generati dalla funzione.
La funzione "
eq_1" è quindi definita come:
function [vprime,err_msg] = eq_1(varargin)
gli input
(t,v) della funzione "
eq" sono stati quindi sostituiti da "
varargin"
La funzione "
eq_1" è strutturata più o meno allo stesso modo rispetto a quella della risposta precedente, con l'esclusione del controllo sulla validità degli input.
il primo "
if" ed il successivo "
elseif" effettuano un controllo sul numero dei parametri di input (nargin).
Il set di istruzione contenute nel secondo "
elseif" corrispondono alla definizione della funzione "
eq":
[*] alle variabili "
t" e "
v" vengono assegnati i valori dei primi due elementi del cellarray
varargin
[*] viene poi utilizzata la variabile "
param_esterno" alla quale viene assegnato il valore "15" (così come nella funzione "eq" il valore 15 era "hard coded").
Se la funzione "
eq_1" viene chiamata nel modo seguente:
[vprime,err_msg]=eq_1(t,v)
la condizione del secondo "elseif" sarà verificata, verranno settate le variabili come descritto sopra e l'esecuzione della funzione "salterà" fino al blocco "
if"
if(go_flg)
dove verranno effettuati i calcoli utilizzando il valore "15" (memorizzato nella variabile "
param_esterno" - in questo caso, il funzionamento di "eq" e "eq_1" è identico)
Se la funzione "
eq_1" viene chiamata nel modo seguente:
[vprime,err_msg]=eq_1(t,v,ext_param)
e se, in precedenza alla variabile "
ext_param"è stato assegnato, ad esempio il valore "
33" (o se, in alternativa, la funzione viene chiamata inserendo il valore "33" direttamente nella chiamata:
[vprime,err_msg]=eq_1(t,v,33)), sarà la condizione del terzo "
elseif" ad essere verifica.
Questo comporterà che, come per il caso precedente:
[*] alle variabili "
t" e "
v" vengono assegnati i valori dei primi due elementi del cellarray
varargin
[*] alla variabile "
param_esterno" verrà assegnato il valore contenuto nel terzo elemento di "
varargin" (terzo parametro di input nella chiamata)
Anche in questo caso l'esecuzione della funzione "salterà fino al blocco "
if"
if(go_flg)
ma, a differenza del caso precedente, la variabile "
param_esterno" non conterrà più il valore "15", ma il valore definito dall'utente.
L'ultimo "
else" della funzione "eq_1" è stato inserito solo per illustrare come accedere ad eventuali altri parametri di input contenuti in "
varargin", ma dal punto di vista dell'esecuzione dei calcoli, non si differenzia dal caso precedente.
All'interno della definizione della funzione "eq_1" sono state inserite delle istruzioni "
disp " le quali scriveranno dei messaggi di stato nella Command Window.
Il codice della funzione "eq_1" è riportato di seguito; dopo di esso ho inserito il codice di uno script che chiama la funzione "eq" e, poi, la funzione "eq_1" nelle diverse modalità descritte in precedenza.
Se questo script viene eseguito in "
modalità debug" e se si effettuerà uno step alla volta ("entrando nella funzioni "
eq" e "
eq_1" -
F11) dovrebbe essere abbastanza chiaro il funzionamento delle funzione "
eq_1".
Inoltre, i messaggi di stato che vengono scritti nella Command Window, dovrebbero ulteriormente chiarire il funzionamento della funzione "eq_1".
Codice della funzione "eq_1"
function [vprime,err_msg] = eq_1(varargin)
%
% Inizializzazione del vettore di output "vprime", del messaggio di errore
% e del flag per l'interruzione dell'esecuzione della funzione in caso di
% errore
%
vprime=zeros(2,1)*NaN;
err_msg='Nessun errore nella definizione dei parametri di input';
go_flg=1;
%
% Se la funzione viene chiamata senza specificare alcun parametro, viene
% generato un messaggio di errore ed il flag di controllo viene settato a
% "0" il che impedirà l'esecuzione dei calcoli
%
if(nargin == 0)
err_msg='Function eq_1 - ERROR #1: Nessun input specificato';
go_flg=0;
%
% Se la funzione viene chiamata specificando solo un parametro, viene
% generato un messaggio di errore ed il flag di controllo viene
% settato a "0" il che impedirà l'esecuzione dei calcoli
%
elseif(nargin < 2)
err_msg='Function eq_1 - ERROR #2: Numero di input insufficiente';
go_flg=0;
elseif(nargin == 2)
%
% Se la funzione viene chiamata specificando 2 parametri, questi
% vengono assegnati alle variabili "t" e "v" ed il valore "15" viene
% assegnato alla variabile (interna alla funzione) "param_esterno
%
t=varargin{1};
v=varargin{2};
param_esterno=15;
elseif(nargin == 3)
%
% Se la funzione viene chiamata specificando 3 parametri, i primi due
% vengono assegnati alle variabili "t" e "v", il terzo viene
% assegnato alla variabile (interna alla funzione) "param_esterno"
%
t=varargin{1};
v=varargin{2};
param_esterno=varargin{3};
else
%
% Se la funzione viene chiamata specificando più di tre parametri, i
% primi due vengono assegnati alle variabili "t" e "v", il terzo
% viene assegnato alla variabile (interna alla funzione)
% "param_esterno". Gli altri parametri vengono ignorati
%
t=varargin{1};
v=varargin{2};
param_esterno=varargin{3};
disp('Numero di parametri eccessivo')
disp(['Il terzo parametro ' num2str(varargin{3}) ' verrà utilizzato come parametro esterno'])
disp('gli altri parametri ')
for i=4:nargin
disp([' Parametro #' num2str(i) '=' num2str(varargin{i})])
end
disp('non verranno utilizzati');
end
%
% Il valore "15" viene sostituito dalla variabile "param_esterno" che, a
% seconda del numero dei parametri con i quali la funzione è stata chiamata
% assumerà il valore "15" (valore di default) od il valore specificato
% nelle chiamata alla funzione
%
% L'esecuzioe dei calcoli della funzione è condizionato all'assenza di
% errori nella definizione dei parametri di input
%
if(go_flg)
vprime(1,1)=param_esterno*v(2);
%
% Stampa a video del valore utilizzato come parametro
%
disp(['Calcolo effettuato utilizzando come "parametro" il valore ' num2str(param_esterno)])
vprime(2,1)=v(1);
end
% end
Codice dello script per le diverse chiamate delle funzioni "eq" e "eq_1"
%
% Definizione del parametro "t"
% Definizione del vettore "v" utilizzato % all'interno della funzione
%
t=42;
v=[10 20];
%
% Chiamata della funzione "eq" (come scritta nella dimanda); la funzione
% utilizxa il valore "15" "hard coded" nella funzione
%
disp('Chiamata: vprime=eq(t,v)')
vprime=eq(t,v);
vprime
disp(' ')
disp('**************************')
disp(' ')
%
% Chiamata alla funzione "eq_1" modificata (rispetto alla "eq") con
% l'inserimento delle istruzioni per la gestioine dinamica dei parametri.
% La funzione viene chiamata con due soli parametri ed utilizza, di default
% il valore "15". Il risultato è lo stesso che si ottiene chiamado la
% funzione "eq"
%
disp('Chiamata: vprime=eq_1(t,v)')
[vprime,err_msg]=eq_1(t,v);
vprime
disp(err_msg)
disp(' ')
disp('**************************')
disp(' ')
%
% Definizione del parametro esterno "ext_param": il valore 33 sostituirà il
% valore di default "15" all'interno della funzione senza che si debba
% modificare il codice della funzione "eq_1". La chiamata della funzione
% "eq_1" è diversa da quella precedente, per l'aggiunta del terzo parametro
%
disp('Chiamata: vprime=eq_1(t,v,ext_param)')
ext_param=33;
[vprime,err_msg]=eq_1(t,v,ext_param);
vprime
disp(err_msg)
disp(' ')
disp('**************************')
disp(' ')
%
% Per verifica della correttezza dell'implementazine della la funzione "eq_1", la stessa viene chiamata:
% - senza parametri ==> ci si aspetta un messaggio di errore
% - con un solo parametro ==> ci si aspetta un messaggio di errore
% - con 7 parametri ==> ==> ci si aspetta un messaggio di warning, ma il
% risultato deve essere uguale a quello ottenuto chiamado la funzione
% con tre parametri, l'ultimo dei quali deve essere "ext_param". In
% questa chiamata il valore del parametro "ext_param" è stato modificato
% da "33" (chiamata precedente) a 369, per illustrare la possibilità di
% cambiarlo "a piacere" (ad esempio all'interno di un loop)
%
disp('Chiamata: vprime=eq_1()')
[vprime,err_msg]=eq_1();
vprime
disp(err_msg)
disp(' ')
disp('**************************')
disp(' ')
%
disp('Chiamata: vprime=eq_1(t)')
[vprime,err_msg]=eq_1(t);
vprime
disp(err_msg)
disp(' ')
disp('**************************')
disp(' ')
%
disp('Chiamata: vprime=eq_1(t,v,ext_param,1.2,3.3,42,69)')
ext_param=369;
[vprime,err_msg]=eq_1(t,v,ext_param,1.2,3.3,42,69);
vprime
disp(err_msg)
Spero che questo esempio sia più chiaro e, soprattutto, aiuti a risolvere il problema.
Let me know