Géométrie pour vérin de barre

Discussion générale entre passionnés et amateurs de mathématiques sur des sujets mathématiques variés
MacGyver
Messages: 6
Enregistré le: 24 Sep 2016, 18:23

Géométrie pour vérin de barre

par MacGyver » 24 Sep 2016, 20:26

Bonjour à tous,
Après deux heures de navigation sur ce forum, auquel je viens de m'inscrire, je suis persuadé que l'un d'entre vous sera en mesure de m’orienter sur un problème apparemment simple, mais sur lequel je bloque.
Il s'agit de déterminer mathématiquement la position de montage d'un vérin de barre de bateau:
Image
La Fig.1 montre le principe.
L est la longueur du vérin à mi-course.
C est la demi-course du vérin.
R est le rayon du secteur de barre, qui pivote sur le point O.
Où percer le trou de fixation F du vérin (c.à.d. exprimer d et h en fonction de L, C et R) de façon à ce que:
1. Lorsque le vérin est centré à la longueur L (400mm), la barre soit droite (segment OV)
2. Les angles de barre WOV et UOV soient les mêmes lorsque le vérin est entièrement étendu à sa longueur L+C (550mm), et entièrement rétracté à L-C (250mm).


De 1. il découle que le point de fixation F est sur un cercle de rayon L centré sur l'extrémité V de la barre droite
Reste à déterminer où exactement sur ce cercle...

J'ai commencé en trigonométrie classique (Pythagore), j’obtiens un système non linéaire de quatre équations à 4 inconnues a, b, h et d en fonction des constantes L, C et R. (voir fig.2).
Par substitutions, j'arrive à une équation à rallonge qui exprime "a" en fonction de L,C et R, mais que je ne sais pas résoudre.


Avez-vous des idées sur une méthode pour y arriver? Vectoriel, complexe, intersection de cercles...
Jusque là, je résolvais le problème graphiquement ou avec un tableur, mais dans mes moments perdus, je cherche une solution plus élégante!
Merci à vous.



Razes
Membre Rationnel
Messages: 964
Enregistré le: 28 Juil 2014, 19:24

Re: Géométrie pour vérin de barre

par Razes » 24 Sep 2016, 22:05

C'est quoi ?

MacGyver
Messages: 6
Enregistré le: 24 Sep 2016, 18:23

Re: Géométrie pour vérin de barre

par MacGyver » 24 Sep 2016, 23:57

Bonsoir, et merci pour ton intérêt.
Sur la fig.2, ce sont les longueurs des projections du segment OU sur les axes horizontaux et verticaux.
D'ailleurs je réalise que j'ai interverti a et b sur la Fig.2...
Comme on veut que les deux angles a1 et a2 soient égaux, a et b sont également les longueurs des projections de OW. La Fig.4 est montre ce cas, qui est une solution graphique.
Image
Les 4 équations sont:
L² = d² + (R-h)² barre centrée
(L-C)² = (d-a)² + (h-b)² vérin rétracté
(L+C)² = (d+a)² + (h-b)² vérin étendu
R² = a² + b²


Mais cette technique n'est pas forcément la plus élégante. En tous cas, elle n'est pas simple!

MacGyver
Messages: 6
Enregistré le: 24 Sep 2016, 18:23

Re: Géométrie pour vérin de barre

par MacGyver » 25 Sep 2016, 00:13

Autre erreur détectée: sur Fig.4, d=398.4215

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

Re: Géométrie pour vérin de barre

par fatal_error » 01 Oct 2016, 13:12

Hello,

après avoir pas mal galéré à cause de fastidieux calculs (...) voilà une proposition pour solution analytique..

est l'angle entre [Ox) et [OV) (idem (OxV) vaudrait pi/2)

les equations sont (respectivement (0), (1), (2)):


en développant (2) et remplacant de (0) par il vient (E1)


en développant (3) et remplacant idem, il vient (E2)


