Je ne sais pas compiler ce pseudocode

Wartagan - 23 juin 2023 à 10:59
 Wartagan - 24 juin 2023 à 19:42

Bonjour,

j'ai écrit un bout de pseudocode qui utilise une fonction solve sur des formules trigonométriques,

toutefois je ne suis pas capable de l'écrire dans un langage gratuit (lisp ?) notamment car je ne sais pas charger cette fonction (est-elle dans des dépendances ?)

Toute aide sur ce projet serai la bienvenue, mais cela n'est pas un gros projet car le pseudocode est simple. Je ne sais juste pas comment l'écrire en code et quoi installer pour l'écrire dedans.

Le projet est le suivant :

A(a,b),  B(a,b), C(a,b) et D(a,b) sont quatre fonctions trigonométriques de paramètres a et b entiers,

on cherche a et b tel que toutes ces fonctions donnent pour résultat un élément de  {0.33; 0.36 ; 0.56; 0.6} (probablement deux fois le même élément mais sans doute pas toutes le même) à 0.1 près, et on augmente l'erreur de 0.1 en relançant le programme tant qu'il n'y a pas de solutions a et b.

Voici le pseudocode :

I={0.33 ; 0.36; 0.56; 0.6}

e1, e2, e3, e4 in [-0.1;0.1] // paramètres à changer s'il n'y a pas de solution à et b//

Solve (       A(a,b)+e1 in I

           And B(a,b)+e2 in I

           And C(a,b)+e3 in I

            And D(a,b)+e4 in I)

Avec A(a,b)=arctan(b*tan(45 )/(2a+b))

          B(a,b)=arctan((b+a/2)tan(45)/(b+3a/2))

          C(a,b)=arctan(a*tan(45)/(2a+b))

           D(a,b)=arctan((a+b)*tan(45)/(2a+b))

Le tout en degré.

Merci de m'avoir lu jusqu'au bout.

A voir également:

7 réponses

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 juin 2023 à 11:12

Bonjour,

 
je ne suis pas capable de l'écrire dans un langage gratuit (lisp ?)

Tous les langages sont gratuits, le choix de lisp, c'est au hasard ou c'est vraiment une volonté de travailler avec ce langage ?
Parce que clairement ce n'est pas le premier auquel on penserait.

Quant à ton pseudo-code, il est insuffisant, on est plus sur une réécriture de la question que sur un vrai traitement du problème.


0

Je ne souhaite pas particulièrement utiliser lisp, c'est juste un langage que j'ai trouvé en cherchant des langages gratuits.

Quel langage serait adapté avec une fonction solve ? Il faut une licence je crois pour les langages scheme ou maple que j'avais utilisé pendant mes études (mais j'ai tout oublié)

Je ne cherche pas à ce qu'on fasse le travail à ma place mais seulement de l'aide.

Avec une référence de nom de langage je posterai mes propres essais de code

Cordialement 

0
Whismeril Messages postés 19030 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 27 avril 2024 931
23 juin 2023 à 12:52

Bonjour 

Solve n'existe pas de base. Soir quelqu'un l'a écrit quelque part et tu as la chance de le trouver, soit tu la code toi-même.

Il y a eu une question là dessus, il y a plusieurs mois à ce sujet en C# et elle n'a pas été résolue.

C'est en ça que KX te dis que ta proposition n'est pas un algorithme. Il faudrait y écrire la fonction solve.

Y'a quand même Excel qui dispose d'un solveur, mais ne l'ayant jamais utilisé, je ne sais pas ce qu'il vaut.


0

J'ai utilisé il y a fort longtemps la fonction maximize du langage Maple dans ce genre de problème. Maple est un langage payant et je ne le possède plus mais je viens de voir qu'il y a une licence d'essai de 15 jours, je vous tiens au courant.

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
23 juin 2023 à 13:27

Maple, MathematicaWolframAlpha etc. sont des logiciels de calculs, ils feront peut-être ce que tu veux, mais avec une analyse des symboles, en appliquant des formules mathématiques de résolution, etc.

