Forum Liberty Basic France

Général » Tchebychev est mort... Il ne pourra pas gueuler
Le 21/06/2012 à 16h37

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Pafnouti Lvovitch Tchebychev (16 mai 1821 à Okatovo, près de Borovsk - 8 décembre 1894 à Saint-Pétersbourg)

Ceci est une tentative de transcription en Jb d'un code pour Apple IIc. Qui à l'origine traçait des courbes par aproximations, et qui aprés ma contribution a opté pour l'autodétermination, et la liberté sans entraves. :heink

Un petit mot pour Claude:.. Si tu jette un oeil sur ce sac de noeuds, mets des lunettes en contre-plaqué.
Avec mes excuses à Ferdinand Piette, pour avoir honteusement volé quelques lignes à son "Graphicus" ( y'avait un soucis de division par zéro de la mort ). Mais maintenant, c'est f=sqr(x) qui ne passe plus.
Bref, je n'aurai pas la médaille "Field" cette année. :s

Code JB :
 
 
  'Entrer Nombre Echantillons, Limite Inférieure et Supérieure-->go
  'Si 1°choix 2-->ok: Entrée des points par clavier de gauche-->Enter
  'Si 2°choix 1 >-->ok: Entrée de x par textbox de droite-->ok
NOMAINWIN
  WindowWidth = 500
  WindowHeight = 610
  UpperLeftX = INT(DisplayWidth - WindowWidth) /2 'centrage
  UpperLeftY = INT(DisplayHeight - WindowHeight) /2
   statictext #calc.mess1, "Nombre d'échantillons 3 >..< 50 : - - - - > ", 140, 34, 195, 20
   TEXTBOX #calc.rep1, 335, 31, 30, 20
   statictext #calc.mess2, "Limite Inférieure de l'Intervalle : - - - - - - > ", 140, 54, 195, 20
   TEXTBOX #calc.rep2, 335, 51, 30, 20
   statictext #calc.mess3, "Limite supérieure de l'Intervalle : - - go- - > ", 140, 74, 195, 20
   TEXTBOX #calc.rep3, 335, 71, 30, 20
   button #calc.go, " go ", [go], UL,  375, 73, 30, 20
   statictext #calc.st1, "",140,100,220,20  '  "La f(x) d'origine est-elle calculée par prog (1) >"
   statictext #calc.st2, "",140,120,220,20  '"       Entrée Manuellement Point par Point(2) >"
   TEXTBOX #calc.rep4, 360, 107, 30, 20
   button #calc, " ok ", [cont4], UL, 400, 107, 25, 25
   TEXTBOX #calc.mess5, 140,140,220,20   'Calcul coeff/Valeur de x pour f(x)/Calcul coeff terminés
   TEXTBOX #calc.mess6, 140,160,220,20   'Dernier entré/Donnez x
   TEXTBOX #calc.xx, 370, 160, 50, 20
   button #calc, " ok ", [contx], UL,  430, 158
   button #calc, " CLS ", [cls], UL,  430, 250
   statictext #calc.st3, "",140,190,230,20   ' "Voulez vous f(x) en un point (1)"
   statictext #calc.st4, "",140,210,230,20   ' "f(x) Approchée (2)   Les deux Fonctions (3)"
   TEXTBOX #calc.repy, 380, 195, 30, 20
   button #calc, " ok ", [conty], UL,420, 195
   statictext #calc, "Def f(x) origine pour tests avant go ", 320, 5, 180, 20
   statictext #calc, "Par déf >", 373, 20, 45, 15
   button #calc, " f=x+2*cos(x)", [cosx], UL, 420, 25, 70, 20
   button #calc, " f=sin(x) ", [sinx], UL,  450, 65, 40, 20
   button #calc, " f=sqr(x) ", [sqrx], UL, 450,85, 40, 20
   button #calc, " f=x^2 ", [puisx], UL, 455, 45, 35, 20
   button #calc, " f=1/x ", [invx], UL,  450, 105, 40, 20
   statictext #calc, " param ! ^", 440, 125, 55, 15
   button #calc, " Visu fo ", [vis], UL,  430, 280, 45, 20
   statictext #calc.vis, "Par déf >", 420, 310, 60, 20
 
    button #calc.L, " . ", num,  UL, 5, 121
    button #calc.7, " 7 ", num, UL,  5, 34  'Number Buttons
    button #calc.8, " 8 ", num, UL, 44, 34
    button #calc.9, " 9 ", num, UL, 83, 34
    button #calc.4, " 4 ", num, UL,  5, 63
    button #calc.5, " 5 ", num, UL, 44, 63
    button #calc.6, " 6 ", num, UL, 83, 63
    button #calc.1, " 1 ", num, UL,  5, 92
    button #calc.2, " 2 ", num, UL, 44, 92
    button #calc.3, " 3 ", num, UL, 83, 92
    button #calc.0, " 0 ", num, UL, 44, 121
    textbox #calc.txt, 5, 150, 110, 20
    button #calc.c, " C ", num, UL, 5, 180
    button #calc.x, " Enter ", [cont], UL, 35, 180
    button #calc.m, " _ ", num,  UL, 95, 180
  graphicbox #calc.gr, 10, 250, 400, 300
  OPEN "Tchebychev" FOR Window as #calc  'GRAPHICS_nsb AS #w
  #calc "trapclose [quit]"
     pi=3.141592654: hd=50: flag1=5                 'initialise 1
     dim b(n): dim t(n,n): dim fo(n): dim fa(hd+1)
     dim x(hd): dim tt(n): dim xx(hd+1): dim fd(hd+1)
 
     print #calc.gr, "down"
     print #calc.gr, "fill darkgreen"
     #calc.txt "!font Times_New_Roman 10"
     global number, sign$, disp$, res$, result      'initialise 2
     DIM num$(2)
     number = 1
     'disp$ = "0"
     disp$ = space$(32-len(disp$)*2)+disp$  'right justified !?
     #calc.txt disp$
     #calc.gr "setfocus"
     #calc.gr, "flush;discard"
  WAIT
 
 [go]
    print #calc.mess5, ""
    print #calc.st1, "La f(x) d'origine est-elle calculée par prog (1) >"   'r=1
    print #calc.st2, "       Entrée Manuellement Point par Point(2) >"      'r=2
    #calc.rep1, "!contents? var$"
    n1 = val(var$)             'nombre echantillons
    n=n1-1
     redim b(n): redim t(n,n): redim fo(n): redim fa(hd+1)
     redim x(hd): redim tt(n): redim xx(hd+1): redim fd(hd+1)
    #calc.rep2, "!contents? var$"
    a = val(var$)              'limite inferieure
    #calc.rep3, "!contents? var$"
    b = val(var$)              'limite superieure
  wait
  [cont4]
    #calc.rep4, "!contents? var$"
    r = val(var$)    'choix 1/2  12 lignes plus haut
    if r=1 then print #calc.mess5, "Calcul des Coeff ( Wait and See...)"
 
    for i=0 to n
       x(i)=cos((2*i+1)/n1*pi/2)
       x=0.5*(x(i)+1)*(b-a)+a
       if r=1 then goto [aaa170]         ' Par prog
       if r=2 then goto [aaa200]         ' Point par point
 
  [aaa170]
      gosub [aaa3000]
      fo(i)=f                            ' f origine----->fo()----->fd()
      goto [aaa210]
  [aaa200]
      print #calc.mess5, "<-<-Valeur de f(x) pour x =   " ; x
  wait
  [cont]
      f = val(disp$)                     'valeur f(x) en x
      fo(i)=f
      print #calc.mess6, "dernier x entré: ";f
      num$(2)="0":num$(1)="0": disp$= "": #calc.txt disp$  'raz disp clavier
 
  [aaa210]
      next i
      k=0
      b(k)=0
      for i=0 to n
        t(k,i)=1
        b(k)=b(k)+fo(i)*t(k,i)
      next i    '270
      b(k)=1/n1*b(k)
      k=1
      b(k)=0
 
      for i=0 to n
        t(k,i)=x(i)
        b(k)=b(k)+fo(i)*t(k,i)
      next i   '340
      b(k)=b(k)*2/n1
 
      for k=2 to n
        b(k)=0
        for i=0 to n
          t(k,i)=2*x(i)*t(k-1,i)-t(k-2,i)
          b(k)=b(k)+fo(i)*t(k,i)
        next i    '400
        b(k)=2/n1*b(k)
      next k     '420
      PRINT #calc.mess5, "Calcul Coeff Terminé"
  [aaa440]
      PRINT #calc.st3, "Voulez vous f(x) en un point (1) - - - - - - - - - - - - >"
      PRINT #calc.st4, "f(x) Approchée (2)   Les deux Fonctions (3) - - - >"
  wait
  [conty]
      #calc.repy, "!contents? var$"
       r1 = val(var$)    '480
      if r1=1 then goto [aaa500]
      if r1=2 then goto [aaa700]
      if r1=3 then goto [aaa700]
  [aaa500]
    print #calc.mess6, "...............Donnez x - - - >- - >- - - >- - - >"
  wait
  [contx]
      #calc.xx, "!contents? var$"
      x = val(var$)
      if x< b and x >a then goto [aaa540]  '  bon
      print #calc.mess6, "X  hors Intervalle action précédente  "    ': ";a;" <--> ";b
  wait
      goto [aaa500]
  [aaa540]
    gosub [aaa2000]
    print #calc.mess5, "Pour x = ";x;" f(x) approch = ";fp
    if r=2 then goto [aaa440]
    gosub [aaa3000]
    ecar=abs(f-fp)
    PRINT #calc.mess5, "f(x) origine = ";f;" Ecart = ";ecar
    goto [aaa440]
  [aaa700]
    mi= 1: ma= -1 'code Apple: 1E30: -1E30
    h=(b-a)/hd
    for i=0 to hd
      x=a+h*i:xx(i)=x
      gosub [aaa2000]
      fa(i)=fp
      if ma< fp then ma=fp
      if fp< mi then mi=fp
      if r1 <> 3 or r= 2 then goto [aaa860]
      gosub [aaa3000]
      fd(i)=f: x(i)=x
      if ma< f then ma=f
      if f< mi then mi=f
  [aaa860]
    next i
    if r1<3 or r=1 then mm=hd: goto [aaa950]
    for k=0 to n
      fd(k)=fo(k): f=fo(k): x(k)=0.5*(x(k)+1)*(b-a)+a
      if ma<f then ma=f
      if f<mi then mi=f
    next k
    mm=n
  [aaa950]
    ex=390/(b-a)
    ey=290/(ma-mi)
    ''trace fonction approchée 'jaune
    wx=ex*(xx(o)-a): wy=290-(fa(o)-mi)*ey
     print #calc.gr, "up"
     print #calc.gr, "goto ";wx;" "; wy
     for k=1 to hd
       sx=ex*(xx(k)-a): sy=290-(fa(k)-mi)*ey
       print #calc.gr, "color yellow; backcolor darkgreen"
       print #calc.gr, "down"
       print #calc.gr, "goto ";sx;" "; sy
       wx=sx: wy=sy
    next k
    if r1=2 then goto [aaa1120] ' fonction approchée
    '  trace fonction d'origine
    wx=ex*(x(o)-a): wy=290-(fd(o)-mi)*ey  ' f()--->fo()--->fd()
       print #calc.gr, "up"
       print #calc.gr, "goto ";wx;" ";wy
    for k=1 to mm
       sx=ex*(x(k)-a): sy=290-(fd(k)-mi)*ey
       print #calc.gr, "color red; backcolor darkgreen"
       print #calc.gr, "down"
       print #calc.gr, "goto ";sx;" ";sy
       wx=sx: wy=sy
    next k
  [aaa1120]                      ' Axes
     print #calc.gr, "color cyan; backcolor darkgreen"
     print #calc.gr, "up"
     print #calc.gr, "goto 200, 10"
     print #calc.gr, "down"
     print #calc.gr, "goto 200 290"
     print #calc.gr, "up"
     print #calc.gr, "goto 10, 150"
     print #calc.gr, "down"
     print #calc.gr, "goto 390, 150"
     for gg= 10 to 390 step 20   'graduation X(pour le fun)
       print #calc.gr, "up"
       print #calc.gr, "goto ";gg;" ";"150"
       print #calc.gr, "down"
       print #calc.gr, "goto ";gg;" ";"145"
     next gg
     for gg= 10 to 290 step 20   'graduation Y
       print #calc.gr, "up"
       print #calc.gr, "goto ";"200";" ";gg
       print #calc.gr, "down"
       print #calc.gr, "goto ";"205";" ";gg
     next gg
     print #calc.gr, "flush"
     #calc.gr, "flush;discard"
 
    'if a*b >0 then goto [aaa1160]  'a voir+++++++++???
    ' wx= a*ex
    ' print #calc.gr, "up"
    ' print #calc.gr, "goto ";wx;" ";"159"
    ' print #calc.gr, "down"
    ' print #calc.gr, "goto ";wx;" ";"0"
 [aaa1160]
    '  maximum; ma  :minimum; mi
    '  print; a : print; b
    '  end
  wait
  [aaa2000]                  ' Calcul
     x1=2*(x-a)/(b-a)-1
     fp=b(0)
     tt(0)=1 ' Polyn Tcheby
     tt(1)=x1
     fp=fp+b(1)*tt(1)
     for k=2 to n
        tt(k)=2*x1*tt(k-1)-tt(k-2)
        fp=fp+b(k)*tt(k)
     next k
  return
  [aaa3000]                  ' f() Origine Tests
     if flag1=1 then f=1/x
     if flag1=2 then f=sin(x)
     if flag1=3 then f=sqr(x)
     if flag1=4 then f=x*x
     if flag1=5 then f=x+2*cos(x)
  return
  [cls]
     #calc.gr "cls"
      print #calc.gr, "fill darkgreen"
      #calc.gr, "flush;discard"
  wait
  [invx]                     ' Choix f() Tests
    flag1=1
  wait
  [sinx]
    flag1=2
  wait
  [sqrx]
    flag1=3
  wait
  [puisx]
    flag1=4
  wait
  [cosx]
    flag1=5
  WAIT
 
  [vis]
  Xmin = -10
  Xmax = 10
  Xpas = 1
  Ymin = -10
  Ymax = 10
  Ypas = 1
    p = (300 * 6 / 7)/(Xmax - Xmin)  '300=WindowHeight gr
    q = (300 * 6 / 7)/(Ymax - Ymin)
    s = abs(Xmin*p)
    o = (300 * 6 / 7) - abs(Ymin*q)
 
    for m = 0 to (300 * 6 / 7)  '   for m=0   300=WindowHeight gr
    x = (Xmin + m / p)-5.5
    'pyf=1/x
     if flag1=1 then
       f=1/x: print #calc.vis, "f=1/x"
     end if
     if flag1=2 then
       f=sin(x): print #calc.vis, "f=sin(x)"
     end if
     'if flag1=3 then f=sqr(x)
     if flag1=3 then print #calc.vis, "Soucis !"
     if flag1=4 then
       f=x*x: print #calc.vis, "f=x*x"
     end if
     if flag1=5 then
       f=x+2*cos(x): print #calc.vis, "f=x+2*cos(x)"
     end if
     pyf=f-1.7
    y = ((Ymax - pyf) * q)
    if  pyf< Ymax and pyf > Ymin then
       print #calc.gr, "COLOR yellow;up; goto ";m;" ";y;";down; goto ";x1;" ";y1;";up;flush"
    end if
    x1 = m
    y1 = y
    next m
    #calc.gr, "flush;discard"
   goto [aaa1120]
  wait
 
 sub num handle$             ' Clavier entrée points f(x)
    n$ = right$(handle$,1)
    select case
    case instr("0123456789",n$)>0   'numbers
        num$(number) = num$(number) + n$
        if result then num$(number) = n$
        disp$ = num$(number)
       ' res$ = disp$
        result = 0
    case n$ = "m"
        sign$ = "-"
        num$(number)="-" + num$(number)
        disp$= "-" + disp$
        result = 0
    case n$ = "c"             'reset
        disp$ = "0"
        sign$ = ""
        redim num$(2)
        number = 1
    case n$ = "L"               'decimal
        if len(num$(number)) = 0 then num$(number) = "0."
        if instr(num$(number),".") = 0 then num$(number) = num$(number) + "."
        disp$ = num$(number)
        result = 0
 
    end select
    if instr(disp$,".")=0 then  'to erase first "0"
        if (val(disp$)<>0 and left$(disp$,1)="0") then disp$ = str$(val(disp$))
    end if
    disp$ = space$(32-len(disp$)*2)+disp$  'right justified !?  ( with font Times_New_Roman 10 )
    #calc.txt disp$
    #calc.gr "setfocus"
end sub
 
[quit]
    close #calc
end
  WAIT
 
 




Edité par Roland Le 21/06/2012 à 18h04
____________________
Roro

   
Le 23/06/2012 à 21h41

Libertynaute

Groupe: Membre

Inscrit le: 18/10/2011
Messages: 73
Salut Roland,

Je n'ai pas bien vu le but de ce programme, puisque je n'ai pas pu le faire fonctionner.

L'erreur "division par zéro" semble survenir *après* avoir rempli le dernier textbox, peut-être son contenu n'est-il pas bien reconnu ?

Pure supposisition.

Claude
____________________
Omnium populorum gallicorum bravissimi sunt Belgae.

Web    
Le 24/06/2012 à 00h38

Administrateur

Groupe: Administrateur

Inscrit le: 04/03/2012
Messages: 2083
Il est vrai que le fonctionnement est un peu complexe, j'aime bien les fenetres avec plein de boutons et de trucs à cliquer.( j'en connais un... que si il tombe dessus... il va te virer tout ça en moins de deux... ;) )
Bon, je viens de vérifier, ça marche. Entre 5 dans nombre d'échantillons (comme il faut les enter à la main un par un ), mets 1 en limite inférieure, et 10 en limite supérieure, clique sur "go"
choisis 2 (entrée point par point) que tu mets dans le textbox à droite des choix clique sur "ok"
A chaque x que le prog affiche donne pour f le carré exact (avec le clavier de gauche et "enter")(tu doit bien avoir une calculette dans un tiroir, c'est le moment de la faire chauffer)
Quand les cinq valeurs sont entrées , choisis 1 et "ok"( valeur en un point textbox à droite en face des choix)
entre un nombre dans le textbox indiqué par la fleche et "ok". Le prog te donne bien le carré du nombre que tu a entré, avec une approximation qui dépend du nombre de décimales que tu a donné lors de l'entrée des points.
Pour les courbes: Le prog d'origine mets une fonction en ligne 3000 ( je ne comprend pas trop le but, mais je l'ai mis, et comme je voulais comparer la tronche des courbes, j'ai piqué à "graphicus" qui est en [vis] (bouton "visu" ) de quoi afficher les fonctions.
Il ne restait plus assez de patience pour traiter les problèmes div par 0 et autres ( pour le débutant que je suis, c'est déjà pas si mal...si je peux me permettre cette auto-congratulation.. :p °
Le truc qui m'a vraiment troublé, c'est le: ma=1E30:mi=-1E30 :heink qui était dans le code "apple" au début du traçage [700]..que j'ai mis en commentaire.... mystère que je ne suis pas parvenu à élucider........
Quand à dire à quoi sert ce prog...Je le déconseille pour les travaux de génie civil. ;)



Edité par Roland Le 24/06/2012 à 01h09
____________________
Roro

   
Général » Tchebychev est mort... Il ne pourra pas gueuler  

 |  |

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