[Matlab] Incrémentation variable fonction

Résolu/Fermé
galere-en-stage - 22 mai 2009 à 11:49
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 - 24 mai 2009 à 14:41
Bonjour,

je veux tester une fonction pour savoir la position d'une valeur de f en x en fonction de la valeur de f en (x+1) et pour cela je fais quelque chose dans ce genre

for x=1:5
f=(x-3).^2;
if f(x)>f(x+1)
disp('fonction decroissante') ;
else
disp('fonction croissante') ;
end
end

Malheureusement ca marche pas et je suis obligée de passer par l'expression de la fonction:

for x=1:5
f=(x-3).^2;
if (x-3).^2>(x+1-3).^2
disp('fonction decroissante') ;
else
disp('fonction croissante') ;
end
end
Dans ce cas ca marche. Mais le problème c'est que la fonction que j'ai ecrite n'est qu'un exemple et ma fonction est beaucoup plus compliquée et dépend d'autres paramètres alors je ne peux absolument pas utiliser son expression dans la boucle if.
Il faut vraiment que j'utilise quelque chose du style: "if f(x)>f(x+1)" mais je vois pas où est mon problème
A voir également:

6 réponses

poukkid Messages postés 106 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 11 avril 2012 11
22 mai 2009 à 15:19
Salut

Je suis pas certain d'avoir parfaitement compris ton problème, néanmoins je te conseillerais d'utiliser deux variables f, soit f1 et f2, afin de sauvegarder f(x) et f(x+1)

quel langage utilise tu?

en pseudo-code semblable au tiens(si c'est un langage, je ne connais pas désolé), je serais tenté de ne pas faire de boucle for, mais d'incrémenter la variable x entre les sauvegardes de f(x) et f(x+1) :

x=1
while (x<=5)
f1=(x-3).^2;
x=x+1
f2=(x-3).^2;
if f1>f2
disp('fonction decroissante') ;
else
disp('fonction croissante') ;
end
end

Je fais deux trois tests et si j'ai mieux je te préviens...
Précise le langage s'il te plaît.
0
poukkid Messages postés 106 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 11 avril 2012 11
22 mai 2009 à 15:35
Mmmh je suis habitué aux langages type C et j'ai interprété
f=(x-3).^2;
comme une déclaration de variable or c'est une fonction, évidemment.

Quoi qu'il en soit la méthode que je t'ai donné avec 2 variables fonctionne de la même façon que la fonction, mais est un peu plus lourde évidemment.

Par contre si f=(x-3).^2; déclare bel et bien une fonction, je ne vois pas ou pourrait être le problème, il semble être uniquement relatif au langage que tu utilises, en C c'est très simplement implémentable.
0
poukkid Messages postés 106 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 11 avril 2012 11
22 mai 2009 à 16:02
J'ai cru comprendre que c'était du Matlab.

Tes problèmes viennent peut-être de ta façon d'utiliser les fonctions,

j'ai trouvé ce lien qui pourrait peut-être t'aider, je ne peux pas faire mieux, j'utilise pas Matlab, déosle.

http://ufrmeca.univ-lyon1.fr/~buffat/COURS/MATLAB_HTML/node11.html
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
22 mai 2009 à 17:27
Bonjour mes amis !

Le problème est juste que le f=(x-3).^2; est mal placé ;-)
x=(1:5);
f=(x-3).^2;
for p=1:4
if f(p)>f(p+1)
disp('Fonction décroissante') ;
else
disp('Fonction croissante') ;
end
end
Cependant, l'exemple est quelque peu biaisé par le fait que la variable x et l'indice p du vecteur f prennent les mêmes valeurs, voici donc un exemple où l'on verra mieux la différence :
x=linspace(1,5,25);
f=(x-3).^2;
for p=1:numel(f)-1
if f(p)>f(p+1)
disp('Fonction décroissante') ;
else
disp('Fonction croissante') ;
end
end
Comme tu dois le savoir, Matlab tourne assez souvent plus vite lorsqu'on utilise au mieux la vectorialisation. Ici, la version vectorialisée est moins rapide que la version avec boucle que j'ai écrite (il y a probablement mieux cela dit) mais si tu désires voir ce que cela pourrait donner (c'est toujours intéressant et cela peut resservir), je proposerais ceci par exemple :
n=25;
x=linspace(1,5,n);
f=diff((x-3).^2);
%%
increase=repmat('Fonction croissante  ',n-1,1);
decrease=repmat('Fonction décroissante',n-1,1);
screen=repmat('Fonction constante   ',n-1,1);
%%
screen(f>0,:)=increase(f>0,:); clear increase;
screen(f<0,:)=decrease(f<0,:); clear decrease;
disp(screen);
Je te souhaite une bien bonne journée !

PS : Comme poukkid le mentionnait, le langage de programmation n'est pas précisé dans le message initial, ni dans le titre d'ailleurs. Je vais demander un changement de titre à la modération, comme cela ce sera plus clair si un jour quelqu'un cherche quelque chose et que le sujet apparaît dans la liste des résultats ;-)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
galere-stage
24 mai 2009 à 14:36
c'est bien du matlab, j'étais sure de l'avoir précisé mais bon, désolée. En tout cas merci pour l'aide, je pense que ca devrait marcher maintenant
0
Fee Fay Messages postés 635 Date d'inscription vendredi 17 octobre 2008 Statut Membre Dernière intervention 31 mai 2009 377
24 mai 2009 à 14:41
Ce n'est pas grave ;-)
Un oubli peut arriver quand on écrit un message aussi long. Mais ce qui est dommage c'est quand l'oubli concerne une information importante :-D
Cela dit, lorsqu'un message contient un morceau de code, les personnes habituées au langage en question cernent assez vite la demande, donc c'est beaucoup moins gênant que pour un message du type :
Bonjour
Je voudrais programmer ceci.
Merci d'avance


En tout cas il n'y a pas de quoi ;-)
Bonne fin de week-end et à la prochaine !
0