Exemple : x²-3x+1=0

Lisp ou Scheme, ainsi que les différents langages de programmations de ce forum, vont plutôt devoir résoudre le problème en appliquant un algorithme qui manipulera des nombres, en itérant sur un grand nombre de valeurs possibles, pour calculer les différentes fonctions, et les comparer aux contraintes qu'on s'est fixé jusqu'à tomber sur une solution satisfaisante.

C'est une tout autre manière de réfléchir. Exemple d'algorithme :

I={0.33 ; 0.36; 0.56; 0.6}
J=[-0.1 ; 0.1] 

pour chaque X allant de 0 à 360 avec un pas de 1
    pour chaque Y allant de 0 à 360 avec un pas de 1
        calcul de A = arctan(Y*tan(45)/(2X+Y))
        calcul de B = arctan((Y+X/2)tan(45)/(Y+3X/2))
        calcul de C = arctan(X*tan(45)/(2X+Y))
        calcul de D = arctan((X+Y)*tan(45)/(2X+Y))

        pour chaque E sur l'ensemble I
            calcul de eA = min(abs(A - E), eA)
            calcul de eB = min(abs(B - E), eB)
            calcul de eC = min(abs(C - E), eC)
            calcul de eD = min(abs(D - E), eD)

        si eA dans J et eB dans J et eC dans J et eD dans J
            afficher X, Y, A, B, C, D, eA, eB, eC, eD

Quant au choix du langage de programmation, pour faire ça je dirais qu'ils seront tous capables de le faire, mais la syntaxe variera d'un langage à l'autre.

0

Je comprends ce pseudocode, et je vous remercie de l'avoir explicité.

Je suis limité au smartphone jusqu'à 15h30, je vais chercher à l'écrire en lisp ou autre depuis le googlestore

Même si le calcul abouti je publierai les résultats par la fonction Minimize de Maple à titre de documentation mais je ne pourrai commencer que dans la nuit.

0

Oh bien sûr, dans ce cas particulier du problème où on utilise tan(45), on peut le remplacer par tan(45)=1

0

J'utilise pour l'instant le langage Pascal sur smartphone grâce à l'application Online  Compiler -  Code on Mobi j'apprends petit à petit la syntaxe et j'ai pour l'instant réussi  à exécuter cela :

var 
   I : array[1..2] of integer ;
   j : integer ;
begin
   I[1]:=1;
   I[2]:=2;
   for j:= 1 to 2 do
   writeln(I[j]);
end.

C'est un début. 

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

Bon je dois vous laisser, le programme était terminé mais a planté et je l'ai perdu, voici le début de sa réécriture qui compile :

uses math ;

var 
   I : array[1..4] of real ;
   x : integer ;
   y : integer ;
   j : integer ;
   A : real;
   B : real ;
   C : real ;
   D : real ;
begin
   I[1]:=0.33;
   I[2]:=0.36;
   I[3]:=0.56;
   I[4]:=0.6;
   for x:= 10 to 25 do begin
      for y:=10 to 45 do begin
      A :=arctan(Y/(2*X+Y)) ;
      B :=arctan((Y+X/2)/(Y+3*X/2)) ;
      C :=arctan(X/(2*X+Y)) ;
      D :=arctan((X+Y)/(2*X+Y)) ;
   writeln(I[j]);
   end ; end ;
end.
 

0

Bon je réécris dans les transports, le code ne compile plus à partir de cette étape à mon avis parce que les données deviennent trop grosses :

uses math ;

var 
   I : array[1..4] of real ;
   x : integer ;
   y : integer ;
   j : integer ;
   k : integer ;
   l : integer ;
   m : integer ;
   n : integer ;
   A : real;
   B : real ;
   C : real ;
   D : real ;
