Bonjour à tous,
je viens chercher votre aide sur un problème d'informatique concernant le logiciel scilab, voici l'énoncé de mon problème:
" On s'intéresse à une version discrète du système proies-prédateurs. La suite (xn) est la population des proies (xn est la quantité de proies et yn est la quantité de prédateurs, pour
une certaine unité de mesure).
On suppose que :
xn+1= xn+ xn*(-yn)t
yn+1= yn- yn*(-xn)t
pour certains paramètres. Prenons : ====1, t= 0,01 .
1. Écrire un programme qui trace (xn), (yn) en fonction du temps (sur 10000 itérations) pour :
(a) x0 = y0 = 1
Voici ce que j'ai fait:
"
a=1;
b=1;
d=1;
g=1 ;
dt= 0.01;
function f= u(t)
u(0)=1 ;
for n= 0:1000
u(n)= u(n-1)+ u(n-1)*(a-b*v(n-1))*dt ;
end
endfunction
function f2= v(t)
v(0)=1;
for n= 0:1000
v(n+1)= v(n)-v(n)*(d-g*u(n))*dt ;
end
endfunction
"
Cependant, cela ne me revoie pas la valeur de ma suite u(n) ou v(n) (qui correspondent respectivement à x(n) et y(n)).
Quelqu'un saurait-il y voir plus clair?
je ne connais pas bien la syntaxe de Scylab, mais je remarque que tes fonctions cherchent chacune à calculer indépendamment u(n) et v(n)
imagine appeler la fonction f=u(t):
elle calcule u(1000) dans une boucle où v(i) n'est pas calculé : je ne sais pas ce que Scylab va te donner pour v(-1) --première boucle de f()-- mais un langage un minimum costaud te jettera méchamment.
oui j'ai remarqué ce problème, mais je ne sais pas comment calculer ce système, étant donné qu'il faut calculé en fonction de u et de v pour chacune! j'ai fais cela aujourd'hui :
( ça marche mais cela me renvoie pour n'importe quel u(n) et v(n) 1 )
clear
a=1;
b=1;
d=1;
g=1 ;
dt= 0.01;
function f=u(n)
if n == 0 then
f = 1
else
f = u(n-1)+u(n-1)*(a-b*v(n-1))*dt ;
end
endfunction
function f1=v(n)
if n == 0 then
f1 = 1
else
f1 = v(n-1)-v(n-1)*(d-g*u(n-1))*dt ;
end
endfunction
Comme le dit dhalte, xn+1 et yn+1 doivent être calculés l'un après l'autre, dans la même boucle.
Tu instaures un paramètre t mais tu ne l'utilises pas. Utilise le dans le programme, et ensuite quand tu exécuteras, tu mettras t=10000.
Bref, ça c'est du détail.
Revenons-en au cœur du problème : si cela est possible (désolé Scilab c'est un peu loin pour moi), je te propose de créer deux vecteurs x et y (ne t'embête avec u et v, garde les mêmes notations ce sera plus simple), de longueur t+1, contenant des 0 partout. Je crois me souvenir que c'est faisable.
Ensuite, on part dans une boucle : n varie de 0 à t-1 et on construit successivement les xn+1 et yn+1 que l'on stocke dans les vecteurs respectifs qu'on a créés.
Grosso modo quelque chose comme ça :
function f= proie(t)
création et initialisation des vecteurs x et y à faire par toi-même
x(0)=1;
y(0)=1;
for n= 0:t-1
x(n+1)= x(n)+ x(n)*(a-b*v(n))*dt ;
y(n+1)= y(n)-y(n)*(d-g*u(n))*dt ;
end
endfunction
J'ai pas regardé en détail le problème que tu as à résoudre mais cela fonctionnera déjà mieux comme ça
A peu près ça:
a=1;
b=1;
d=1;
g=1 ;
dt= 0.01;
function [x,y]= proie(t)
x(0)=1;
y(0)=1;
t=1000 ;
for n= 0:t-1
x(n+1)= x(n)+ x(n)*(a-b*v(n))*dt ;
y(n+1)= y(n)-y(n)*(d-g*u(n))*dt ;
end
endfunction
De plus, avec la méthode que j'ai fait précédemment, c'est à dire avec la boucle for, je trouve le bon résultat puisque si je calcul manuellement le résultat est toujours 1.
Pensez-vous que cette méthode est bonne aussi ?
Pour ton programme de 19h08, oui je pense que ça marche mais tu demandes un boulot de fou à ta machine. Le but étant de réaliser un graph, il faut stocker les xi et les yi petit à petit pour pouvoir les dessiner ensuite
En gros, pour t'expliquer vite fait, quand tu calcules u(35), il va calculer u(1), u(2), ..., u(34) ; v(1), v(2), ..., v(34) et tu vas perdre toutes ces informations, tu n'auras que la valeur de u(35) qui sera retournée.
-> des calculs pour pas grand-chose !
a=1;
b=1;
d=1;
g=1 ;
dt= 0.01;
function [x,y]= proie(t)
x=zeros(1, t+1) #un vecteur de longueur t+1
y=zeros(1, t+1)
x(0)=1;
y(0)=1;
for n= 0:t-1
x(n+1)= x(n)+ x(n)*(a-b*v(n))*dt ;
y(n+1)= y(n)-y(n)*(d-g*u(n))*dt ;
end
endfunction
Ensuite, quand tu lances proie(10000), tu vas avoir en retour ton vecteur x, ton vecteur y, et tu pourras faire un graph
Oui c'est pour cela que lorsque j'essayais de calculer u(1000) , j'attendais au moins 10 minutes avant d'avoir une réponse !!!
D'accord je n'avais pas saisi ce que vous entendiez par "vecteur", pour moi la fonction zeros créee des matrices remplies de zéros.
Merci beaucoup, maintenant je n'ai plus qu'à faire un plot(x) et de y pour trouver mon graphe
Oui j'ai compris ce que vous avez fait !
Il est vrai que j'ai l'habitude d'utiliser la fonction zeros(), mais la je ne voyais vraiment pas comment m'en servir ! mais il est vrai que pour stocker les informations sur x et y c'est evident !
Oui désolée je n'ai pas pensé à mettre mon profil à jour !! je vais le faire dès à présent
C'est la deuxième année où je fais de la programmation, mais j'ai vraiment énormément de mal :s je n'ai pas acquis les bons réflexes, et maintenant je n'ai pas les bonnes bases ! En effet, je vois ce que je dois faire mais je n'arrive pas à mettre en pratique la programmation associée!
Donc je suis un peu dans le pétrin !
Pour la programmation, un conseil que je peux te donner, c'est d'essayer de prendre du recul sur le problème.
Surtout ne pas se précipiter sur l'ordinateur : prendre le temps d'écrire sur un brouillon les étapes, vraiment comme une recette de cuisine.
Coder n'est "que" la finalité de ce travail en amont.
Après, je ne sais pas trop ce que tu as vu/pas vu, fait/pas fait mais surtout n'hésite pas à poser des questions, à envoyer tes programmes sur ce forum ou un autre. Et comme pour les autres matières, pas de secret : pour progresser il faut s'entraîner mais t'as l'air motivée et tu n'es pas réfractaire à programmer, ce qui est une très bonne chose
Oui je pense que c'est une question de "déclic", il faut juste que j'applique mon raisonnement à la programmation !
Eh bien j'ai commencé à programmer avec processing, puis un peu de java, et maintenant je ne fais plus que du scilab.
Oui je souhaite vraiment m'améliorer car mes lacunes commencent à constituer un vrai handicap! Cependant, il est vrai que je commence à perdre ma motivation car je trouve cela dur !
Mais c'est vrai que ce forum est vraiment très vivant, et je l'utilise depuis le lycée! Et puis les gens sont vraiment très impliqués et sympathiques
Tu serais pas à la fac de Nice par hasard ?
Processing, un peu de Java et du Scilab, j'ai fait exactement la même chose
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :