2017-07-12 2 views
-1

Essayez ce morceau de code, qui fonctionne bien.Appel imbriqué à l'intégrale échoue

a=1;b=2; 
% A two-variate function 
f2= @(x,y) x+y; 
[email protected](x) integral(@(y) f2(x,y), a,b); 
% Test the evaluation of the derived function handle 
derivedF2(0); 
% Test the integration of the derived function handle 
% integralVal=integral(derivedF2,a,b); 
% integralVal=integral(@(x) derivedF2(x),a,b); 
% Test plotting of the derived function handle 
figure(11); 
ezplot(derivedF2); 

Mais si vous supprimez les lignes commençant par integralVal. Le code se brise.

Apparemment, la poignée de fonction dérivée ne prend pas en charge l'opération d'intégration, ou ai-je manqué quelque chose?

Répondre

1

Réponse courte: vous devez ajouter l'option 'ArrayValued':

integralVal=integral(derivedF2,a,b, 'ArrayValued', true); 

Explication

Vous devriez lire votre message d'erreur:

Output of the function must be the same size as the input. If FUN is an array-valued integrand, set the 'ArrayValued' option to true.

Comme derivedF2 est évalué dans un manière vectorielle, c'est-à-dire qu'elle évalue f à différentes coordonnées y à la fois en fournissant un vecteur y au lieu d'un seul scalaire, MATLAB est également incapable d'évaluer l'intégrale externe d'une manière vectorisée. Par conséquent, vous devez ajouter l'option 'ArrayValued' à l'intégrale externe, à savoir:

integralVal=integral(derivedF2,a,b, 'ArrayValued', true); 

Notez que ezplot génèrent également l'avertissement relatif suivant:

Warning: Function failed to evaluate on array inputs; vectorizing the function may speed up its evaluation and avoid the need to loop over array elements.

Notez que le problème est purement lié aux appels imbriqués à integral , également le code suivant entraînera la même erreur:

integralVal=integral(@(x) integral(@(y) f2(x,y), a,b),a,b); 

Wh at est une fonction Array Valued?

... a function that accepts a scalar input and returns a vector, matrix, or N-D array output.

Ainsi, @(y) f2(x, y) est un tableau fonction d'une valeur si x est un tableau, à savoir qu'il renvoie une matrice pour une entrée scalaire de y.

Deux possibilités existent pour éviter les problèmes de valeur tableau:

  • éviter que @(y) f2(x, y) est une fonction d'une valeur de tableau, à savoir éviter que x est un tableau. Cela peut être fait en indiquant que derivedF2 est une fonction de valeur de tableau telle qu'élaborée ci-dessus, bien que - à proprement parler - ce ne soit pas une fonction de valeur de tableau, c'est-à-dire que l'intégrale devrait avoir le même nombre de sorties et d'entrées. Cependant, il utilise en interne une fonction de valeur de tableau, c'est-à-dire @(x) f2(x, y) est une fonction de valeur de tableau car Matlab évalue par défaut l'intégrande de manière vectorisée, c'est-à-dire qu'il utilise un vecteur pour y.

  • Dites Matlab que @(y) f2(x, y) est une fonction d'une valeur de tableau:

    [email protected](x) integral(@(y) f2(x,y), a,b, 'ArrayValued', true); 
    

    Cela peut être une approche plus intuitive, mais elle est plus lente que l'intégrale interne est appelée bien souvent que l'intégrale externe.

Une autre interprétation de Tableau Valued est que vous dites Matlab de ne pas utiliser vectorisation, mais pour cette interprétation le nom tableau Valued est quelque peu trompeur.

+0

Merci beaucoup, @ m7913d. Et pour le reste de vous lire cette réponse. Une façon de corriger l'avertissement ezplot est de changer cette ligne de code en: "ezplot (@ (x) arrayfun (derivedF2, x));" – user2008151314

+0

Salut @ m7913d, comme je regarde plus dans l'option "ArrayValued", je suis devenu plus confus. [Ce lien] (https://www.mathworks.com/help/matlab/ref/integral.html#inputarg_fun) indique que "Si vous définissez l'option 'ArrayValued' sur true, alors fun doit accepter un scalaire et retourner un tableau de taille fixe. ". Et [ce lien] (https://www.mathworks.com/help/matlab/ref/integral.html#input_argument_d0e495282) indique que "Définissez cet indicateur sur true pour indiquer que fun est une fonction qui accepte une entrée scalaire et renvoie un vecteur, une matrice ou une sortie de tableau ND. " – user2008151314

+0

Et 'ArrayValued', true indique que l'intégrand est une fonction de type tableau. Il est étonnant que "une fonction de tableau" soit ... Désolé si c'est une question trop simple à poser. – user2008151314