begin
   I[1]:=0.33;
   I[2]:=0.36;
   I[3]:=0.56;
   I[4]:=0.6;
   for x:= 10 to 25 do begin
      for y:=10 to 45 do begin
      A :=arctan(Y/(2*X+Y)) ;
      B :=arctan((Y+X/2)/(Y+3*X/2)) ;
      C :=arctan(X/(2*X+Y)) ;
      D :=arctan((X+Y)/(2*X+Y)) ;
      for k :=1 to 4 do
         for l :=1 to 4 do
            for m := 1 to 4 do
               for n := 1 to 4 do
   writeln(I[k]);;;;
   end ; end ; end .

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > Wartagan
23 juin 2023 à 16:41

"le code ne compile plus à partir de cette étape à mon avis parce que les données deviennent trop grosses"

Il ne faut pas confondre compilation et exécution. Si ton code ne compile pas, c'est que la syntaxe est fausse, il n'est pas encore question de données, que l'on ne retrouvera qu'à l'exécution.

Remarque : ici les données ne sont pas trop grosses, tu ne consommes quasiment rien en mémoire, c'est le temps qui en revanche va se démultiplier, en particulier à cause ta monstrueuse quadruple boucle k/l/m/n qui ne sert à rien...

0
Wartagan > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
23 juin 2023 à 18:39

Compilation n'est peut-être pas le bon mot, j'aurais dû dire exécuter Jcar il y a quand même un writeln et j'ai un résultat à la fin... Je me suis dit que l'application peut-être non optimisée et l'utilisation d'un smartphone qui ont fait qu'avec la quadruple boucle le calcul n'aboutissait pas, je vais le faire tourner sur ordi.

Je pense que la quadruple boucle est nécessaire car sinon on a A=B=C=D au lieu de A et B et C et D in I, à moins que j'ai mal compris le "for E in I" ( sans compter que je ne vois pas comment écrire ça en Pascal)

0
Wartagan > Wartagan
23 juin 2023 à 19:13

en effet je ne compilais pas je crois que sur le smartphone j'utilisais un interpreteur, car je faisais tourner le programme sans demander explicitement de le compiler.

0

Si je n'ai pas totalement oublié mon Pascal ... il y a 7 boucles imbriquées. Tout ça pour réécrire je ne sais combien de fois la même chose.
À quoi servent les calculs de A, B, C,D, ... ?

0

bonjour, A B C D ne sont pas utilisés et writeln tourne en boucle car le programme est inachevé. J'ai juste voulu expliciter l'étape qui saturait l'application Pascal sur le smartphone.

0
Wartagan > Wartagan
23 juin 2023 à 19:17

bon maintenant je suis bloqué, j'ai installé freepascal sur l'ordinateur, je compile, il n'y a pas d'erreur, je clique sur "run" et freepascal se ferme, même si je supprime le writeln.

Je ne sais même pas si freepascal plante ou si mon code s'exécute ailleurs, là où je ne le vois pas.

0
PierrotLeFou
23 juin 2023 à 19:22

Tu es sur quel système sur ton ordi? Est-ce que tu utilises Visual Studio Code ou un autre IDE?
Si tu voulais "saturer" ton processeur, tu as réussi. Je compte plus de 147 000 writeln().
A, B, C, D ne dépendent que de X et Y, pas de k, l, m, n.
Si tu nous expliquais autrement ce que tu voulais calculer, on pourrait sans doute mieux t'aider.

0

j'ai allégé le code pour éviter de saturer voir sui j'arrivais à éxécuter, avec ceci :

uses math ;

var
   I : array[1..4] of real ;
   x : integer ;
   y : integer ;
   j : integer ;
   k : integer ;
   l : integer ;
   m : integer ;
   n : integer ;
   A : real;
   B : real ;
   C : real ;
   D : real ;
begin
   I[1]:=0.33;
   I[2]:=0.36;
   I[3]:=0.56;
   I[4]:=0.6;
   writeln(I[1]);
   readln;
end.

et ça ne marche pas. la touche run ferme freepascal. Je n'ai pas d'écran noir avec un résultat visible.  Je ne sais pas l'utiliser.

je viens de voir que j'utilise "free pascal ide for win32" il n'y a pas d'autre nom pour l'ide.

EDIT j'ai changé pour un IDE nommé Lazarus et ce code simplifié tourne. Celui qui ne tourne pas est le free pascal proposé à l'installation sur CCM.

0
Wartagan > Wartagan
Modifié le 23 juin 2023 à 21:29

probleme résolu, il n'a pas de solution. la plus petite valeur trouvée pour l'erreur e est environ 2 (hors tolérence) trouvée avec ce code qui tourne sur ordinateur mais pas sur l'application smartphone :


uses

  math ;
   var
     I : array[1..4] of real ;
     x : integer ;
     y : integer ;
     z : boolean ;
     j : integer ;
     e : real ;
     k : integer ;
     l : integer ;
     m : integer ;
     n : integer ;
     A : real;
     B : real ;
     C : real ;
     D : real ;
     eA : real ;
     eB : real ;
     eC : real ;
     eD : real ;


  begin
     I[1]:=0.33;
     I[2]:=0.36;
     I[3]:=0.56;
     I[4]:=0.6;
     z:=FALSE;
     for j:=1 to 100 do begin
      e:= j/10;
      for x:= 10 to 25 do begin
      for y:=10 to 45 do begin
      A :=arctan(Y/(2*X+Y)) ;
      B :=arctan((Y+X/2)/(Y+3*X/2)) ;
      C :=arctan(X/(2*X+Y)) ;
      D :=arctan((X+Y)/(2*X+Y)) ;
      for k :=1 to 4 do
         for l :=1 to 4 do
            for m := 1 to 4 do
               for n := 1 to 4 do
                  begin
                  eA :=abs((pi/4)/A - I[k])  ;
                  eB := abs((pi/4)/B - I[l])    ;
                  eC := abs((pi/4)/C - I[m])    ;
                  eD :=abs((pi/4)/D - I[n])   ;
                  if (((((eA < e) and (eA >-1*e))
                      and ((eB < e) and (eB >-1*e)))
                      and  ((eC < e) and (eC >-1*e)))
                      and  ((eD < e) and (eD >-1*e)))
                  then  begin
                    writeln(e:8:2,x,y,(pi/4)/A:8:2,I[k]:8:2,(pi/4)/B:8:2,I[l]:8:2,(pi/4)/C:8:2,I[m]:8:2,(pi/4)/D:8:2,I[n]:8:2)   ;
                                      readln ;end;
            end;
                  end;
   ;;;;
   end ;
     end;          ;end.

merci pour tout, bonne soirée.

EDIT : je ne vois pas comment afficher le sujet en résolu
                                       

0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > Wartagan
Modifié le 23 juin 2023 à 22:49

"probleme résolu, il n'a pas de solution. la plus petite valeur trouvée pour l'erreur e est environ 2 (hors tolérence)"

Mouais... Pourquoi te limiter à x et y entiers ?
Et pourquoi te limiter également à x entre 10 et 25 et y entre 10 et 45 ?

Il y a une infinité de solutions réelles.

Exemple : x=23.52 ; y=24.77

a=0.33+0.002158 ; b=0.56-0,013481 ; c=0.33-0.013481 ; d=0.6-0.007991

0
Wartagan > KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024
Modifié le 24 juin 2023 à 08:52

Whoa je ne sais pas comment vous avez trouvé ça !

Malheureusement comme je l'ai corrigé par la suite ce n'est pas A,B,C,D qui doivent valoir 0,6 etc mais (pi/4)/A  , (pi/4)/B...

X et Y sont entiers car cela correspond à des contraintes de construction cela peut être négociable notamment pour y malheureusement je ne pense pas que ça change grand-chose de prendre des réels car (pi/4)/A etc semblent varier en fonction de x/Y qui valent chacun au moins 10 donc le rapport ne changera pas beaucoup avec des réels

Toutefois je vais vous écouter et écrire avec y s'incrémente en 0,1 un peu plus tard

0
Wartagan > Wartagan
24 juin 2023 à 19:42

Pas de solution non plus avec un incrément de 0.1

0