Bibm@th

Forum de mathématiques - Bibm@th.net

Bienvenue dans les forums du site BibM@th, des forums où on dit Bonjour (Bonsoir), Merci, S'il vous plaît...

Vous n'êtes pas identifié(e).

#1 03-08-2016 18:04:23

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

A propos de langage

Bonjour Yoshi.
Pour éviter de faire du hors-sujet, j'ai ouvert on nouveau sujet.
J'ai bien aimé les échanges provenant de "commentcamarche", en particulier ceci

Après en général apprendre la programmation ne consiste pas a apprendre les différent type de langage, mais surtout à apprendre l'algorithme: ce qui fait ton programme, c'est l'algorithme. Ton programme en lui même est un algorithme. Quelque soit le langage que tu utilisera, cela reviendra au même.
Il y a une infinité de manière de faire un même algorithme, donc a toi de trouver la plus approprié et la plus efficace et de la retranscrire dans le langage de ton choix.

Cela m'amène à la réponse suivante. "Qu'importe le langage, l'important est de faire ce que l'on veut ou doit faire".
Donc, en toute bonne foi et de bonne volonté, j'ai essayé de transposer le code Python dont on parle dans le langage que j'utilise habituellement, en l'occurrence C/C++. Pour transposer, il fallait comprendre, donc écrire l'algorithme (ie. la suite logique des instructions dans ma langue maternelle). Ben j'y suis pas arrivé. J'ai bloqué d'abord sur l'absence de définition des variables. Je sais, je suis de la vieille école mais j'aime bien savoir à qui j'ai affaire, ce que je traite etc. Je prends l'exemple suivant :

