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.
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
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
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