Forum Liberty Basic France

Général » Vitesse et Energie Cinétique énergie d'un véhicule en mouvement
Le 18/10/2020 à 11h15

Modérateur

Groupe: Modérateur

Inscrit le: 09/02/2015
Messages: 667
Suite à un problème technique sur une discussion datant de quelques années, et sur proposition de Roland, je remet ici les éléments rescapés. Ce n'est donc plus la discussion originale, mais le programme dont on parle est bien là, et on peut à nouveau, au besoin, s'exprimer à son sujet :

Voici un petit programme qui affiche sur un graphe l'énergie cinétique emmagasinée par un véhicule, en fonction de sa vitesse et de sa masse.

J'ai récemment vu un spot TV s'adressant aux conducteurs qui vont "un peu plus vite". Que dis-je ! le même spot catastrophiste sur 3 chaines différentes en quelques minutes de zapping, quel matraquage...

Du coup, j'ai coupé la télé, et j'ai voulu en avoir le cœur net : pourquoi sommes-nous chauffards à 150 km/h et honnêtes pères ou mères de famille à 130 km/h ?

La formule donnant l'énergie d'un objet en mouvement est e=mc2 et s'exprime en Joules. m est la masse du véhicule, en kilogrammes, et v sa vitesse en mètres par seconde :
  • Première mauvaise nouvelle, plus le véhicule est lourd, plus il y aura d'énergie à dissiper.
  • Seconde mauvaise nouvelle, la vitesse est au carré, donc un petit écart de vitesse amènera un grand écart d'énergie.


Si la voiture avance à 130 km/h, elle fait environ 36 mètres par seconde, et à 150 km/h, elle fait du 42 m/s. La masse restant constante, l'augmentation d’énergie tient dans le seul rapport du carré des vitesses, et si on pose 42*42/36*36, on obtient 1764/1296=1.36 fois plus d'énergie à 150 km/h qu'à 130

Donc, à 150 km/h, on est 1.36 fois plus chauffard qu'à 130 km/h