def get_triples():
  return [(i,j,SumNumber-i-j) for i in range(1, SumNumber//3 + 1) for j in range (i, (SumNumber-i)//2+1)]

/* Unique appel dans le programme */
population = get_triples()    
 

Donc on peut en déduire que "population" est un tableau, puis que ailleurs on trouve "len(population)".
J'ai pas eu trop de mal à trouver la signification de range(int, int)
Ensuite, le tableau renvoyé est-il de dimension 1 ou 2 ? Que veut dire '//' (jamais vu ailleurs) etc.
Donc, j'ai été incapable d'écrire l'algorithme, à fortiori, incapable de transposer.

Par ailleurs, lorsque je lis des échanges entre programmeurs et que A dit "ça marche pas" B répond "quelle version as-tu ?" A dit "version 2" B répond "2b est mieux, rangen fait cela maintenant par défaut" etc. Alors, je me sauve en courant.     

Par ailleurs, suite à des demandes insistantes, j'ai dit qui était l'auteur de l'avis sur Python ...
ET je n'ai jamais dit que c'était parole de vérité. C'est un avis.

Sur un plan plus général, je préfère les langages compilés pour un certain nombre de raisons. J'ai été un peu dérouté quand j'ai fait du PHP. Le manque de compilation supprimait un contrôle qui me parait important.
De toute façon la comparaison C vs Python est sans objet.

Bonne journée.

Hors ligne

#2 03-08-2016 19:09:28

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Salut,

Comment ça marche. C'est bien pour ça que je t'ai mis ce lien.
Python a une particularité déroutante, il permet de remplir des listes (pas des tableaux, des listes.) au moyen de la technique dite "list comprehension".
Et on se passe de déclaration, c'est le cas de ton extrait.
En mode "normal", il s'écrirait :

def get_triples(SumNumber):
    L=[]
    for i in range(1, SumNumber//3 + 1) :
        for j in range (i, (SumNumber-i)//2+1):
             L.append((i,j,SumNumber-i-j))
    return  L

Tu dois bien comprendre qu'ici, si je ne déclare pas L comme une liste vide, je serai dans l'impossibilité de lui ajouter les triplets et Python me dira NameError: name 'L' is not defined
Il ne faut pas croire non plus su'on peut se permettre n'importe quoi en Python...

Ainsi, à la place de SumNumber, ici tu peux écrire 2016 et le passer en argument SumNumber à la fonction : ne pas procéder ainsi (passer 2016 directement) permet de donner n'importe quelle valeur à la variable SumNumber : si j'ai 10 fonctions qui utilisent cette valeur, ça m'évitera de la remplacer 10 fois si je l'ai écrite en "dur".

En "dur",
j'aurais écrit (et ça fonctionnerait plus vite, en C, ça n'aurait pas d'importance  ; en Python, si parce qu'il est très lent)

def get_triples(SumNumber):
    L=[]
    for i in range(1, 673) :
        for j in range (i, (2016-i)//2+1):
             L.append((i,j,2016-i-j))
    return  L

D'ailleurs Yassine en post #6 avait écrit :

def get_triples():
  triples = []
  for i in range(1, int(2016/3) + 1):
    for j in range (i, int(0.5*(2016-i))+1):
      elt = (i,j,2016-i-j)
      triples.append(elt)
  return triples

Il y a des variables locales et des variables globales qui alors doivent être définies en tant que telles.
Dans les fonctions, les variables sont par défaut locales : si j'utilise la variable i dans ma fonction, le corps du programme n'en aura pas connaissance et réciproquement...
Et // donne le quotient euclidien
7/5 = 1.4  mais 7//5 --> 1
7//5 c'est la même chose que int(7/5) int : partie entière...
range(), c'est un itérateur qui admet 3 paramètres : start, stop, step.
range(5) est identique à range(1,5,1)
for in in range(5):
    print(i)
renvoie
0
1
2
3
4

for in in range(2,5):
    print(i)
renvoie
2
3
4

for in in range(0,12,3): # j'utilise un pas de 3
    print(i)
renvoie
0
3
6
9

(Le commentaire en Python est précédé de #)


Ce sont des choses de base que tout débutant doit apprendre quel que soit le langage.
Je suis certain de pouvoir reproduire ce fonctionnement en C...
Il suffit que je regarde quelle est la syntaxe de for en C. Je ne sais pas déclarer une fonction en C mais l'intérieur de la fonction  ressemblerait grosso modo à

for (int i=0, i<673, i++);
    {
    for (int j=0, j<(2016-i)/2,j++);
        {
        remplir tableau avec le triplet (i,j,2016-i-j);
        }
     }
Récupérer le tableau.

C'est toi le programmeur C, je pense que la notion de tuple y existe et qu'un tuple a le droit d'être un élément de tableau, je ne sais pas remplir un tableau sans connaître sa taille au départ, alors toi tu dois être capable sur la base ci-dessus d'écrire un code fonctionnel...

Fais voir !

@+


Arx Tarpeia Capitoli proxima...

En ligne

#3 03-08-2016 19:21:48

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : A propos de langage

Oui, D'accord demain je fais une transpo. du programme dont il s'agit.
Intellectuellement, c'est vraiment intéressant.
PM, je ne suis pas programmeur, mais géomètre. L'informatique est un outil que j'ai appris à utiliser.
Sur mon site, il y a quelques infos, qui datent de plus de 10 ans, mais toujours vraies.

Hors ligne

#4 03-08-2016 20:36:44

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Re,

Les list comprehension, je dirais que c'est inspiré du mode de définition d'un ensemble en compréhension (et non en extension).
On pourrait traduire :
[(i,j,SumNumber-i-j) for i in range(1, SumNumber//3 + 1) for j in range (i, (SumNumber-i)//2+1)]
par
Liste des triplets (i,j,SumNumber-i-j) pour i allant de 1 à quotient entier de (SumNumber par 3) + 1 pour j allant de i à quotient entier de ((SumNumber-i) par 2)+1

[] les crochets sont constitutifs d'une liste...
Les listes Python se comportent bizarrement pour le novice, regarde :
>>> A=[1,2,3]
>>> B=A
>>> A[1]=5
>>> print (B)
[1, 5, 3]
>>>
De quoi s'arracher les cheveux si on ne sait pas...
Le problème vient de ce qu'en écrivant B=A on ne crée pas, contrairement à ce qu'on croit une nouvelle liste B distincte de la première et qui lui est égale...
Pour parler comme en C, on crée un alias de A qui en tant que tel pointe sur a zone mémoire  occupée par A : c'est donc le même objet...
Donc normal que si on modifie A et qu'on affiche B, il apparaisse modifié aussi.
Comment avoir deux listes distinctes alors ?
Comme ça :
>>> A=[1,2,3]
>>> B=A[:]
>>> A[1]=5
>>> print (A)
[1, 5, 3]
>>> print (B)
[1, 2, 3]
Avec B=A[:] je copie le contenu de A dans B.
Je pourrais faire aussi
A=[1,2,3]
B=[]
for no in A:
    B.append(no)

Et encore
A=[1,2,3]
B=[x for x in A] list compréhension.

Donc, en Python, on ne peut pas faire n'importe quoi n'importe comment...
On a aussi besoin de rigueur dans la conception et le passage à l'acte.

Il y a bien d'autres subtilités encore, mais là n'est pas mon propos.
Pour te paraphraser :
PM, je ne suis pas programmeur, mais prof de Maths retraité. L'informatique est un outil que j'ai appris à utiliser (lors du 1er plan informatique pour tous, sur MO5 et TO7).
A vrai dire, j'ai commencé en Fac avec le langage ALGOL : on écrivait des programmes sur papier qu'on transmettait au Prof, lequel transmettait aux "informaticiens" et qui rendait le verdict une semaine après (nous, on ne voyait pas les machines, même de loin).
Souvent, on avait un un listing avec un beau message d'erreur... Et une semaine après ! De quoi vous dégoûter de la programmation.

Les temps ont changé...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#5 03-08-2016 22:01:19

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : A propos de langage

Bonsoir Yoshi;
Je réponds à ton dernier paragraphe. A part un cours d'informatique générale, j'ai toujours eu à "produire", donc aucun droit à l'erreur.
Tu sais, un jour j'ai eu un tél, dans le cadre professionnel, de quelqu'un qui m'expliquait que l'outil de calcul qu"il utilisait était comme-ci comme-ça, il se trouve que cet outil, je l'avais mis au point et donc mis en exploitation 10 ans avant, dans la centrale informatique d'Evry (c'était vers les années 77-76).  Désolé, ce n'est pas mon habitude de donner des références.
Demain, je transpose avec toutes les justifications nécessaire le programme Python don on parle en code C, peut-être un peu de C++.
Bonne soirée.

Hors ligne

#6 04-08-2016 14:20:22

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : A propos de langage

Bonjour Yoshi.
En C/C++ il y a aussi la notion de variable locale. Il existe aussi des variables globales. Il ne faut utilise ce type de variable que si on a de bonnes raisons pour le faire.
Il faudra que tu m'expliques un jour la différence entre un tableau et une liste. Un programmeur pour manipuler un tableau, la machine en est incapable à cause de son organisation strictement linéaire et séquentielle, c'est pourquoi les langages prévoient une interface.
En C un tableau s'écrit Tab[25][3] en Fortran IV Tab(25, 3).
En C pour créer un tableau on doit connaitre sa dimension. Si on ne la connait pas au moment de la compilation, on devra réserver de la mémoire par la fonction alloc(). Bien sûr, puisqu'on l'a réservée pas programme à l'exécution, il faudra la libérer par programme à l'exécution quand on n'en a plus besoin. Les debogueurs prévoient un méthode pour vérifier qu'il n'y a pas de "fuite mémoire", mais je ne laisserai jamais la machine nettoyer la mémoire à ma place (cf ramasse-miette).
Donc, pour la séquence def_triplet, on pourrait faire comme ça :

  int population[338688][3];  // population est déclaré dans le bloc actif et sera supprimé à la sortie.
  int SumNumber=2016;
  int rang=0;
  for (int i=0; i < SumNumber/3; i++)
  {
     for (int  j = i; j < (SumNumber-i)/2 ; j++)
     {
        population[rang][0] = i;
        population[rang][1] = j;
        population[rang][2] = SumNumber - i - j;
        rang++;
    }
  }
A noter que tout peut être écrit sur une seule ligne, mais c'est tout à fait déconseillé.

Il n'y aurait pas lieu de faire une fonction pour cette opération, puisqu'elle n'est réalisée qu'une seule fois.
Mais je crois qu'il ne viendrait à l'idée de personne de créer un tableau de 300000 triplets seulement pour en tirer 100 au hasard.

On en revient donc à la question de base : comment décrire l'algorithme ? Moi, je ne sais pas.

Autre hypothèse, la longueur du tableau est inconnue, alors, il faudra utiliser une écriture de la sorte.
La déclaration de population sera du genre
  int population[][3];
Pour chaque triplet
  population[rang][3] = (int*)malloc(sizeof(int) * 3);     
A la fin
  for (int k = 0; i< RangMax; i++)  // RangMax aura été fixé à la fin de l'écriture du tableau.
  {
    free (population[k]);
  }   

[HS] J'aimerais bien savoir ce que pense Camille23 du problème évoqué. [/HS]
[EDIT] j'ai eu des soucis avec un 'i' entre crochets.

Hors ligne

#7 04-08-2016 15:22:53

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : A propos de langage

yoshi a écrit :

for (int i=0, i<673, i++);
    {
    for (int j=0, j<(2016-i)/2,j++);
        {
        remplir tableau avec le triplet (i,j,2016-i-j);
        }
     }
Récupérer le tableau.

Tiens, en maple :


seq(seq( [i, j, 2016-i-j] , j=i .. iquo(2016-i,2) ), i=1..672) ;
 

fournit une suite contenant les 338688 triplets ;)

Hors ligne

#8 04-08-2016 15:26:59

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : A propos de langage

Dlzlogic a écrit :

Mais je crois qu'il ne viendrait à l'idée de personne de créer un tableau de 300000 triplets seulement pour en tirer 100 au hasard.

Nous sommes d'accord. D'où l'intérêt d'une fonction que construit un triplet valide selon la loi uniforme ;)

Hors ligne

#9 04-08-2016 16:45:12

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Salut,


J'avais bien subodoré tout ça ce matin en fouillant le net...

Il faudra que tu m'expliques un jour la différence entre un tableau et une liste.

Les listes en Python pur, sont des équivalents des tableaux des autres langages.
En python, on peut installer de nombreuses librairies tierces, dont celle dont je me sers - numpy - dédiée aux calculs scientifiques : elle ajoute à Python des fonctionnalités comparables à celle de MatLab. Dans cette librairie tierce, figurent explicitement des arrays, des tableaux donc, et ils ne peuvent eux contenir que des nombres... Pourquoi ? Je ne sais pas...
J'avais déjà remarqué cette restriction dans AlgoBox le "langage" utilisé dans beaucoup de Lycées pour l'initiation à l'Algorithmique.
To fils "vomit" Python ? dis-lui d'aller jeter un œil sur AlgoBox...
La liste, est très puissante, elle dispose de nombreuses méthodes (append, extend, sort, index, count..etc).
On peut les slicer, on peut les parcourir (à l'endroit, à l'envers) sans faire appel à l'index des éléments (il doit y avoir intégré l'équivalent des EOF des fichiers :
Par ex :
L=[3,2,1,4,5]
for i in range(5):
    print (L[ i]%2)

peut se faire aussi ainsi :
L=[3,2,1,4,5]
for elt in L:
    print (elt%2)
Je peux trier une liste
- soit "sur place" : L.sort()
- soit avec une liste (autre ou la même) : L=sorted(L)
Je peux supprimer tous les doublons d'une liste via set() (qui ordonne en même temps.
De nombreuses routines Python sont écrites en C
.

Tiens j'avais programmé le calcul de la fonction indicatrice d'Euler sans trop de fioritures, mais avec force sorties dans un but pédagogique :

#!/usr/bin/env python
# -*- coding: cp1252 -*-
 
from math import sqrt
 
def diviseurs(n):
    D,racine=[1],int(sqrt(n))
    fin=racine+1
    for d in range(2,fin):
        if n%d==0 :
            D.extend([d,n//d])
    D=sorted(set(D))
    return D
 
 
print ("           *****************************************************")
print ("           *  Calcul de l'indicatrice d'Euler par différences  *")
print ("           *****************************************************")
print()
 
n=2444578
D=diviseurs(n)
print ("D("+str(n)+") =",D)
print()
Phi,somme=[1],"1"
 
for i,div in enumerate(D):
    print ("Phi("+str(div)+") =",end=" ")
    ch=str(div)
    if div==1:
        print("1")
    else:
        D_i,q=[d for d in D if div%d==0 and d<div],0
        for d in D_i:
            q+=Phi[D.index(d)]
        ch+="-"+str(q)
        p=div-q
        Phi.append(p)
        somme+="+"+str(p)
        print (str(div)+"-Somme des Phi des diviseurs<"+str(div)+" =",ch,"=",div-q)
    ch=""
print ()
print ("Somme :",somme,end=" ")
print ("=",sum(Phi))
print ("\n          Phi("+str(n)+") =",str(n)+" - "+str(sum(Phi)),"=", n-sum(Phi))

Sortie :

        
           *****************************************************
           *  Calcul de l'indicatrice d'Euler par différences  *
           *****************************************************

D(2444578) = [1, 2, 19, 23, 38, 46, 437, 874, 2797, 5594, 53143, 64331, 106286, 128662, 1222289]

Phi(1) = 1
Phi(2) = 2-Somme des Phi des diviseurs<2 = 2-1 = 1
Phi(19) = 19-Somme des Phi des diviseurs<19 = 19-1 = 18
Phi(23) = 23-Somme des Phi des diviseurs<23 = 23-1 = 22
Phi(38) = 38-Somme des Phi des diviseurs<38 = 38-20 = 18
Phi(46) = 46-Somme des Phi des diviseurs<46 = 46-24 = 22
Phi(437) = 437-Somme des Phi des diviseurs<437 = 437-41 = 396
Phi(874) = 874-Somme des Phi des diviseurs<874 = 874-478 = 396
Phi(2797) = 2797-Somme des Phi des diviseurs<2797 = 2797-1 = 2796
Phi(5594) = 5594-Somme des Phi des diviseurs<5594 = 5594-2798 = 2796
Phi(53143) = 53143-Somme des Phi des diviseurs<53143 = 53143-2815 = 50328
Phi(64331) = 64331-Somme des Phi des diviseurs<64331 = 64331-2819 = 61512
Phi(106286) = 106286-Somme des Phi des diviseurs<106286 = 106286-55958 = 50328
Phi(128662) = 128662-Somme des Phi des diviseurs<128662 = 128662-67150 = 61512
Phi(1222289) = 1222289-Somme des Phi des diviseurs<1222289 = 1222289-115073 = 1107216

Somme : 1+1+18+22+18+22+396+396+2796+2796+50328+61512+50328+61512+1107216 = 1337362

          Phi(2444578) = 2444578 - 1337362 = 1107216

Quelqu'un a répondu : voilà plus simple.

def Phi(n):
    x = 0
    i = n-1
    while i > 1:
        if i % 2 == 0:
            i = i>>1
            x += 1
        else:
            i = n-i
    S = n % x
    F = n-S
    return F

D(accord c'est plus simple, beaucoup plus simple... Mais si je tape :
print(Phi(2444578))
j'obtiens une erreur :

Traceback (most recent call last):
  File "C:/Python34/Indicatrice_euler_basique.py", line 14, in <module>
    print(Phi(2444578))
  File "C:/Python34/Indicatrice_euler_basique.py", line 10, in Phi
    S = n % x
ZeroDivisionError: integer division or modulo by zero

>>>...
J'avais fait un autre essai avant avec un nombre plus grand de 5 ou 6 chiffres de plus, j'ai arrêté au bout d'une minute, rien ne venait...
Ma version est beaucoup plus bavarde, pourtant même avec des nombres de 8 à 10 chiffres, l'affichage démarre quasi instantanément.
La simplicité, c'est bien, c'est une intention ô combien louable, encore faut-il que la version testée l'ait été avec plusieurs nombres et qu'elle fonctionne...
Variables globales/locales.
En Python, les programmeurs chevronnés aiment à répéter, sentencieux : les variables globales, c'est mal !
Pour les éviter, il faut créer des Classes...

Il n'y aurait pas lieu de faire une fonction pour cette opération, puisqu'elle n'est réalisée qu'une seule fois.

C'est vrai, mais (pour moi en tout cas) c'est une façon d'aérer le programme principal...
Habitude prise en Turbo Basic (Tiens il fallait y déclarer les tableaux... On pouvait définir des plages de lettres - globalement - comme étant  (au minimum) la première lettre de variables entières, réelles, string... ça libérait de la mémoire...


@+


Arx Tarpeia Capitoli proxima...

En ligne

#10 04-08-2016 18:48:59

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : A propos de langage

Bonsoir Yoshi,
j'ai l'impression qu'on ne parle pas vraiment de la même chose.
Un langage sert à traduire une logique qu'on appelle algorithme en code compréhensible pas la machine.
Les petits programmes qu'on appelle quelque fois "script" sont généralement des exercices, des modules de calcul d'une jolie formule mathématique, brefs, des trucs ponctuels, limités qui ne serviront, en gros, qu'à leur auteur.
Ce dont j'essaye de parler, ce sont des choses beaucoup plus énormes. Par exemple, j'ai un programme qui comporte une centaine de modules, chacun contient des dizaines de fonctions, tout ça est interdépendant et il faut que ça marche. Alors, plus le langage est de bas niveau, meilleur sera le résultat. Je sais bien que actuellement la seule préoccupation se compte en sous. Ce n'est pas la mienne.

Hors ligne

#11 05-08-2016 11:33:16

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Salut,


j'ai l'impression qu'on ne parle pas vraiment de la même chose.
Un langage sert à traduire une logique qu'on appelle algorithme en code compréhensible pas la machine.

Ah bin, ça alors, merci de cette précision : sans toi, jamais je ne serais douté d'une chose pareille...
Tu ne peux pas m'expliquer ce que sont et à quoi servent les opérations en Maths, aussi ? Je suis sûr que ça me serait d'un grand secours...
Merci d'avance...
Pas possible, tu dois adorer enfoncer les portes ouvertes...

Bon, alors il faut être clair : je n'ai pas l'intention de t'infliger des programmes Python complexes et au delà de la centaine de lignes de code effectives.
Je veux juste te montrer que, contrairement à ce que vous pensez,  ton fils et toi, Python n'est pas le pire des langages, le code n'est pas illisible, il n'est pas in-maintenable, il est facile d'accès pour un débutant en programmation.
Ses résultats sont aussi fiables que ceux obtenus avec n'importe quel autre langage...
Tu es obligé d'en convenir sur ce que tu as déjà vu : toutes mes simulations sont conformes, tes préventions contre le générateur de nombres pseudo-aléatoires ont dû tomber...
J'ai écrit un programme calcul de ce que freddy appelle "des mathématiques financières" : remboursements de prêts, calculs d'intérêts, de durées, de taux, de capitaux après placements divers de près de 700 lignes, contenant 22 fonctions, une dizaine de procédures et tous mes résultats ont toujours été conformes aux divers documents officiels produits...
cf http://www.bibmath.net/forums/viewtopic … 075#p15075
Je l'ai légèrement modifié depuis : il a été écrit avec Python de la branche 2.x, pour pouvoir le passer en 3.x...
Pas de quoi fuir en courant : print est devenu une fonction et ne s'écrit plus print tout court, mais print () :
Ce fut la seule modification de forme. J'ai aussi, en cas de prêt, modifié le calcul du taux applicable à chaque échéance, ayant découvert que selon qu'il s'agit d'un prêt immobilier ou à la consommation, le calcul dudit taux à partir du taux annuel est légèrement différent...
Mais Python n'est pas en cause, le responsable c'est moi,  à cause des méthodes de calcul indiquées... Mais les ca


Arx Tarpeia Capitoli proxima...

En ligne

#12 05-08-2016 12:12:22

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Salut,


j'ai l'impression qu'on ne parle pas vraiment de la même chose.
Un langage sert à traduire une logique qu'on appelle algorithme en code compréhensible pas la machine.

Ah bin, ça alors, merci de cette précision : sans toi, jamais je ne serais douté d'une chose pareille...
Tu ne peux pas m'expliquer ce que sont et à quoi servent les opérations en Maths, aussi ? Je suis sûr que ça me serait d'un grand secours...
Merci d'avance...
Pas possible, tu dois adorer enfoncer les portes ouvertes...

Bon, alors il faut être clair : je n'ai pas l'intention de t'infliger des programmes Python complexes et au delà de la centaine de lignes de code effectives.
Je veux juste te montrer que, contrairement à ce que vous pensez,  ton fils et toi, Python n'est pas le pire des langages, le code n'est pas illisible, il n'est pas in-maintenable, il est facile d'accès pour un débutant en programmation.
Ses résultats sont aussi fiables que ceux obtenus avec n'importe quel autre langage...
Tu es obligé d'en convenir sur ce que tu as déjà vu : toutes mes simulations sont conformes, tes préventions contre le générateur de nombres pseudo-aléatoires ont dû tomber...
J'ai écrit un programme calcul de ce que freddy appelle "des mathématiques financières" : remboursements de prêts, calculs d'intérêts, de durées, de taux, de capitaux après placements divers de près de 700 lignes, contenant 22 fonctions, une dizaine de procédures et tous mes résultats ont toujours été conformes aux divers documents officiels produits...
cf http://www.bibmath.net/forums/viewtopic … 075#p15075
Je l'ai légèrement modifié depuis : il a été écrit avec Python de la branche 2.x, pour pouvoir le passer en 3.x...
Pas de quoi fuir en courant : print est devenu une fonction et ne s'écrit plus print tout court, mais print () :
Ce fut la seule modification de forme. J'ai aussi, en cas de prêt, modifié le calcul du taux applicable à chaque échéance, ayant découvert que selon qu'il s'agit d'un prêt immobilier ou à la consommation, le calcul dudit taux à partir du taux annuel est légèrement différent...
Mais Python n'est pas en cause, le responsable c'est moi,  à cause des méthodes de calcul indiquées... Mais les calculs eux sont exacts et fiables dans le temps...
Mais pour l'instant, je n"ai rien fait d'aussi long que toi...
J'ai un projet en chantier (mais je n'avance pas vite, l'original en Basic Aamstrad étant écrit avec les pieds) ; récrire mon programme de conjugaison française : j'avais failli le vendre, on était presque d'accord, puis j'ai fait machine arrière en désaccord -pédagogique - avec l'éditeur sur les modifs d'affichage demandées (et mes collègues de français partageaient mon avis).
C'était un prog avec un lanceur (re-création lettres accentuées pas présentes sur mon clavier à l'époque, dessin des sprites... avec musique) après venait le corps du programme avec les interfaces de choix temps, modes voix/forme (voix active normale et forme pronominale), voix passive.
On pouvait lui demander de conjuguer alors c'était un Bescherelle informatisé, ou de conjugué soi-même et dans ce cas le programme signalait la localisation de la faute (radical, terminaison, participe passé), à la demande affichait la règle correspondante, avec 3 niveaux de difficulté, et en bas d'écran un requin qui mangeait un poisson devant lui après 6 fautes, on ne gagnait qui si le poisson se mettait en sécurité dans une grotte (après 6 bonnes réponses).
N'importe quel verbe, sans lexique de verbes,pas de demande du groupe du verbe (surtout difficile pour les verbes en ir : 6 mois de recherche pour avoir l'idée et la peaufiner)...
Gros gros boulot...

@+

Alors, plus le langage est de bas niveau, meilleur sera le résultat

Tu voudrais bien t'expliquer ? Sans me ressortir la définition de "langage de bas niveau", je sais ça aussi...

Je


Arx Tarpeia Capitoli proxima...

En ligne

#13 05-08-2016 14:00:07

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : A propos de langage

J'essaye de distinguer deux choses qui me paraissent bien différentes
1- l'analyse
2- la programmation.
Il est vrai que dans de nombreux cas, c'est le même individu (maintenant) qui réalise les deux opérations.
Dans un grand nombre de cas, en phase de formation, le programme à réaliser consiste à calculer une belle formule. La phase "analyse" est réduite à sa plus simple expression et malheureusement très souvent complètement oubliée. Je dirais pour simplifier "on cherche à savoir comment faire avant de se poser la question : que doit-on faire ?".

Concernant ta dernière question. Je vais prendre un exemple.
Je dois gérer un grand nombre d'objets. C'est à dire que j'ai à réaliser plusieurs opérations sur ces objets, par exemple, lecture, écriture, modification, relations entre eux, suppression etc.
En gros, j'ai deux choix possibles, soit faire une organisation de liste chainée, tableau de hachage etc., soit utiliser les classes existantes crées pour gérer ce type de choses.
Dans le premier choix, je sais exactement ce que je veux faire (je me suis accordé 15 jours de réflexion), donc je pouvais développer mon truc avec une économie et une efficacité maximum. Dans le second choix, je savais que les outils prévus, qu'on appelle de haut niveau, pouvaient réaliser bien des choses dont je n'avais pas besoin. Cela aurait entrainé une perte d'efficacité.
Par contre, lorsque l'efficacité n'est pas la préoccupation principale, mais plutôt le souci de me ménager, alors j'utilise des fonctions dite "haut niveau".   

Un autre exemple typique, la librairie Stream qui gère les flux. Lorsque j'ai eu ma première version de C++, j'ai tout de suite essayé cela. Cela ne m'a pas convaincu, en ce sens qu'il n'y avait rien de tellement nouveau, seulement une écriture différente. Alors j'ai laissé tomber ces classes générales. Par contre, j'ai utilisé les nouvelles possibilités, particulièrement new/delete. Mais j'utilise encore alloc/free dans certaines fonctions. J'ai eu l'occasion de faire des tests de rapidité entre des impressions (sorties) avec fprintf() et la librairie ostream, c'est sans appel.

Autre aspect du problème. Dans ce qui me concerne, j'ai trois types d'éléments, le point, la ligne et l'objet. Pour simplifier, un point, sauf s'il a un Z ou qu'il sert dans une définition d'un élément (ligne ou objet) est parfaitement inutile. Une ligne est définie par des points, dispose de caractéristiques type couleur, et c'est tout. Un objet peut être utilisé pour définir différentes choses, par exemple un texte, un bitmap ou je ne sais quoi. La programmation de bas niveau permet de différencier tout cela, pas celle de haut niveau.     

Tout ceci n'est bien-sûr que mon avis personnel. Je l'explique, mais je sais bien qu'il y a des gens qui ne sont pas d'accord.

Hors ligne

#14 05-08-2016 14:49:04

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : A propos de langage

Dlzlogic a écrit :

En gros, j'ai deux choix possibles, soit faire une organisation de liste chainée, tableau de hachage etc., soit utiliser les classes existantes crées pour gérer ce type de choses.
Dans le premier choix, je sais exactement ce que je veux faire (je me suis accordé 15 jours de réflexion), donc je pouvais développer mon truc avec une économie et une efficacité maximum. Dans le second choix, je savais que les outils prévus, qu'on appelle de haut niveau, pouvaient réaliser bien des choses dont je n'avais pas besoin. Cela aurait entrainé une perte d'efficacité.

J'aurais tendance à penser que :
- lorsque les outils ont été réfléchis et créés par des équipes compétentes, l'efficacité en résultant est plus grande ;
- lorsqu'on réalise soi-même un programme, le risque de bug est bien plus élevé que lorsque les outils existent depuis longtemps.

Quant à l'économie, la situation n'est pas évidente : prendre 15 jours (ie la moitié de son mois, donc la moitié de son salaire mensuel) pour réaliser un programme dont les capacités représentent 10% de celles d'un logiciel déjà existant et disponible (en vente), je ne sais pas ce qu'est le plus économique (tout dépend de son salaire et du prix du logiciel).

Dlzlogic a écrit :

Les petits programmes qu'on appelle quelque fois "script" sont généralement des exercices, des modules de calcul d'une jolie formule mathématique, brefs, des trucs ponctuels, limités qui ne serviront, en gros, qu'à leur auteur.
Ce dont j'essaye de parler, ce sont des choses beaucoup plus énormes.

Voici un avis de quelqu'un qui sait de quoi il parle :

Celui qui [veut] déplace[r] une montagne commence par [apprendre à] déplacer de petites pierres.

Hors ligne

#15 05-08-2016 16:20:27

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Ave,

En dehors de ce qu'a dit leon, je reprends ta phrase :

Alors, plus le langage est de bas niveau, meilleur sera le résultat...

Je vais préciszer ma question, parce que, pour moi, tu as répondu à côté :
Qu'est-ce qu'un résultat meilleur obtenu avec un langage de bas niveau par rapport à un autre obtenu via un langage de haut-niveau ?
Meilleur en quoi ?
- En terme d'exactitude des "résultats" (ça aussi, c'est un mot ambigü) ? Là je m'inscris en faux
   Exemple : j'ai besoin de faire des calculs avec 120 décimales exactes. Il y a un module en Python pour ça. Et dans les langages de bas niveau (C, C++) ? Oh, tu y arriveras, mais tu seras obligé, de tout récrire... Et là, je rejoins leon...

- en terme de vitesse d'exécution (compilé vs interprété ?) ?
   Là, Python comparé à C est effroyablement lent...
   Mon Python me calcule les 338688 triplets (et les stocke) en 0,009 s en C, ce serait instantané... Oui et alors ?
   Autre exemple quelqu'un voulait un programme de gestion d'un télépointeur dans l'espace sachant qu'il y avait des zones "aveugles"...
   Je l'ai fait en Python. Tu le feras en C... En valeur absolue, tu seras 40 fois plus rapide , ok !
   Mais compte tenu des déplacements purement mécaniques, cela fait-il vraie une différence ?
   Il existe sûrement de rares cas où la réponse doit être la plus rapide possible, "disons en temps réel".
   Dans ce cas, je ne m'adresserai pas à tous les bidouilleurs C, C++ ou que sais-je encore, mais aux programmateurs en Assembleur.
   Autre exemple : ça changera quoi haut niveau/bas niveau (Python, C) si quelqu'un veut faire les calculs financiers que j'ai reproduits ?
   Que ce soit mon prog Python ou la même chose écrite en C ?
Amusant :

Wikipedia a écrit :

Les langages machines et assembleurs sont la plupart du temps considérés comme des langages de bas niveau. D'autres langages, comme le C voire le C++, sont considérés par certains comme étant des langages de bas niveau. D'autres pensent au contraire que le C et le C++ sont des langages de haut niveau car ils ne permettent pas de gérer suffisamment finement le matériel dans certaines situations. Par opposition, le PHP est un langage de haut niveau qui se trouve être assez éloigné du langage machine.

Dlz a écrit :

Autre aspect du problème. Dans ce qui me concerne, j'ai trois types d'éléments, le point, la ligne et l'objet. Pour simplifier, un point, sauf s'il a un Z ou qu'il sert dans une définition d'un élément (ligne ou objet) est parfaitement inutile. Une ligne est définie par des points, dispose de caractéristiques type couleur, et c'est tout. Un objet peut être utilisé pour définir différentes choses, par exemple un texte, un bitmap ou je ne sais quoi. La programmation de bas niveau permet de différencier tout cela, pas celle de haut niveau.

Là, je ne te suis pas...
La programmation de bas niveau permet de différencier tout cela, pas celle de haut niveau.
Exemple précis, s'il te plaît.

@+


Arx Tarpeia Capitoli proxima...

En ligne

#16 05-08-2016 17:51:01

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : A propos de langage

"La programmation de bas niveau permet de différencier tout cela, pas celle de haut niveau."
Une simple réponse. Avec un certain étonnement, j'ai vu un programme écrit en C++ (ie haut niveau), où justement tous les éléments géométriques étaient du même type, c'est à dire d'aucun type. Ce logiciel était "énorme" (de mémoire plus de 100 Mo). C'est en repensant à cet exemple, que j'ai cité ce point.
Pour le reste, toi et Léon avez raison, sauf sur un point, ce n'est pas parce que je me donne un délai de réflexion de 15 jours que je ne fais rien d'autre pendant ce temps là.

Hors ligne

#17 05-08-2016 18:24:33

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Re,

Avec un certain étonnement, j'ai vu un programme écrit en C++ (ie haut niveau), où justement tous les éléments géométriques étaient du même type, c'est à dire d'aucun type. Ce logiciel était "énorme" (de mémoire plus de 100 Mo). C'est en repensant à cet exemple, que j'ai cité ce point.

Bin, ça ne prouve qu'une chose : que le programmeur était mauvais...
Un logiciel de 100 Mo, effectivement ça commence à être lourd... Et tu as pu examiner librement les sources de ce prog ?
Soit on t'a permis de consulter les lignes de code C++ directement, soit tu as pu décompiler ce Prog C++ s'il l'était déjà et dans ce cas je me demande si tu étais dans la légalité. En outre, je croyais qu'il était impossible de décompiler proprement des prog C ou C++ présentés sous forme d'un .exe ?
De plus :

OpenClassrooms a écrit :

Qu'est-ce qu'un langage de haut niveau ?

C'est un langage assez éloigné du binaire (et donc du fonctionnement de la machine), qui vous permet généralement de développer de façon plus souple et rapide.
Par opposition, un langage de bas niveau est plus proche du fonctionnement de la machine : il demande en général un peu plus d'efforts mais vous donne aussi plus de contrôle sur ce que vous faites. C'est à double tranchant.

Le C++ ? On considère qu'il fait partie de la seconde catégorie : c'est un langage dit « de bas niveau ». Mais que cela ne vous fasse pas peur ! Même si programmer en C++ peut se révéler assez complexe, vous aurez entre les mains un langage très puissant et particulièrement rapide. En effet, si l'immense majorité des jeux sont développés en C++, c'est parce qu'il s'agit du langage qui allie le mieux puissance et rapidité. Voilà ce qui en fait un langage incontournable.

Sauf que la dernière affirmation est certainement contestable....

@+


Arx Tarpeia Capitoli proxima...

En ligne

#18 05-08-2016 18:43:20

Dlzlogic
Banni(e)
Inscription : 25-04-2016
Messages : 461

Re : A propos de langage

Yoshi a écrit :

Et tu as pu examiner librement les sources de ce prog ?
Soit on t'a permis de consulter les lignes de code C++ directement, soit tu as pu décompiler ce Prog C++ s'il l'était déjà et dans ce cas je me demande si tu étais dans la légalité. En outre, je croyais qu'il était impossible de décompiler proprement des prog C ou C++ présentés sous forme d'un .exe ?

Je ne me souviens plus des détails, ce genre de chose, j'essaye de l'oublier très vite.
Il y a pas mal de logiciels de ce type qui sont en Open-Source.
En plus ton dernier sous-entendu est parfaitement désagréable.

Tiens, j'ai un exemple très précis qui me revient à l'esprit. Léon le connait bien, lors d'une discussion à propos de résolution de système linéaire, tout à fait dans le présent contexte, il m'en a donné un à résoudre (contre-exemple classique dont il se souvient certainement) Matlab ou Syslab se plantait lamentablement,c'est à dire donnait un résultat aberrant. Avec ma petite fonction, j'ai sorti un résultat acceptable.
Ceci est un exemple court, simple, parfaitement cerné, reproductible etc.

Yoshi a écrit :

Sauf que la dernière affirmation est certainement contestable.

Tout est contestable. Par ailleurs, OpenClassRooms n'est pas une référence je retiens.

Hors ligne

#19 05-08-2016 20:42:10

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Bonsoir,

Il n'y a pas de sous-entendu : tout est dit clairement, j'ai passé en revue l'éventail des possibilités.

à propos de résolution de système linéaire, tout à fait dans le présent contexte, il m'en a donné un à résoudre (contre-exemple classique dont il se souvient certainement).

Tu l'as encore ?
Voilà un défi intéressant.
Je vais savoir ce que fait la librairie scientifique numpy de Python.
Je vérifierai demain pour savoir si c'est implémenté. Si oui, j'aimerais essayer.

@+


Arx Tarpeia Capitoli proxima...

En ligne

#20 05-08-2016 22:33:47

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : A propos de langage

Dlzlogic a écrit :

Tiens, j'ai un exemple très précis qui me revient à l'esprit. Léon le connait bien, lors d'une discussion à propos de résolution de système linéaire, tout à fait dans le présent contexte, il m'en a donné un à résoudre (contre-exemple classique dont il se souvient certainement) Matlab ou Syslab se plantait lamentablement,c'est à dire donnait un résultat aberrant. Avec ma petite fonction, j'ai sorti un résultat acceptable.

Tu as un souvenir très avantageux de cet exemple... http://www.les-mathematiques.net/phorum … sg-1056599
Justement tu as abandonné la discussion au moment de résoudre le système qui posait problème avec les flottants (préférant en rester avec du calcul sur les nombres entiers). Puisque tu as l'air motivé, je te remets le système linéaire à résoudre :
il s'agit de résoudre en X  l'équation $C.X = B$ (un système 20x20)

$C = \left[ \begin {array}{cccccccccccccccccccc}
1/7&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-1/7\\
-8/7&1/7&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&1
\\0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&9
\end {array} \right]$
et
$B = [-\frac27,{\frac  {16}{7}},-2,16,-2,16,-2,16,-2,16,-2 ,16,-2,16,-2,16,-2,16,-2,17]$ (attention au 17 à la fin)

Pour plus de confort, voici comment construire la matrice C :


C := matrix(20,20, [0$400])
for i from 3 to 19 do C[i,20] := 7
for i from 3 to 20 do C[i,i] := 1
for i from 2 to 19 do C[i+1,i] := -8
C[1,1] := 1/7.
C[2,1] := -8/7.
C[2,2] := 1/7.
C[1,20] := -1/7.
C[2,20] := 1
C[20,20] := 9
 

Quelle est la solution ?

(attention : ne pas tricher, pas de calcul formel sur les entiers ou fractions, mais du calcul flottant uniquement)

Hors ligne

#21 06-08-2016 09:58:51

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Salut,

ton pseudo-code est différent de la matrice affichée.
Je vais utiliser tes matrices C et B.
Voilà mon code Python + numpy. En commentaires (après #) ce qui m'a permis de construire les matrices.
Personnellement, je ne trouve toujours pas le code illisible.
Essai n°1.
Python comprend un module fractions, je le charge et je m'en sers.
C'est tricher un peu, mais Dlz a écrit Plus un langage est de bas niveau meilleur est le résultat. Python même avec numpy et fractions reste de haut niveau.

import numpy as np
from fractions import Fraction

#LL=[]
#for j in range(20): #Remplissage total par des 0
    #l=[]
    #for i in range(20):
        #l.append(0)
    #LL.append(l)
# Traitement des cas particuliers
#LL[0][0]=Fraction(1,7)
#LL[1][0]=-Fraction(8,7)
#LL[1][1]=Fraction(1,7)
#LL[19][19]=-8
#for j in range(2,19):
    #LL[j][j-1],LL[j][j]=-8,1

#for j in range(20): # contrôle par affichage ligne par ligne
    #for i in range(20):
        #print(LL[j][i],end="  ")
    #print()

#print (LL) # Affichage global pour copier/coller dans le tableau numpy
#print()

a=np.array([[Fraction(1, 7), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [Fraction(-8, 7), Fraction(1, 7), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -8]])

b=np.array([Fraction(-2,7),Fraction(16,7),-2,16,-2,16,-2,16,-2,16,-2,16,-2,16,-2,16,-2,16,-2,17])
x = np.linalg.solve(a, b)

print (x)
print()
for i in x:
    print(i)

Résultat1 :

[ -2.00000000e+00  -0.00000000e+00  -2.00000000e+00   8.32667268e-16
  -2.00000000e+00   5.37347944e-14  -2.00000000e+00   3.43902684e-12
  -2.00000000e+00   2.20097718e-10  -2.00000000e+00   1.40862539e-08
  -1.99999989e+00   9.01520252e-07  -1.99999279e+00   5.76972961e-05
  -1.99953842e+00   3.69262695e-03  -1.97045898e+00  -2.12500000e+00]

-2.0
-0.0
-2.0
8.32667268469e-16
-2.0
5.37347943919e-14
-2.0
3.43902684108e-12
-1.99999999997
2.20097717829e-10
-1.99999999824
1.40862539411e-08
-1.99999988731
9.01520252228e-07
-1.99999278784
5.76972961426e-05
-1.99953842163
0.00369262695313
-1.97045898438
-2.125

Essai n°2
En remplaçant Fraction(c,d) par c/d...
Je lance.
Surprise : ça ne change rien. Donc numpy ne se sert pas de la notation Fractionnaire, dommage...

Pourtant, en Python pur, ça le fait (même en mode console) :

>>> Fraction(3,7)-Fraction(3,4)+Fraction(1,5)
Fraction(-17, 140)
>>> Fraction(3,7)-Fraction(3,4)+Fraction(2,5)
Fraction(11, 140)
>>> Fraction(Fraction(3,7)-Fraction(3,4)+Fraction(1,5),Fraction(3,7)-Fraction(3,4)+Fraction(2,5))
Fraction(-17, 11)
>>>


[EDIT] J'ai rajouté quelques commentaires...
@+

Dernière modification par yoshi (06-08-2016 10:45:26)


Arx Tarpeia Capitoli proxima...

En ligne

#22 06-08-2016 11:23:29

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : A propos de langage

Yoshi,
je viens de vérifier le pseudo-code : il est conforme à la matrice C donnée.

Attention, la dernière colonne de ta matrice C ne contient pas les 7, etc :
C[1,20] := -1/7.
C[2,20] := 1
for i from 3 to 19 do C[i,20] := 7
C[20,20] := 9

Dernière modification par leon1789 (06-08-2016 11:24:21)

Hors ligne

#23 06-08-2016 11:45:03

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Salut,

Bin cher ami, ce n'est pas de ma faute, mais latex a tronqué ta dernière colonne à cause du C= (trop long)
.
En rusant, et en remplaçant C= par C=\\ pour renvoyer à la ligne, il vient :
  $C =\\
\left[ \begin {array}{cccccccccccccccccccc}
1/7&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-1/7\\
-8/7&1/7&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&1
\\0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&0&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&1&7
\\0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&0&-8&9
\end {array} \right]$

Je rectifie mon code avec et sans Fraction et je reviens...

@+


Arx Tarpeia Capitoli proxima...

En ligne

#24 06-08-2016 12:29:00

yoshi
Modo Ferox
Inscription : 20-11-2005
Messages : 16 948

Re : A propos de langage

Re,

1/7  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  -1/7  
-8/7  1/7  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  
0  -8  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  7  
0  0  -8  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  7  
0  0  0  -8  1  0  0  0  0  0  0  0  0  0  0  0  0  0  0  7  
0  0  0  0  -8  1  0  0  0  0  0  0  0  0  0  0  0  0  0  7  
0  0  0  0  0  -8  1  0  0  0  0  0  0  0  0  0  0  0  0  7  
0  0  0  0  0  0  -8  1  0  0  0  0  0  0  0  0  0  0  0  7  
0  0  0  0  0  0  0  -8  1  0  0  0  0  0  0  0  0  0  0  7  
0  0  0  0  0  0  0  0  -8  1  0  0  0  0  0  0  0  0  0  7  
0  0  0  0  0  0  0  0  0  -8  1  0  0  0  0  0  0  0  0  7  
0  0  0  0  0  0  0  0  0  0  -8  1  0  0  0  0  0  0  0  7  
0  0  0  0  0  0  0  0  0  0  0  -8  1  0  0  0  0  0  0  7  
0  0  0  0  0  0  0  0  0  0  0  0  -8  1  0  0  0  0  0  7  
0  0  0  0  0  0  0  0  0  0  0  0  0  -8  1  0  0  0  0  7  
0  0  0  0  0  0  0  0  0  0  0  0  0  0  -8  1  0  0  0  7  
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  -8  1  0  0  7  
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  -8  1  0  7  
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  -8  1  7  
0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  9

Les 3 lignes d'instructions : 2 déclarations de tableaux a et b et demande solve inchangées mais matrice a rectifiée.
Résultat

[-1.88888889  0.11111111 -1.88888889  0.11111111 -1.88888889  0.11111111
-1.88888889  0.11111111 -1.88888889  0.11111111 -1.8888889   0.11111106
-1.88888931  0.11110772 -1.88891602  0.1108941  -1.890625    0.09722222
-2.          0.11111111]

-1.88888888889
0.111111111111
-1.88888888889
0.111111111111
-1.88888888889
0.111111111111
-1.88888888889
0.111111111098
-1.88888888899
0.111111110283
-1.88888889551
0.111111058129
-1.88888931274
0.111107720269
-1.88891601563
0.110894097222
-1.890625
0.0972222222222
-2.0
0.111111111111

J'ai bien peur que numpy se soit vautré aussi...


@+

Dernière modification par yoshi (06-08-2016 12:50:19)


Arx Tarpeia Capitoli proxima...

En ligne

#25 06-08-2016 12:49:40

leon1789
Membre
Inscription : 27-08-2015
Messages : 1 203

Re : A propos de langage

yoshi a écrit :

Bin cher ami, ce n'est pas de ma faute, mais latex a tronqué ta dernière colonne à cause du C= (trop long).

ok !


X = [-1.88888889  0.11111111 -1.88888889  0.11111111 -1.88888889  0.11111111
        -1.88888889  0.11111111 -1.88888889  0.11111111 -1.8888889   0.11111106
        -1.88888931  0.11110772 -1.88891602  0.1108941  -1.890625    0.09722222
        -2.          0.11111111]
 

Tes derniers résultats sont à la fois bons (dans le sens où C * "ton X" est proche de B) et pas bons ("ton X" fait 100 % d'erreur par rapport à la vraie solution).

Moins bon, la commande linsolve(C,B) de Maple donne


X=  [-3.739005343, -1.739005344, -3.739005344, -1.739005344,
        -3.739005344, -1.739005344, -3.739005344, -1.739005344,
        -3.739005344, -1.739005347, -3.739005365, -1.739005508,
        -3.739006650, -1.739015792, -3.739088932, -1.739674047,
        -3.744354964, -1.781802302, -4.081381012, -1.739005344]
 

Ce résultat est à la fois bon (dans le sens où C * "ce X" est proche de B) et pas bon ("ce X" fait 400 % d'erreur par rapport à la vraie solution).

Toujours en Maple, la commande inverse(C) * B donne


X=  [-9.800000089, -.00001007930159, -1.899980079, .1989899307,
        -1.799989079,   .1999999106, -1.800000079, .1999999208,
        -12.00100009, -10.10000008, -11.99898009, -9.900000129,
        -1.999990546, -9.999993884, -12.00103060, -10.00024421,
        -12.00195322, -10.01661508, -22.12500007, .1999999106]
 

C'est très mauvais car C * X est loin de B  (mais ce n'est pas étonnant car on ne procède pas comme cela pour résoudre numériquement un syst. lin.)

Dernière modification par leon1789 (06-08-2016 12:59:57)

Hors ligne

Pied de page des forums