Bonjour,
Pour résoudre un problème de plus court chemin sur un cône, je dois déterminer le minimum de la fonction S suivante :
$$S(\theta)=2 \int_0^{\frac{\pi}{2}} \frac{\sqrt{1+ \tan^2 \theta + 2 \sin \alpha \tan \theta + \tan^2 \theta \cos^2 \alpha}}{(1+\sin \alpha \tan \theta)^2} $$
Je ne me suis mis que très récemment dans l'utilisation de logiciel de calcul formel. Je pense que c'est la raison des échecs de mes nombreuses tentatives de résoudre mon problème avec XCAS : j'ai essayé d'utiliser fMin, fsolve,...et le message "calcul en cours" est alors scotché sur mon écran. Est-ce normal ? Faut-il laisser calculer pendant plusieurs dizaines de minutes ?
Un grand merci si vous pouviez mettre fin à mes vains essais.
Etude d'une fonction définie par une intégrale
Modérateur : xcasadmin
Re: Etude d'une fonction définie par une intégrale
J'ai oublié d$\alpha$ à la fin de mon intégrale...Cela devient :
$$S(\theta)=2 \int_0^{\frac{\pi}{2}} \frac{\sqrt{1+ \tan^2 \theta + 2 \sin \alpha \tan \theta + \tan^2 \theta \cos^2 \alpha}}{(1+\sin \alpha \tan \theta)^2} d\alpha$$
$$S(\theta)=2 \int_0^{\frac{\pi}{2}} \frac{\sqrt{1+ \tan^2 \theta + 2 \sin \alpha \tan \theta + \tan^2 \theta \cos^2 \alpha}}{(1+\sin \alpha \tan \theta)^2} d\alpha$$
Re: Etude d'une fonction définie par une intégrale
Bonjour,
il n'y a pas d'espoir d'obtenir une solution exacte, les fonctions à intégrer n'ayant pas de primitives exprimables à l'aide de fonctions élémentaires. Donc le plus simple est de faire un graphe et de déterminer une valeur approchée. Je pose d'abord t=tan(theta), puis
S:=Int(sqrt(1+t^2+2*sin(x)*t+t^2*cos(x)^2)/(1+sin(x)*t)^2,x,0,pi/2)
l'intégrale (non évaluée).
Ensuite plot(S,t=0..2,xstep=0.1) semble indiquer un minimum vers 0.8, on peut alors préciser par plot(S,t=0.7..0.9,xstep=0.01) avec un mini vers 0.79. Si on veut plus de précision, on peut chercher un zéro de la dérivée
Sp:=Int(diff(sqrt(1+t^2+2*sin(x)*t+t^2*cos(x)^2)/(1+sin(x)*t)^2,t),x,0,pi/2)
fsolve bugue malheureusement (je pense que c'est un bug dans l'algo d'intégration numérique, il faudra que je regarde la semaine prochaine). On peut quand même calculer
evalf(subst(Sp,t=0.78) qui vaut -0.002916365651
evalf(subst(Sp,t=0.79) qui vaut 0.00123195678942
et en déduire que la solution est entre 0.78 et 0.79, par interpolation linéaire on essaie ensuite 0.7870 où la dérivée vaut 2e-6 ce qui donne un trajet minimal de 2*2.204...
il n'y a pas d'espoir d'obtenir une solution exacte, les fonctions à intégrer n'ayant pas de primitives exprimables à l'aide de fonctions élémentaires. Donc le plus simple est de faire un graphe et de déterminer une valeur approchée. Je pose d'abord t=tan(theta), puis
S:=Int(sqrt(1+t^2+2*sin(x)*t+t^2*cos(x)^2)/(1+sin(x)*t)^2,x,0,pi/2)
l'intégrale (non évaluée).
Ensuite plot(S,t=0..2,xstep=0.1) semble indiquer un minimum vers 0.8, on peut alors préciser par plot(S,t=0.7..0.9,xstep=0.01) avec un mini vers 0.79. Si on veut plus de précision, on peut chercher un zéro de la dérivée
Sp:=Int(diff(sqrt(1+t^2+2*sin(x)*t+t^2*cos(x)^2)/(1+sin(x)*t)^2,t),x,0,pi/2)
fsolve bugue malheureusement (je pense que c'est un bug dans l'algo d'intégration numérique, il faudra que je regarde la semaine prochaine). On peut quand même calculer
evalf(subst(Sp,t=0.78) qui vaut -0.002916365651
evalf(subst(Sp,t=0.79) qui vaut 0.00123195678942
et en déduire que la solution est entre 0.78 et 0.79, par interpolation linéaire on essaie ensuite 0.7870 où la dérivée vaut 2e-6 ce qui donne un trajet minimal de 2*2.204...
Re: Etude d'une fonction définie par une intégrale
Bon, il y a bien un problème avec l'intégration. En modifiant la routine pour ne pas avoir à mettre des Int, je trouve un minimum en tan(theta)=1.28368898, et comme minimum 2*1.26760350.
Donc prudence pour l'instant le temps que je détermine où est le problème...
Donc prudence pour l'instant le temps que je détermine où est le problème...
Re: Etude d'une fonction définie par une intégrale
Bug corrige (dans l'integration formelle). Avec la version mise a jour (windows et linux xcas_root pour l'instant)
renvoie l'intervalle [1.28368896246,1.28368899226].
puis evalf(subst(S,t=1.28368897)) renvoie 1.267603505, j'espere que c'est bien correct maintenant!
Code : Tout sélectionner
S:=Int(sqrt(1+t^2+2*sin(x)*t+t^2*cos(x)^2)/(1+sin(x)*t)^2,x,0,pi/2);
Sp:=diff(S,t);
fsolve(Sp=0,t=1..2,bisection_solver)
puis evalf(subst(S,t=1.28368897)) renvoie 1.267603505, j'espere que c'est bien correct maintenant!