Je pensais pouvoir fournir un petit prog illustrant ce fait, mais il est trop bancal et pas assez opérationnel pour être publié ce soir (je n'ai pas la dextérité de Roland et il y a souvent pas mal de recherche pour obtenir quelque chose qui fonctionne, bien que je sois bien plus à l'aise aujourd'hui qu'à l'époque où je découvrais mes combobox)

J'avais envie d'y ajouter aussi un graphique de décélération, avec le temps de réaction et le temps de freinage, mais là on s'engage dans un sacré sacerdoce : l'énergie cinétique est facile à calculer et ne dépend pas du matériel, alors qu'on peut difficilement calculer le freinage d'un véhicule sans connaître les caractéristiques de ses constituants et leurs degré d'usure, ni les température, humidité et état de surface du milieu environnant... Petite réflexion mathématique...

Bon, cette fois-ci, il fonctionne. Cependant c'est codé "à la va-vite", il faudrait que je clarifie et commente, à l'occasion.

Il y a deux courbes : véhicule à vide et véhicule chargé.

Le graphe est redessiné à chaque fois qu'on change une valeur numérique, une couleur de courbe, ou qu'on clique sur "calculer"

Les limites du graphe sont fixes en horizontal (0 à 200 km/h), et variable en vertical (joules) en fonction du maxi rencontré, ce qui explique que les deux courbes peuvent changer même si une seule est modifiée : c'est juste l'affichage, les calculs sont justes. Enfin j'espère...

This is the code :
Code VB :
 
'vitesse et énergie

'ec=0.5mv2

[couleursdispo]
data "jaune","brun","rouge","rouge foncé","rose","rose foncé","bleu","bleu foncé"
data "vert","vert foncé","cyan clair","cyan foncé","blanc","noir","gris clair","gris foncé"
dim couleur$(16)
restore [couleursdispo]
for a=0 to 15:read a$:couleur$(a)=a$:next
 
[couleursJB]
data "yellow","brown","red","darkred","pink","darkpink","blue","darkblue","green"
data "darkgreen","cyan","darkcyan","white","black","lightgray","darkgray"
dim couleurJB$(16)
restore [couleursJB]
for a=0 to 15:read a$:couleurJB$(a)=a$:next
 
'choix initial des couleurs de courbe
index1=1
index2=3
 
'données prépositionnées :
masseVide1=800
masseCond1=80
masseCharg1=350
masse1=masseVide1+masseCond1+masseCharg1
 
masseVide2=800
masseCond2=80
masseCharg2=0
masse2=masseVide2+masseCond2+masseCharg2
 
 
    nomainwin
 
    '*** ouverture fenetre principale

    'dimensions et position à l'écran
    WindowWidth = 800
    WindowHeight = 600
 
    'contenu
    statictext #1.cas1, "Situation 1 :", 15, 30, 60, 20
 
    statictext #1.mav1, "Masse à vide :", 85, 30, 70, 20
    TEXTBOX #1.mvide1, 160, 27, 40, 20
    statictext #1.kgs11, "kg", 205, 30, 30, 20
 
    statictext #1.cond1, "conducteur :", 235, 30, 60, 20
    TEXTBOX #1.mcond1, 300, 27, 40, 20
    statictext #1.kgs12, "kg", 345, 30, 30, 20
 
    statictext #1.passbag1, "passagers et bagages :", 385, 30, 110, 20
    TEXTBOX #1.mpassbag1, 500, 27, 40, 20
    statictext #1.kgs13, "kg", 545, 30, 30, 20
 
    COMBOBOX #1.courbe1, couleur$(), [couleurtrace1], 650, 27, 100, 20
 
 
    statictext #1.cas2, "Situation 2 :", 15, 55, 60, 20
 
    statictext #1.mav2, "Masse à vide :", 85, 55, 70, 20
    TEXTBOX #1.mvide2, 160, 52, 40, 20
    statictext #1.kgs21, "kg", 205, 55, 30, 20
 
    statictext #1.cond2, "conducteur :", 235, 55, 60, 20
    TEXTBOX #1.mcond2, 300, 52, 40, 20
    statictext #1.kgs22, "kg", 345, 55, 30, 20
 
    statictext #1.passbag2, "passagers et bagages :", 385, 55, 110, 20
    TEXTBOX #1.mpassbag2, 500, 52, 40, 20
    statictext #1.kgs23, "kg", 545, 55, 30, 20
 
    COMBOBOX #1.courbe2, couleur$(), [couleurtrace2], 650, 52, 100, 20
 
    button #1.calc, "Calculer", [calcul], UL, 540, 90, 100, 20
    button #1.quit, "Quitter", [quitter], UL, 680, 90, 100, 20
 
    largeurbox=WindowWidth-30
    hauteurbox=WindowHeight-160
    graphicbox #1.graph, 10, 120, largeurbox, hauteurbox
    xOrigine=60
    yOrigine=hauteurbox-40
    xFinAxeX=largeurbox-xOrigine-10
    yFinAxeY=40
    longueurAxeX=xFinAxeX-xOrigine
    longueurAxeY=yOrigine-yFinAxeY
    vmaxkmh=200    '   axe X, vitesse max, km/h
    vmaxms=vmaxkmh*10/36    ' vitesse max, m/s

    'fenêtre principale
    open "Energie cinétique" for window as #1
 
        print #1.mvide1,str$(masseVide1)
        print #1.mcond1,str$(masseCond1)
        print #1.mpassbag1, str$(masseCharg1)
 
        print #1.mvide2,str$(masseVide2)
        print #1.mcond2,str$(masseCond2)
        print #1.mpassbag2, str$(masseCharg2)
 
        print #1.courbe1, "selectindex ";index1
        print #1.courbe2, "selectindex ";index2
 
 
 
        gosub [calcul]
 
 
        print #1, "trapclose [quitter]"
 
    wait
 
end
 
 
'***************sous-programmes********************

[quitter]
    'quitte le programme
    print "[quitter]"
    close #1
    print
    end
 
[calcul]
    print "[calculer]"
 
    pasHpix=vmaxms/longueurAxeX
 
    print #1.mvide1, "!contents? mv$";
    print #1.mcond1,"!contents? co$"
    print #1.mpassbag1, "!contents? pb$"
    masse1=val(mv$)+val(co$)+val(pb$)
    print "masse1=";masse1
 
    print #1.mvide2, "!contents? mv$";
    print #1.mcond2,"!contents? co$"
    print #1.mpassbag2, "!contents? pb$"
    masse2=val(mv$)+val(co$)+val(pb$)
    print "masse2=";masse2
 
    gosub [dessin_graduations]
 
    print #1.graph, "down"
 
    for a=0 to longueurAxeX
    xpoint=xOrigine+a
        ec1=Ecinetic(masse1,a*pasHpix)
        ec2=Ecinetic(masse2,a*pasHpix)
        ec1aff=yOrigine-longueurAxeY*ec1/energiemax
        ec2aff=yOrigine-longueurAxeY*ec2/energiemax
        print #1.graph, "color ";couleurJB$(index1-1)
        print #1.graph, "set ";xpoint;" ";ec1aff
        print #1.graph, "color ";couleurJB$(index2-1)
        print #1.graph, "set ";xpoint;" ";ec2aff
    next a
    print #1.graph, "up"
    wait
 
[couleurtrace1]
    print "[couleurtrace1]"
    print #1.courbe1, "selectionindex? index1"
    gosub [calcul]
    wait
 
[couleurtrace2]
    print "[couleurtrace2]"
    print #1.courbe2, "selectionindex? index2"
    gosub [calcul]
    wait
 
[dessin_graduations]
    print "[dessin_graduations]"
 
    print #1.graph, "down"
    print #1.graph, "fill black"
    print #1.graph, "color darkgreen"
    print #1.graph, "line ";xOrigine;" ";yOrigine;" ";xOrigine;" ";yFinAxeY
    print #1.graph, "line ";xOrigine;" ";yOrigine;" ";xFinAxeX;" ";yOrigine
 
    'graduations axe x
    pasHaff=int(vmaxkmh/4)
    longueurAxeX=xFinAxeX-xOrigine
    gradua=0
    for a=0 to 20
        gradx=xOrigine+longueurAxeX*a/20
        if a mod 5 = 0 then
            demigrad=8
            print #1.graph, "backcolor black"
            print #1.graph, "color white"
            print #1.graph, "place ";gradx-3;" ";yOrigine+23
            print #1.graph, "\";str$(gradua);" "
            gradua=gradua+pasHaff
            print #1.graph, "color darkgreen"
        else
            demigrad=5
        end if
        print #1.graph, "line ";gradx;" ";yOrigine-demigrad;" ";gradx;" ";yOrigine+demigrad
    next
 
    'dessin des limitations de vitesse
    kmhParPix=longueurAxeX/vmaxkmh
    vitesselimite=50:gosub [dessineVLimite]
    vitesselimite=90:gosub [dessineVLimite]
    vitesselimite=130:gosub [dessineVLimite]
 
    'dessin des graduations
    print #1.graph, "backcolor black"
    print #1.graph, "color white"
    print #1.graph, "place  ";gradx+30;" ";yOrigine+23
    print #1.graph, "\km/h "
 
    'graduations axe y

    'énergie maximale
    ec1=Ecinetic(masse1,vmaxms)
    ec2=Ecinetic(masse2,vmaxms)
    if ec1>ec2 then energiemax=ec1 else energiemax=ec2
    print "ec1=";ec1;"  ec2=";ec2;"  energiemax=";energiemax
 
    pasVaff=int(energiemax/4)
    longueurAxeY=yOrigine-yFinAxeY
    gradua=0
    for a=0 to 20
        'grady = yOrigine-pasVpix*a/21
        grady=yOrigine-longueurAxeY*a/20
        if a mod 5 = 0 then
            demigrad=8
            print #1.graph, "backcolor black"
            print #1.graph, "color white"
            print #1.graph, "place  ";xOrigine-55;" ";grady+5
            print #1.graph, "\";str$(gradua);" "
            gradua=gradua+pasVaff
            print #1.graph, "color darkgreen"
        else
            demigrad=5
        end if
        print #1.graph, "line ";xOrigine-demigrad;" ";grady;" ";xOrigine+demigrad;" ";grady
    next
    print #1.graph, "backcolor black"
    print #1.graph, "color white"
    print #1.graph, "place  ";xOrigine-35;" ";grady-20
    print #1.graph, "\J "
    print #1.graph, "up"
    return
 
[dessineVLimite]
    repere=xOrigine+vitesselimite*kmhParPix
    print #1.graph, "line ";repere;" ";yOrigine;" ";repere;" ";yFinAxeY
    print #1.graph, "place  ";repere;" ";yFinAxeY-5
    print #1.graph, "\";vitesselimite;" km/h"
    return 
function Ecinetic(m,v)
    Ecinetic=0.5*m*v^2
end function
 




Edité par Christophe Le 18/10/2020 à 22h55
____________________
Just BASIC v2.0 :
  • utilisation courante avec GNU/Linux Mageia7+ Wine (Pas trouvé d'incohérences ou de bug de compilation à ce jour)
  • utilisation occasionnelle ou vérification/débugage difficile avec Windows XP sur un petit eeepc

   
Général » Vitesse et Energie Cinétique énergie d'un véhicule en mouvement  

 |  |

1 Utilisateur en ligne : 0 Administrateur, 0 Modérateur, 0 Membre et 1 Visiteur
Utilisateur en ligne : Aucun membre connecté
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie