Page 1 sur 1

Fonction fminsearch, Matlab !

Publié : lundi 03 mars 2014, 16:09
par Maxinquaye
Bonjour à tous !

EDIT : Après avoir cherché et avoir essayé sur Matlab, je rencontre un nouveau problème (je ne dois vraiment pas comprendre comment marche fminsearch ...).

Voici le code que j'entre :

Code : Tout sélectionner

clear all;
close all;

k= 0.1 : 0.1 : 1000;

f = 10^6;
omega = 2*pi*f;

Xa = fminsearch(@(k) fa(omega,k),[0;0]);
Où la fonction fa est la suivante : (fichier fa.m dans le même répertoire)

Code : Tout sélectionner

function z = fa(omega,k)

rho = 903;
mu = 36*10^6;
lambda = 1.95*10^3*10^6;
nu = 0.491;
E = 107.3*10^6;
h = 10^-2;

cL = sqrt((lambda + 2*mu)/rho);
cT = sqrt(E*(1-nu)/(rho*(nu+1)*(1-2*nu)));

OMEGA = omega*h/cT;
KSI = k*h;

x = sqrt(OMEGA^2-KSI.^2);
y = sqrt(OMEGA^2*(cT/cL)^2-KSI.^2);

z = (KSI.^2-x.^2).^2.*sin(y).*cos(x)+4.*x.*y.*KSI.^2.*cos(x).*sin(y);

end
En gros, ce que je veux c'est tracer la fonction fa (retournée dans la variable z) en fonction de k pour différents omega, et trouver la valeur de k correspondant au minimum de la fonction à chaque fois. Malheureusement, Matlab me renvois l'erreur suivante :

"Subscripted assignment dimension mismatch.

Error in fminsearch (line 191)
fv(:,1) = funfcn(x,varargin{:});
"

Je comprends qu'il y a un problème dans la taille de mon vecteur k mais je ne comprends pas d'où ça vient ...

Si jamais quelqu'un n'aurait ne serait-ce qu'une petite idée d'où pourrait provenir le problème je le remercie bien fort :)

Re: Fonction fminsearch, Matlab !

Publié : jeudi 06 mars 2014, 14:09
par nirosis
bonjour

déjà je ne comprends pas pourquoi tu mets

Code : Tout sélectionner

k= 0.1 : 0.1 : 1000;
et un peu plus loin k semble avoir seulement 2 éléments..

Code : Tout sélectionner

,[0;0]
[0;0] est ton "initial guess" de la solution...

Ensuite, je n'ai pas testé mais as-tu essayé de mettre :

Code : Tout sélectionner

fa(k,omega)
(en général, on met les paramètres après la variable que l'on ajuste, mais peut-être que cela ne change rien...)

Autre point : ta fonction z = fa(omega,k) devrait retourner un scalaire
Je pense qu'elle retourne un vecteur là, non ? (donc considère la norme au carré de ton vecteur par exemple)

Re: Fonction fminsearch, Matlab !

Publié : vendredi 07 mars 2014, 13:22
par Maxinquaye
Merci de ta réponse mais j'avais finalement réussi à trouver la solution tout seul :) Le problème ne vient pas des arguments en faîtes, c'est juste qu'il faut passer la fonction que l'on veut traiter avec fminsearch en fonction de type "handle" (type de fonction que je n'avais jamais rencontré avant). J'insère mon code ici des fois que d'autre personnes auraient le même problème que moi (je n'ai trouvé que très peu de réponses intéressantes à mon problème sur google) :

Il faut d'abord définir la/les fonctions à traiter (personnellement je les ai définis dans un fichier matlab à part mais je pense que ça n'est pas nécessaire) :

Exemple :

Code : Tout sélectionner

function z = fs(omegah,kh)

z = (KSI.^2-x.^2).^2.*sin(y).*cos(x)+4.*x.*y.*KSI.^2.*cos(x).*sin(y);
z = abs(real(z));

end
Ici j'ai enlevé toute la partie du programme qui définie les paramètres KSI, x et y pour alléger la présentation.

Ensuite, il faut passer cette fonction en fonction de type handle (où fct_sym est le nom de la fonction définie plus haut) :

Exemple :

Code : Tout sélectionner

 S = @(kh)fct_sym(omegah,kh);
Il faut (d'après ce que j'ai compris) que la fonction n'ait qu'une variable (ici kh), mais elle peut avoir plusieurs paramètres d'entrée (ici omegah). Il est nécessaire de définir les paramètres d'entrée à l'avance, mais il n'est pas nécessaire de définir kh (cependant je ne sais pas quelles valeurs sont prises pour kh ni le pas ...).

Voilà la syntaxe générique : Nom_fonction_handle = @(variable_de_la_fonction)nom_de_la_fonction(argument_d'entrée_1, 2, 3, ...); il faut qu'il n'y est aucun espace !!! (je pense que mon erreur venait peut être de là tout simplement).

Pour tracer une fonction handle, il faut utiliser la fonction ezplot (argument d'entrée : (fct handle à tracer, [début,fin de l'affichage de l'axe des abscisses (correspond à un xlim)]), qui n'admet pas un vecteur en argument d'entrée.

Enfin, il suffit de taper :

Code : Tout sélectionner

Nom_variable = fminsearch(S,point de départ de la recherche);


et la valeur du minimum de la fonction est retournée dans la variable Nom_variable.

Cependant, j'ai remarqué que la fonction fminsearch ne retourne que le premier minimum d'une fonction (par exemple abs(cos(x)), le fminsearch de cette fonction ne trouve que le premier minimum).

Voilà, en espérant que mon post aidera un jour d'autre personne qui comme moi étaient totalement pommé avec l'utilisation de cette fonction haha !

Re: Fonction fminsearch, Matlab !

Publié : vendredi 07 mars 2014, 20:05
par nirosis
tant mieux si tu as réussi alors.

C'est normal que fminsearch s'arrête sur le 1er minimum. Elle s'arrête au le 1er minimum local trouvé.
Si tu veux avoir d'autres solutions, il faut changer le point de départ...