Pages : 1
#1 Le 09/01/2009, à 14:18
- suzanne1307
programmation sur matlab
Bonjour,
j'ai programmé un algorithme sur matlab qui est constitué d'une fonction principale et de 2 autres fonctions, le voila:
La fonction principale est la suivante:
function bt=brp
c1=input('Donner le coût du remplacement à la panne')
c2=input('Donner le coût du remplacement préventif')
k=input('Donner la valeur de k')
p=(1/1.5)*((k/0.5)-((k*(1.5)-k*k*0.5)^0.5));
lamda=(k-p)./2;
for t=0:0.1:3.1414
m=1-(exp(-t))*(t+1)+Fbrp(t,lamda,p,k);
bt=[(c1*m)+c2]/t;
end
La fonction Fbrp est la suivante:
function w=Fbrp(t,lamda,p,k)
x=0;
for n=2:12
for j=0:n
z=[nchoosek(n,j)];
s=sombrp(t,lamda,k,n);
x(n,j) =x+z.*(((1-p)^j)*(p^(n-j))*(1-s));
end
end
w=x;
La fonction sombrp est la suivante:
function s=sombrp(t,lamda,k,n)
s=0;
for l=0:(n.*(k-1)+j-1)
s=s+((lamda*t)^l)*exp(-lamda*t)/factorial(l);
end
La fonction principale fait appel à la fonction Fbrp qui à son tour fait appel à la fonction sombrp.
Le message d'erreur suivant apparait:
Warning: Colon operands must be real scalars.
> In sombrp at 4
In Fbrp at 7
In brp at 13
??? Subscript indices must either be real positive integers or logicals.
Error in ==> Fbrp at 8
x(n,j) =x+z.*(((1-p)^j)*(p^(n-j))*(1-s));
Error in ==> brp at 13
m=1-(exp(-t))*(t+1)+Fbrp(t,lamda,p,k);
Svp aidez moi je n'ai pas trouvé la signification de ce message d'erreur et pourquoi mon programme ne marche pas,c'est urgent
merci
Hors ligne
#2 Le 09/01/2009, à 16:04
- doc212
Re : programmation sur matlab
Dans ta fonction Fbrp
tu initialise x=0;
ensuite tu fais 2 for imbriques sur n et j et dedans tu mets:
x(n,j)= ...
x est un nombre scalaire et pas un matrice là ...
donc voilà ... j'pense que c'est ça ...
Dernière modification par doc212 (Le 09/01/2009, à 16:15)
Hors ligne
#3 Le 09/01/2009, à 16:26
- suzanne1307
Re : programmation sur matlab
Merci pour la réponse,
x n'est pas une matrice mais on m'a dit diutiliser ce syntaxe:x(n,j) pour que le x ne soit pas écrasé à chaque itération dans Fbrp, et quand j'enlève le x(n,j) et je mets tout simplement
x =x+z.*(((1-p)^j)*(p^(n-j))*(1-s));
le warning suivant apparait
Warning: Colon operands must be real scalars.
> In sombrp at 4
In Fbrp at 7
In brp at 13
et le logiciel me calcule une seule valeur de bt alors qu'il est sensé calculer bt pour
t=0:0.1:3.1414
et désolée pour le code je suis nouvelle dans les forums
Hors ligne
#4 Le 09/01/2009, à 16:35
- suzanne1307
Re : programmation sur matlab
je ne sais pas ce que veut dire ce warning ,comment faire pour que x ne soit pas écrasée à chaque itération et pourquoi le logiel ne me calcule qu'une seule valeur de bt?
Hors ligne
#5 Le 09/01/2009, à 16:40
- doc212
Re : programmation sur matlab
effectivement tu réécrase la valeur de bt à chaque fois ...
change la ligne
bt=[(c1*m)+c2]/t;
par bt= [ bt ; ((c1*m)+c2)/t ];
ça te fera un vecteur avec les différentes valeurs bt pour les différentes valeur de t
enfin du coup, avant le for tu devrais initialiser avec bt=0
et à la fin du for (en dehors, après le end donc) bt=bt(2:end)
sinon tu vas avoir comme première valeur de ton vecteur 0, ce qui ne t'intéresse pas j'imagine ...
voilà
Hors ligne
#6 Le 09/01/2009, à 16:49
- doc212
Re : programmation sur matlab
Warning: Colon operands must be real scalars.
> In sombrp at 4
In Fbrp at 7
In brp at 13
function s=sombrp(t,lamda,k,n)
s=0;
for l=0:(n.*(k-1)+j-1)
s=s+((lamda*t)^l)*exp(-lamda*t)/factorial(l);
end
essaye un peu de faire afficher k et j avant le for ... donc rajoute
s=0;
k
j
for l=0: bla bla
je pense que k est peut-être un nombre complexe ...
de plus la variable j n'est pas définie dans ta fonction s ...
Hors ligne
#7 Le 09/01/2009, à 16:51
- suzanne1307
Re : programmation sur matlab
Merci beaucoup, ça marche,vous m'avez bien éclairée,le logiciel me donne plusieurs valeurs de bt,
mais le warning:
Warning: Colon operands must be real scalars.
> In sombrp at 4
In Fbrp at 7
In brp at 14
existe encore,je présume que ce n'est pas grave?
Hors ligne
#8 Le 09/01/2009, à 17:01
- suzanne1307
Re : programmation sur matlab
j est définie dans Fbrp qui appelle la fonction sombrp :
for j=0:n
est ce que ce n'est pas suffisant?
quand je fais l'affichage de j comme vous me l'aviez dit cette réponse apparait
ans =
0 + 1.0000i
Hors ligne
#9 Le 09/01/2009, à 17:17
- doc212
Re : programmation sur matlab
function s=sombrp(t,lamda,k,n)
s=0;
for l=0:(n.*(k-1)+j-1)
s=s+((lamda*t)^l)*exp(-lamda*t)/factorial(l);
end
D'accord je vois où le problème.. c'est vraiment pas de chance...
normalement comme la variable j n'est pas définie dans sombrp, ça aurait du causer une erreur
Même si elle est définie dans Fbrp et que sombrp est appelée à partir de Frbrp, ça ne suffit pas, la variable j n'est pas visible dans sombrp ...
Par exemple rien ne m'empêcherait d'appeler sombrp à partir d'une fonction où j n'est pas définie... bref ... là n'est pas vraiment le problème ...
en fait j représente aussi le nombre imaginaire (racine carrée de -1) et donc ici, matlab a considéré ce j comme tel et c'est pour ça qu'il ne s'est pas plaint que la variable j n'est pas définie ...
Mais du coup, vous essayez de faire itérer l dans des valeurs complexes et c'est pour ça qu'il fait l'erreur :
Warning: Colon operands must be real scalars.
> In sombrp at 4
In Fbrp at 7
In brp at 13
qui siginifie en gros que les opérandes de l'opérateur : doivent être des nombres réels or dans ce cas-ci, l'opérande à droite des deux points est un nombre complexe à cause du +j
Bref, si vous voulez faire passer la valeur de j dans l'espace de la fonction sombrp, vous devriez le faire passer en paramètre de la fonction également ...
function s=sombrp(t,lamda,k,n,j)
et dans Fbrp appeler la fonction sombrp en lui passant aussi le paramètre j ...
Voilà, je pense que c'est fini pour les erreurs ... maintenant je n'ai pas regardé de près et donc je ne peux pas vous certifier qu'il calcule effectivement ce que vous désirez et qu'il n'y a pas des erreurs plus subtiles ailleurs...
bon courage
Hors ligne
#10 Le 09/01/2009, à 17:46
- suzanne1307
Re : programmation sur matlab
Merci beaucoup pour votre aide:)
Hors ligne
Pages : 1