Pagina 1 di 1

Doppia funzione integrale in Matlab

Inviato: 20 set 2022, 19:55
da Ianero
Ciao a tutti,
una domanda che ho ridotto all'osso isolando il problema...
Non capisco perché questo codice da errore all'ultima istruzione:

Codice: Seleziona tutto

f = @(t)integral( @(xi)sign(xi).*exp(-1./(1-(xi-t).^2)),t-1,t+1 );
integral( @(t)f(t),-1,1 )


Dice che gli estremi di integrazione nella seconda istruzione non sono scalari :roll:
Qualcuno vede il perché o avrebbe magari modo di provarlo?

Grazie in anticipo.

Re: Doppia funzione integrale in Matlab

Inviato: 21 set 2022, 11:00
da RenzoDF
Per far accettare gli scalari devi specificare

Codice: Seleziona tutto

'ArrayValued',true

poi, quello che faccio di solito, per chiarezza di codice, è separare la funzione dalle integrazioni, qualcosa del genere, per esempio

Codice: Seleziona tutto

f =@(x,t) x+t^2;
integral(@(t) integral(@(x) f(x,t),t-1,t+1),-1,1,'ArrayValued',true)

Re: Doppia funzione integrale in Matlab

Inviato: 21 set 2022, 13:51
da Ianero
Ti ringrazio come sempre, ora gira.
Non capisco perché la flag ArrayValued debba essere alzata, perché la mia funzione non lo è. :^o

Re: Doppia funzione integrale in Matlab

Inviato: 23 set 2022, 18:28
da RenzoDF
Come ti avevo scritto (e poi cancellato) ieri, basta pensare che ArrayValued deve essere "alzata" anche per integrare (numericamente)

Codice: Seleziona tutto

f =@(x) 5;

:mrgreen:

BTW Perché non hai usato

Codice: Seleziona tutto

integral2 ...

per il tuo integrale doppio? In quel caso non serviva "alzarla". ;-)

Re: Doppia funzione integrale in Matlab

Inviato: 25 set 2022, 10:58
da Ianero
La tua risposta è chiara, grazie. Ciò che non è chiaro è a cosa pensava la Mathworks quando ha scritto “arrayValued”, perché neanche la funzione 5 lo è, però fa niente basta che gira e fa quello che mi serviva.
Per la seconda parte, il motivo è perché nel mio codice originale l’integrale più interno aveva gli estremi di integrazione dipendenti dall’altra variabile (quella dell’integrale esterno). Ho letto però nella documentazione che questo caso sembra gestibile da integral2, proverò a scriverlo in modo equivalente con questa funzione qui.

Grazie come al solito :-)

Re: Doppia funzione integrale in Matlab

Inviato: 25 set 2022, 11:44
da RenzoDF
Ianero ha scritto:... Ciò che non è chiaro è a cosa pensava la Mathworks quando ha scritto “arrayValued”, perché neanche la funzione 5 lo è ...

Quello che mi sono sempre chiesto anch'io :ok: , ad ogni modo ho scoperto che basta un riferimento fantasma alla variabile nella integranda per compensare il problema, per es.

Codice: Seleziona tutto

 f=@(x) 5+0*x;

:?

Ianero ha scritto:... però fa niente basta che gira e fa quello che mi serviva....

Esatto, una volta compreso che quella flag sistema le cose, alziamogliela. :mrgreen:

Ianero ha scritto:... ...Ho letto però nella documentazione che questo caso sembra gestibile da integral2, proverò a scriverlo in modo equivalente con questa funzione qui. ...

Proprio così, basta inserire i due limiti come function handle e puoi usarli (senza la flag, che non è prevista), in integral2; qualcosa del tipo

Codice: Seleziona tutto

a=@(t) t-1
b=@(t) t+1
f = @(t,x) exp(-1./(1-(x-t).^2));
integral2(f,-1,1,a,b)

Re: Doppia funzione integrale in Matlab

Inviato: 25 set 2022, 11:56
da Ianero
Grazie mille :-)