{"id":9961,"date":"2025-09-13T18:37:17","date_gmt":"2025-09-13T16:37:17","guid":{"rendered":"https:\/\/spgoo.org\/?page_id=9961"},"modified":"2025-09-13T18:44:56","modified_gmt":"2025-09-13T16:44:56","slug":"pendule-double-2","status":"publish","type":"page","link":"https:\/\/spgoo.org\/?page_id=9961","title":{"rendered":"Pendule double"},"content":{"rendered":"  \r\n  <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/jsxgraph\/distrib\/jsxgraph.css\" \/>\r\n  <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/jsxgraph\/distrib\/jsxgraphcore.js\"><\/script>\r\n\r\n  <style>\r\n    .jxgbox { width: 95%; height: 520px; background: #fff; border-radius:10px; border:1px solid #ddd; margin-bottom:14px; }\r\n    .hint { font-size: 13px; color:#666; margin-top:-8px;color:white }\r\n  <\/style>\r\n  <script>\r\nwindow.MathJax = {\r\n  tex: {\r\n    inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\r\n    displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ],\r\n    packages: ['base', 'ams']\r\n  },\r\n  options: {\r\n    ignoreHtmlClass: 'tex2jax_ignore',\r\n    processHtmlClass: 'tex2jax_process'\r\n  }\r\n};\r\n<\/script>\r\n  <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/mathjax@3\/es5\/tex-svg.js\"><\/script>  \r\n  <div id=\"board1\" class=\"jxgbox\"><\/div>\r\n  <div class=\"hint\">Astuce : mettre en pause, ajuster \u03b8(0), puis red\u00e9marrer. Faire glisser les bobs \u00e0 l\u2019arr\u00eat pour modifier les conditions initiales.<\/div>\r\n  <div id=\"board2\" class=\"jxgbox\"><\/div>\r\n\r\n<script>\r\n\/\/ Parameters and state\r\nconst g = 9.81;\r\nlet running=false, t=0;\r\nlet L1=1.0, L2=1.0, m1=1.0, m2=1.0, c=0.01;\r\nlet theta1=120*Math.PI\/180, theta2=-10*Math.PI\/180;\r\nlet omega1=0, omega2=0;\r\nconst path=[], maxPath=6000;\r\nJXG.Options.text.useMathJax = true;\t\r\n\/\/ Board 1\r\nconst b1 = JXG.JSXGraph.initBoard('board1',{boundingbox:[-10.2,2.2,10.2,-5.0],axis:false,showNavigation:false,showCopyright:false});\r\nb1.renderer.container.style.backgroundColor='#C3ADC3';\r\nb1.create('text',[-8,1.9,'\\\\(\\\\text{Double pendule}\\\\)'],{\r\n         useMathJax:true,\r\n\t\t fontSize:22,\r\n\t\t fixed:true,\r\n\t\t color:\"#AE181E\"\r\n\t\t });\r\n\r\n\/\/ Sliders\r\nconst sL1=b1.create('slider',[[-8.5,-1.2],[-6.5,-1.2],[0.3,1.0,3.0]],{\r\n     name:'$$L_1[m]$',\r\n    useMathJax:true,\r\n    baseline: { strokeColor: 'cadetBlue'},\r\n    highline: { strokeColor: '#AE181E'},\r\n\tfillColor: 'marineblue',\r\n\tstrokeColor: 'slategray',\r\n\tsuffixLabel: '$\\\\,\\\\,\\\\, L_1[m] = \\\\, $',\r\n\t});\r\n\r\nconst sL2=b1.create('slider',[[-8.5,-1.8],[-6.5,-1.8],[0.3,1.0,3.0]],{\r\n\t\tname:'\\\\(L_2[m]\\\\)',\r\n\t\tuseMathJax:true,\r\n\t\tbaseline: { strokeColor: 'cadetBlue'},\r\n        highline: { strokeColor: '#AE181E'},\r\n\t    fillColor: 'darkgreen',\r\n\t    strokeColor: 'slategray'\r\n\t\t});\r\nconst sM1=b1.create('slider',[[6,-1.2],[8,-1.2],[0.1,1.0,5.0]],{\r\n       name:'\\\\(m_1[kg]\\\\)',\r\n\t   useMathJax:true,\r\n    baseline: { strokeColor: 'cadetBlue'},\r\n    highline: { strokeColor: '#AE181E'},\r\n\tfillColor: 'darkorange',\r\n\tstrokeColor: 'slategray'\r\n\t});\r\nconst sM2=b1.create('slider',[[6,-1.8],[8,-1.8],[0.1,1.0,5.0]],{\r\n\tname:'\\\\(m_2[kg]\\\\)',\r\n\tuseMathJax:true,\r\n    baseline: { strokeColor: 'cadetBlue'},\r\n    highline: { strokeColor: '#AE181E'},\r\n\tfillColor: 'ivory',\r\n\tstrokeColor: 'slategray'\r\n\t});\r\n\t\t\r\nconst sTheta1_0=b1.create('slider',[[-8.5,-2.6],[-6.5,-2.6],[-180,120,180]],{\r\n\tname:'\\\\(\\\\theta_1(0)[^\\\\circ]\\\\)',\r\n\tuseMathJax:true,\r\n    baseline: { strokeColor: 'cadetBlue'},\r\n    highline: { strokeColor: '#AE181E'},\r\n\tfillColor: 'lightsalmon',\r\n\tstrokeColor: 'slategray'\r\n\t});\r\nconst sTheta2_0=b1.create('slider',[[6,-2.6],[8,-2.6],[-180,-10,180]],{\r\n\tname:'\\\\(\\\\theta_2(0)[^\\\\circ]\\\\)',\r\n\tuseMathJax:true,\r\n    baseline: { strokeColor: 'cadetBlue'},\r\n    highline: { strokeColor: '#AE181E'},\r\n\tfillColor: 'MediumVioletRed',\r\n\tstrokeColor: 'slategray'\r\n\t});\r\nconst sDamp=b1.create('slider',[[-8.5,-3.4],[-6.5,-3.4],[0,0.01,0.5]],{\r\n\tname:'\\\\(c\\\\)',\r\n\tuseMathJax:true,\r\n    baseline: { strokeColor: 'cadetBlue'},\r\n    highline: { strokeColor: '#AE181E'},\r\n\tfillColor: 'indianred',\r\n\tstrokeColor: 'slategray'\r\n\t});\r\n\t\r\nsTheta1_0.on('drag',()=>{if(!running){theta1=sTheta1_0.Value()*Math.PI\/180;omega1=0;t=0;b1.update();}});\r\nsTheta2_0.on('drag',()=>{if(!running){theta2=sTheta2_0.Value()*Math.PI\/180;omega2=0;t=0;b1.update();}});\r\n\r\n\/\/ Image + checkbox\r\nconst showimage=b1.create('checkbox',[-8.0,-4.6,'\\\\(\\\\textrm{Masquer image}\\\\)'],{checked:false});\r\nconst im=b1.create('image',['.\/personnalisation\/images\/femmependule2.png',[-1.8,-5.0],[7,6]],{visible:true,fixed:true});\r\nshowimage.on('up',()=>{im.setAttribute({visible:showimage.Value()});b1.update();});\r\n\r\n\/\/ Buttons\r\nb1.create('button',[-10,0.9,'\\\\(\\\\textrm{D\u00e9marrer \/ Pause}\\\\)',()=>{running=!running;if(running){if(t===0){theta1=sTheta1_0.Value()*Math.PI\/180;theta2=sTheta2_0.Value()*Math.PI\/180;omega1=omega2=0;path.length=0;}lastStamp=null;requestAnimationFrame(loop);}b1.update();}]);\r\nb1.create('button',[-10.0,0.5,'\\\\(\\\\textrm{R\u00e9initialiser}\\\\)',()=>{running=false;t=0;L1=sL1.Value();L2=sL2.Value();m1=sM1.Value();m2=sM2.Value();c=sDamp.Value();theta1=sTheta1_0.Value()*Math.PI\/180;theta2=sTheta2_0.Value()*Math.PI\/180;omega1=omega2=0;path.length=0;b1.update();b2.update();}]);\r\n\r\n\/\/ Pendulum\r\nconst pivot=b1.create('point',[0,0],{fixed:true,name:'',size:3,color:\"green\"});\r\nfunction x1_fn(){return L1*Math.sin(theta1);} function y1_fn(){return -L1*Math.cos(theta1);}\r\nfunction x2_fn(){return x1_fn()+L2*Math.sin(theta2);} function y2_fn(){return y1_fn()-L2*Math.cos(theta2);}\r\nconst bob1=b1.create('point',[x1_fn,y1_fn],{name:'',size:5,fillColor:'cadetblue',strokeColor:'marine'});\r\nconst bob2=b1.create('point',[x2_fn,y2_fn],{name:'',size:6,fillColor:'#AE181E',strokeColor:'marine'});\r\nb1.create('segment',[pivot,bob1],{strokeWidth:3,strokeColor:'#555'});\r\nb1.create('segment',[bob1,bob2],{strokeWidth:3,strokeColor:'#555'});\r\n\r\n\/\/ Velocity vectors\r\nconst showVectors=b1.create('checkbox',[6,-4.6,'\\\\(\\\\textrm{Afficher vecteurs}\\\\)'],{checked:true});\r\nb1.create('arrow',[()=>[x1_fn(),y1_fn()],()=>[x1_fn()+L1*0.25*omega1*Math.cos(theta1),y1_fn()+L1*0.25*omega1*Math.sin(theta1)]],{strokeColor:'#e53935',visible:()=>showVectors.Value()});\r\nb1.create('arrow',[()=>[x2_fn(),y2_fn()],()=>[x2_fn()+L2*0.25*omega2*Math.cos(theta2),y2_fn()+L2*0.25*omega2*Math.sin(theta2)]],{strokeColor:'#43a047',visible:()=>showVectors.Value()});\r\n\r\n\/\/ Dragging\r\nbob1.on('drag',()=>{if(!running){const X=bob1.X(),Y=bob1.Y();const r=Math.hypot(X,Y);if(r>1e-6){L1=r;theta1=Math.atan2(X,-Y);sL1.setValue(L1);sTheta1_0.setValue(theta1*180\/Math.PI);omega1=omega2=0;t=0;b1.update();}}});\r\nbob2.on('drag',()=>{if(!running){const X=bob2.X(),Y=bob2.Y();const dx=X-bob1.X(),dy=Y-bob1.Y();const r=Math.hypot(dx,dy);if(r>1e-6){L2=r;theta2=Math.atan2(dx,-dy);sL2.setValue(L2);sTheta2_0.setValue(theta2*180\/Math.PI);omega1=omega2=0;t=0;b1.update();}}});\r\n\r\n\/\/ Board 2 for trace\r\nconst b2=JXG.JSXGraph.initBoard('board2',{boundingbox:[-2.5,.5,2.5,-3.2],axis:true,keepaspectratio:false,showNavigation:false});\r\nb2.renderer.container.style.backgroundColor='#C3ADC3';\r\nconst tracer=b2.create('point',[x2_fn,y2_fn],{size:3,face:'x'});\r\nconst curve=b2.create('curve',[[NaN],[NaN]],{strokeColor:'#AE181E',strokeWidth:2});\r\nfunction updateCurve(){if(path.length===0){curve.dataX=[NaN];curve.dataY=[NaN];}else{curve.dataX=path.map(p=>p[0]);curve.dataY=path.map(p=>p[1]);}curve.updateDataArray();}\r\nb2.create('text',[-2,.2,'\\\\(\\\\textrm{Trajectoire du deuxi\u00e8me bob}\\\\)'],{useMathJax:true,fontSize:16,color:\"#AE181E\"});\r\n\r\n\/\/ Dynamics\r\nfunction derivatives(state){const th1=state[0],om1=state[1],th2=state[2],om2=state[3];const delta=th2-th1;const denom1=(m1+m2)*L1-m2*L1*Math.cos(delta)*Math.cos(delta);const denom2=(L2\/L1)*denom1;const num1=m2*L1*om1*om1*Math.sin(delta)*Math.cos(delta)+m2*g*Math.sin(th2)*Math.cos(delta)+m2*L2*om2*om2*Math.sin(delta)-(m1+m2)*g*Math.sin(th1);const a1=num1\/denom1-c*om1;const num2=-m2*L2*om2*om2*Math.sin(delta)*Math.cos(delta)+(m1+m2)*g*Math.sin(th1)*Math.cos(delta)-(m1+m2)*L1*om1*om1*Math.sin(delta)-(m1+m2)*g*Math.sin(th2);const a2=num2\/denom2-c*om2;return[om1,a1,om2,a2];}\r\nfunction rk4_step(state,h){const k1=derivatives(state);const s2=state.map((v,i)=>v+0.5*h*k1[i]);const k2=derivatives(s2);const s3=state.map((v,i)=>v+0.5*h*k2[i]);const k3=derivatives(s3);const s4=state.map((v,i)=>v+h*k3[i]);const k4=derivatives(s4);return state.map((v,i)=>v+(h\/6)*(k1[i]+2*k2[i]+2*k3[i]+k4[i]));}\r\nconst dtFixed=1\/240;let lastStamp=null;\r\nfunction loop(stamp){if(!running)return;if(lastStamp==null)lastStamp=stamp;let acc=Math.min(0.05,(stamp-lastStamp)\/1000);lastStamp=stamp;L1=sL1.Value();L2=sL2.Value();m1=sM1.Value();m2=sM2.Value();c=sDamp.Value();while(acc>1e-9){const h=Math.min(dtFixed,acc);const state=[theta1,omega1,theta2,omega2];const next=rk4_step(state,h);theta1=next[0];omega1=next[1];theta2=next[2];omega2=next[3];t+=h;acc-=h;if((t\/dtFixed)%3<1){path.push([x2_fn(),y2_fn()]);if(path.length>maxPath)path.shift();}}updateCurve();b1.update();b2.update();requestAnimationFrame(loop);}\r\n\r\n\/\/ Init\r\nsL1.setValue(L1);sL2.setValue(L2);sM1.setValue(m1);sM2.setValue(m2);sDamp.setValue(c);\r\nsTheta1_0.setValue(theta1*180\/Math.PI);sTheta2_0.setValue(theta2*180\/Math.PI);\r\nif(window.MathJax&&MathJax.typesetPromise) MathJax.typesetPromise();\r\n<\/script>\r\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-9961","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/9961","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9961"}],"version-history":[{"count":1,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/9961\/revisions"}],"predecessor-version":[{"id":9962,"href":"https:\/\/spgoo.org\/index.php?rest_route=\/wp\/v2\/pages\/9961\/revisions\/9962"}],"wp:attachment":[{"href":"https:\/\/spgoo.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}