tang(x)/x = k

(Cliquez-ici pour accéder à la version originale de cette discussion avec couleurs et images)







Posted by: leolio

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 :

1 - \frac{x}{\tan(x)} = \frac{hR}{\lambda}

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;



Posted by: JJa

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...



Posted by: leolio

Bonjour,

je suis toujours avec mon problème de :
\frac{\tan(x)}{x}-b=0

J ai implémenté la methode de de Newton–Raphson. 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



Posted by: JJa

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.



Posted by: leolio

bonjour,

j ai implémenté ta méthode en c++.

int j;
double q,r;

double diff;
C_n->SetNumberOfComponents(2);

cout<<"solve"<<endl;

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<<q<<" "<<r<<endl;
}
while(diff>pow(10,-6));

cout<<j<<" -> "<<r<<endl;
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



Posted by: JJa

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.











-