Curriculum and Labs for Engineering Education

cancel
Showing results for 
Search instead for 
Did you mean: 

Challenge mathématique #32 : Comment décimer une série de fractions

Bonjour à tous,


Pour le mois d'Avril, reprenons notre série de petits défis LabVIEW afin de trouver des nouvelles astuces de programmation.

Ce mois-ci un Livre de programmation LabVIEW de chez DUNOD à gagner.


Il suffit d’envoyer votre code LabVIEW  nommé de votre «Pseudo_ch32.vi » à emmanuel.roset@ni.com avant le 30 Avril.

Postez au minimum un "code envoyé" afin que je vérifie les envois dans la boite mail.

Un tirage au sort par loto sera effectué sur les bonnes réponses.


Voici le challenge :

Considérons une simple série qui additionne tous les inverses de i de 1 à N:      

serie.png

On retire de cette série toutes les fractions qui contiennent un moins un chiffre 9 au dénominateur (par exemple 1/9 et 1/396).

La série résultante s'appelle T.


L'entrée du problème est la valeur de n et vous devez répondre en donnant T(n)


Type de retour


Un nombre à virgule (double flottant)


Entrée du problème


Un nombre entre 1 et 10000

Vous pouvez vous aider du code de départ joint pour votre réponse.

N'hésitez pas à poser des questions sur la communauté

Bonne chance à tous

Emmanuel

Download All
Comments
lulu44
Active Participant
Active Participant
on

code envoyé

Cordialement
L.MICOU
emmanuel-fr
Member
Member
on

ca commence fort ! le petit code est juste et commenté

merci

Nico_EMC
Member
Member
on

Code envoyé

Sebastien_D
Member
Member
on

Code envoyé !

Bilsix
NI Employee (retired)
on

Bonjour Emmanuel, est-il possible d'avoir le code de départ en LV14 (voire plus ancien encore...) ?
Merci d'avance !

Bilsix.
emmanuel-fr
Member
Member
on

Ah mince il était préparé en LabVIEW 2010 et j'ai pas mis le bon.. merci d'avoir posé la question, c'est fait

(il est un peu vide par contre )

Bilsix
NI Employee (retired)
on

Merci ! Code envoyé !

Bilsix.
Yann_50
Member
Member
on

Code envoyé. j'ai installé labview 2015 par la meme occasion (j'avais telechargé le vi ce matin)

Didier_Bleses
Member
Member
on

Code envoyé

didje007
Active Participant
Active Participant
on

Code envoyé

BBrice
Member
Member
on

Code envoyé

ouadji
Trusted Enthusiast
Trusted Enthusiast
on

Un tirage au sort par loto sera effectué sur les bonnes réponses"

Quels sont les critères qui définissent "une bonne réponse" ?

Simplement le fait d'implémenter un code qui réalise la fonction demandée ?

Si seul le résultat en sortie définit une "bonne réponse" ...

... je suppose que tout le monde présentera une "bonne réponse". 

N'y a t-il pas d'autres critères de sélection ? Par exemple le code "le plus rapide" ?

Alice_M
Member
Member
on

Code envoyé !

joke67000
Member
Member
on

Code envoyé

Jules1403
Member
Member
on

code envoyé !!!

emmanuel-fr
Member
Member
on

En réponse à Ouadji, en effet différentes valeurs sont appliquées en entrée pour voir si les résultats sont corrects. Normalement il ne devrai y avoir que des bonnes réponses (pas toujours) puis un tirage au sort est effectué. Cela permet à tout le monde d'avoir une chance car sinon c'est toujours un peu les mêmes qui gagnent car ils sont très fort !

Cependant je réfléchis à un défi dans le défi (juste pour le fun) avec le code le plus rapide car un code a été envoyé en option avec une telle optimisation et des astuces supplémentaires.

ouadji
Trusted Enthusiast
Trusted Enthusiast
on

Merci emmanuel pour cette réponse.

une question subsidiaire :

Je suppose qu'il est interdit d'utiliser un quelconque Tableau de constantes ?

Je ne parle pas d'un Tableau contenant directement T(N) bien entendu

Mais quel que soit le Tableau de constantes qui serait utilisé ... je suppose que c'est "non" (?)

Ce que je pourrais parfaitement comprendre !

PS: "un défi dans le défi" (option "vitesse") ... pourquoi pas !

Concernant la "vérification des résultats" en appliquant en entrée différentes valeurs ...

attention au fait de comparer des DBLs entre eux.

Comparer les différents résultats (des différents participants) de façon "brute" est illusoire.

Avec un DBL, 2 résultats peuvent être différents et parfaitement corrects tous les deux.

Tous les résultats T(N) peuvent "varier" d'une valeur =< à (N x "machine Epsilon")

Mais tu sais parfaitement cela, toutes mes excuses d'en faire le rappel (inutilement).

Bonne journée emmanuel.

emmanuel-fr
Member
Member
on

Pour le tableau de constantes, c'est possible si par exemple il s'agit d'un tableau d'entiers qui sert aux calculs, mais biensur par un tableau qui remplace directement les divisions en doubles .

Oui les résultats en doubles font des arrondis aussi je suis tolérant et je prend en compare à au moins 6 chiffres après la virgule. De plus je regarde l'agorithme qui normalement est assez simple.

Pour ceux qui veulent voici une option si cela les intéresse pour essayer d'optimiser encore le code.