(E2)-(E1) donne F(1)


(E1)+(E2) donne F(2)


on pose et donc
De F(1) et F(2) il vient respectivement


On injecte F_x et F_y dans (0)
on obtient E(3)

avec

E(3) est une eq en u de degré 3 qu'on peut résoudre avec des radicaux (voir méthode de Cardan par ex)
on déduit u (celui qui est positif et inférieur à 1 s'il existe)
puis on déduit alpha, et on remonte à F_x et F_y via F(1) et F(2)

voici une implem:
https://jsfiddle.net/86gmgs63/
Code: Tout sélectionner
<!DOCTYPE html>
<html>
<head>
<title>Title of the document</title>
<script>
function My(canvas, opts){
    this.canvas = canvas;
    this.ctx = canvas.getContext('2d');
    this.opts = opts || {};
    this.opts.pSize = this.opts.pSize || 3;
}
My.prototype.P = function(x,y,color){
    var ctx = this.ctx;
    var a = this.opts.pSize;
    ctx.strokeStyle = color||'black';
    ctx.beginPath();
    ctx.moveTo(x-a,y-a);
    ctx.lineTo(x+a, y+a);
    ctx.closePath();
    ctx.stroke();
    ctx.beginPath();
    ctx.moveTo(x-a, y+a);
    ctx.lineTo(x+a, y-a);
    ctx.closePath();
    ctx.stroke();
}

My.prototype.L = function(x,y,x2,y2,color){
    var ctx = this.ctx;
    ctx.strokeStyle = color||'black';
    ctx.beginPath();
    ctx.moveTo(x,y);
    ctx.lineTo(x2,y2);
    ctx.closePath();
    ctx.stroke();
}
My.prototype.C = function(x,y,R,color){
    var ctx = this.ctx;
    ctx.strokeStyle = color||'black';
    ctx.beginPath();
    ctx.arc(x,y,R,0,2*Math.PI);
    ctx.closePath();
    ctx.stroke();
}
My.prototype.clear = function(){
    var ctx = this.ctx;
    ctx.save();
    ctx.setTransform(1,0,0,1,0,0);
    ctx.clearRect(0,0,this.canvas.width,this.canvas.height);
    ctx.restore();
}
</script>
<style>
canvas{
    background:#eeeeee;
}
</style>
</head>

<body>
<canvas width=800 height=800></canvas>
<form method="" action="#">
R <input type="text" value="200" name="R"/><br/>
L <input type="text" value="400" name="L"/><br/>
C <input type="text" value="150" name="C"/><br/>
<input type="submit" value="refresh"/>
</form>
<script>
function solve(R,L,C){
    //http://stackoverflow.com/questions/27176423/function-to-solve-cubic-equation-analytically
    function cuberoot(x) {
        var y = Math.pow(Math.abs(x), 1/3);
        return x < 0 ? -y : y;
    }

    function solveCubic(a, b, c, d) {
        if (Math.abs(a) < 1e-8) { // Quadratic case, ax^2+bx+c=0
            a = b; b = c; c = d;
            if (Math.abs(a) < 1e-8) { // Linear case, ax+b=0
                a = b; b = c;
                if (Math.abs(a) < 1e-8) // Degenerate case
                    return [];
                return [-b/a];
            }

            var D = b*b - 4*a*c;
            if (Math.abs(D) < 1e-8)
                return [-b/(2*a)];
            else if (D > 0)
                return [(-b+Math.sqrt(D))/(2*a), (-b-Math.sqrt(D))/(2*a)];
            return [];
        }

        // Convert to depressed cubic t^3+pt+q = 0 (subst x = t - b/3a)
        var p = (3*a*c - b*b)/(3*a*a);
        var q = (2*b*b*b - 9*a*b*c + 27*a*a*d)/(27*a*a*a);
        var roots;

        if (Math.abs(p) < 1e-8) { // p = 0 -> t^3 = -q -> t = -q^1/3
            roots = [cuberoot(-q)];
        } else if (Math.abs(q) < 1e-8) { // q = 0 -> t^3 + pt = 0 -> t(t^2+p)=0
            roots = [0].concat(p < 0 ? [Math.sqrt(-p), -Math.sqrt(-p)] : []);
        } else {
            var D = q*q/4 + p*p*p/27;
            if (Math.abs(D) < 1e-8) {       // D = 0 -> two roots
                roots = [-1.5*q/p, 3*q/p];
            } else if (D > 0) {             // Only one real root
                var u = cuberoot(-q/2 - Math.sqrt(D));
                roots = [u - p/(3*u)];
            } else {                        // D < 0, three roots, but needs to use complex numbers/trigonometric solution
                var u = 2*Math.sqrt(-p/3);
                var t = Math.acos(3*q/p/u)/3;  // D < 0 implies p < 0 and acos argument in [-1..1]
                var k = 2*Math.PI/3;
                roots = [u*Math.cos(t), u*Math.cos(t-k), u*Math.cos(t-2*k)];
            }
        }

        // Convert back from depressed cubic
        for (var i = 0; i < roots.length; i++)
            roots[i] -= b/(3*a);

        return roots;
    }
    var A = Math.pow(L*C/R, 2);
    var B = Math.pow(C*C/(2*R), 2);
    var D = -C*C;
    var E = L*L-R*R;
    var res = solveCubic(-E, E-D, B-A+E, A+B+D-E);
    var candidates = res.sort((a,b)=>b-a).filter((x)=>Math.abs(x)<=1)
    var salpha = candidates[0];
    var alpha = Math.asin(salpha)
    var fx = C*L/(R*Math.cos(alpha));
    var fy = C*C/(2*R*(1-Math.sin(alpha)));
    return [fx,fy, alpha];
}

function plot(M,fx,fy,alpha,R,L,C){
    M.clear();
    var ux = R*Math.cos(alpha);
    var uy = R*Math.sin(alpha);
    var vx = 0;
    var vy = R;
    var wx = -ux;;
    var wy = uy;
    M.L(0,0,canvas.width,0);
    M.L(0,0,ux,uy,'red');
    M.L(0,0,vx,vy,'blue');
    M.L(0,0,wx,wy,'green');
    M.C(ux,uy,L-C,'red');
    M.C(vx,vy,L,'blue');
    M.C(wx,wy,L+C,'green');
    M.P(fx,fy,'black')
}

var canvas = document.getElementsByTagName('canvas')[0];
var M = new My(canvas);
M.ctx.transform(1,0,0,-1,80,canvas.height-20);
var R = 200, L=400, C=150;
[window.fx, window.fy, window.alpha] = solve(R,L,C);
plot(M,fx,fy,alpha,R,L,C)

document.getElementsByTagName('form')[0].onsubmit = function(e){
    try{
        [R,L,C]=['R','L','C'].map((k)=>parseFloat(this[k].value, 10), this);
        [window.fx, window.fy, window.alpha] = solve(R,L,C);
        plot(M,fx,fy,alpha,R,L,C)
    }catch(e){
        console.log(e);
    }
    e.preventDefault();
    return false;
}
</script>
</body>
</html>
la vie est une fête :)

MacGyver
Messages: 6
Enregistré le: 24 Sep 2016, 18:23

Re: Géométrie pour vérin de barre

par MacGyver » 15 Oct 2016, 16:24

Bonjour fatal_error,

Merci pour cette solution.
Entre-temps, on m'a suggéré une solution similaire (merci GaBuZoMeu), en posant



on obtient:





...que l'on injecte dans l'équation (0) pour aboutir à une équation de degré 3 en :



Très pratique, ton code, je le garde sous le coude!

 

Retourner vers ⚜ Salon Mathématique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 12 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite