Tang(x)/x = k
Réponses à toutes vos questions après le Bac (Fac, Prépa, etc.)
-
leolio
- Messages: 6
- Enregistré le: 24 Jan 2007, 21:51
-
par leolio » 04 Juin 2008, 16:20
Bonjour,
Je dois programmer la solution analytique pour un système thermique en c++.
Et j ai un soucis, pour calculer mon coefficient x.
La formule pour déterminer x est la suivante :
h, R et lamda sont constant.
Je pense passer par un développement en série mais si quelqu un a une autre solution à me proposer, je suis preneur.
Merci;
-
JJa
- Membre Relatif
- Messages: 254
- Enregistré le: 06 Mar 2008, 15:52
-
par JJa » 04 Juin 2008, 17:19
Bonjour,
En pratique, la résolution de l'équation tan(x)=b*x (avec b donné) se fait par calcul numérique. Les méthodes générales sont nombreuses. L'une des plus connues est la méthode de Newton-Raphson.
Un autre méthode (non générale, spécifique de cette équation) est la suivante :
Les racines de l'équation sont indicées par j
racine triviale x=0, non considérée.
Suite des racines positives : r_0, r_1, r_2, ..., r_j,...
(mêmes racines négatives)
Les données sont b (réel) et j (entier).
On calcule r, valeur numérique approchée de la racine indicée j.
q est une variable réelle.
:
r:=pi*j;
if r<>0 then goto 1;
if b<=1 then goto 1;
r:=pi/4;
1:
q:=r;
r:=arctan(b*r)+j*r;
if(abs(r-q)>1E-9) then goto 1;
write(r);
.
note : 1E-9 = 10^(-9) peut être adapté à la précision souhaitée.
.
Par exemple, pour tester:
Avec j=9 ; b=-1 ; on trouve r=26.740916...
Avec j=0 ; b=2 ; on trouve r=1.1655611...
-
leolio
- Messages: 6
- Enregistré le: 24 Jan 2007, 21:51
-
par leolio » 05 Juin 2008, 14:26
Bonjour,
je suis toujours avec mon problème de :
J ai implémenté la methode de de NewtonRaphson. Sauf que je cherche un ensemble de solutions pour cette équation et que pour l'instant ma méthode se bloque à chaque fois sur un minimum alors qu'il en existe plusieurs pour cette fonction.
Comment puis-je faire pour les déterminer ou pour que ma méthode ne se bloque juste sur un ?
merci
-
JJa
- Membre Relatif
- Messages: 254
- Enregistré le: 06 Mar 2008, 15:52
-
par JJa » 05 Juin 2008, 16:23
Recommencer l'itération en partant chaque fois d'un différent x(initial)= x0+2*n*pi
Mais ce n'est pas évident de programmer une bonne valeur x0 de départ, selon la valeur de b.
Pour avoir les racines successives d'une façon fiable, je conseillerais plutôt le petit algorithme donné dans mon message précédent, en le placant dans une boucle qui l'exécute avec successivement j=0, 1, 2, 3,... etc.
-
leolio
- Messages: 6
- Enregistré le: 24 Jan 2007, 21:51
-
par leolio » 06 Juin 2008, 13:12
bonjour,
j ai implémenté ta méthode en c++.
int j;
double q,r;
double diff;
C_n->SetNumberOfComponents(2);
cout<<"solve"<
b = 2;
for(j=0;j<4;j++)
{
r=M_PI*j;
if (b>1 && r==0)
r=M_PI/4;
do
{
q=r;
r=atan(b*r)+j*r;
diff = sqrt(pow(r-q,2));
// cout< }
while(diff>pow(10,-6));
cout< "< C_n->InsertNextTuple2(r,r);
}
les valeurs sont fausse et je ne vois pas d ou cela vient si tu vois ou j ai fait une erreur en retranscrivant ton algo .?
Merci
-
JJa
- Membre Relatif
- Messages: 254
- Enregistré le: 06 Mar 2008, 15:52
-
par JJa » 13 Juin 2008, 07:31
Salut,
je n'ai jamais eu de difficulté avec cet algorithme qui est très fiable.
Je t'envoie une copie du listing par message privé car je n'arrive pas à la joindre ici.
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 40 invités