Cela ne joue pas sur le prix à gagner mais juste pour le fun.

Je propose de trouver des astuces pour aller le plus vite possible sur un calcul d'une valeur de n  > à 9000.

Voici un code de test qui permet de supprimer les tampons mémoire entre chaque appel pour valider les temps.

Je pense l'utiliser.

fa temps.png

diag temps.png

ouadji
Trusted Enthusiast
Trusted Enthusiast
on

ok pour le Tableau de constantes "possible".

Pour la suite de ton post ...

oupsss ...     pas trop d'accord concernant ton code de Benchmark (toutes mes excuses)

Pourquoi ?

Le noeud de Méthode "Run VI" est beaucoup trop lent !

regarde ... j'ai testé avec un VI ne contenant aucun code (un VI vide) ...

Ton Benchmark me donne une moyenne de 780 micro sec !

De mon côté, j'ai 2 codes à proposer

Le 1er (avec n=9000) tourne en 78 micro sec, et le 2eme (tjs avec n=9000) tourne en 19 micro sec.

Donc ta méthode de mesure avec "Run VI" fausse complètement les mesures.

Il faut mettre le code "directement dedans" .. au minimum via un appel de sous-VI.

Là, j'arrive à mesurer des temps corrects.

Ta méthode avec "Run VI" est pratique et élégante ...

mais ce noeud est beaucoup trop lent pour mesurer des temps d'exécution courts.

je te propose ceci, qu'en penses-tu ?

C'est toi le Patron, c'est toi qui décide évidemment ! 

yyyyyy.png

emmanuel-fr
Member
Member
on

Merci pour les propositions et réactions, j'ai mis en effet le code en copie pour avoir les avis. En fait la méthode qui appelle le code directement en natif est fausée car il réutilise des optimisations de type "buffers" quand on tourne en boucle. C'est du à l'optimisateur du compilateur. J'avais remarqué cela dans les premiers défi de vitesse qui étaient tous un peu faussés car étrangement rapides en regard de certains lourds calculs (qui sont mis en contantes par le compilateur). C'est pour cela que pour les défis, la méthode du open/close réinitialise tout à zéro comme si on l'ouvrait pour la première fois et est "apparemment" plus lent.

De toutes facon la vitesse dépend d'une machine de référence et du jitter (il ne faut pas que le PC rafraichisse le disque pendant le test). Tout ceci est assez délicat pour être juste. faut-il prende le pic min ou la moyenne par exemple...

Pour cela le mieux est de faire des comparaisons relatives sur la même machine.

ouadji
Trusted Enthusiast
Trusted Enthusiast
on

C'est toi le Boss emmanuel, c'est à toi de décier.

Mais avec la méthode du "open - run/wait until done - close" ... quand je vois que j'ai 780µs de moyenne pour le benchmark d'un vi ne contenant aucun code, cela me porte à la prudence. (sans plus) Je vais te transmettre mon code. Merci pour ces petits challenges bien amusants, c'est très chouette.

ouadji
Trusted Enthusiast
Trusted Enthusiast
on
RchB
Member
Member
on

code envoyé

Cisco
Active Participant
Active Participant
on

code envoyé.

Francis M
Djokes95
Member
Member
on

code envoyé

beno72
Member
Member
on

code envoyé

ALoa
Member
Member
on

Code envoyé

Tolcim10
Member
Member
on

code envoyé

adcpc
Member
Member
on

code envoyé

emmanuel-fr
Member
Member
on

Bonjour !

Il est temps de faire gagner quelqu'un pour le challenge 32

Voici les personnes participantes. Le prochain tirage du loto www.fdj.fr se fera mercredi. On attend la boule_1 si on a une valeur comprise entre 1 et 19, puis boule_2 etc.. presque 1/3 des boules, nous devrions avoir un gagnant rapidement.

Je prends comme référence l'historique des tirages avec l'ordre d'arrivée des boules.

Le gagnant du challenge d'avril recevra le Livre LabVIEW de chez Dunod (442 pages)

1 - lulu44_ch32.viok
2 - Nico_EMC_Challenge32.viok
3 - Sebastien_D_ch32.viok
4 - Bilsix_ch32.viok
5 - Yann_50_ch32.viok
6 - (versions a,b,c,d) - Bleses_Ch32.viok
7 - Didje007_Ch32.viok
8 - BBrice_ch32.viok
9 - Alice_M_ch32.viok
10 - Joke67000_ch32.viok
11 - Jules1403_ch32.viok
12 - Rachbou_32.viok
13 - Cisco_ch32.viok
14 - Djokes95.viok
15 - beno72_ch32.viok
16 - ALoa_ch32.viok
17 - Tolcim10ok
18- adcpc_ch32.viok
19 - ouadji - Ch32.zipok
emmanuel-fr
Member
Member
on

J'ai ajouté quelques participants qui ont été un peu bloqués par les rouages des serveurs. Merci pour les messages.

Le tirage est ce soir

emmanuel-fr
Member
Member
on

Bonjour ! résultats du tirage au sort de Mercredi. C'est la boule 2 qui a désigné le chanceux

annee_numero_de_tiragejour_de_tiragedate_de_tiragedate_de_forclusionboule_1boule_2

2016

MERCREDI18/05/201618/07/2016221

Donc le gagnant pour le livre LabVIEW du mois d'avril est Lulu44

Bravo !

Contributors