Inscription / Connexion Nouveau Sujet
Niveau logiciels
Partager :

Petit service

Posté par
derny
29-06-23 à 21:34

Bonsoir
J'ai depuis longtemps dans mes archives des formules simples qui donnent approximativement la somme des n premières racines carrées. N'ayant pas de logiciel de mathématiques, Excel est vite dépassé. Pourrais-je avoir avec au moins 20 décimales exactes la somme des 100, 1000, 10000, 100000 premières racines carrées ? Ceci pour vérifier la "qualité" de mes formules.

Posté par
LeHibou
re : Petit service 29-06-23 à 23:33

Bonsoir,

Sous réserve de validation des experts,  langage Python est bien adapté pour calculer ce genre de résultats.

Posté par
derny
re : Petit service 30-06-23 à 11:05

Bonjour
Sur mon vieil ordinateur mon petit programme en Basic ne me donne que 14 décimales (toutes exactes ?).
Pour la somme des 100 000 000 premières racines carrées il met 134 secondes et me donne 666666671666.458784566114608.
Je pense que Python ferait mieux. SVP

Posté par
derny
re : Petit service 30-06-23 à 15:39

Personne pour faire ces quelques lignes de code ? Car je ne connais pas (encore) Python.

Posté par
lake
re : Petit service 03-07-23 à 12:35

Bonjour,
Ce que donne Maple avec 30 chiffres significatifs :

pdf
PDF - 88 Ko

Posté par
derny
re : Petit service 04-07-23 à 14:46

Merci lake, je vais pouvoir comparer.

Posté par
Ulmiere
re : Petit service 05-07-23 à 15:20

Je ne trouve pas la même chose que lake pour les derniers chiffres


import decimal
from multiprocessing.dummy import Pool as ThreadPool

precision = 100
decimal.getcontext().prec = precision

def sum_of_sqrt(u):
    decimal.getcontext().prec = precision
    return sum(decimal.Decimal(k).sqrt() for k in range(*u))


if __name__ == "__main__":
    n = 100_000
    nb_procs = 32
    
    segment_size = n // nb_procs
    jobs = map(lambda k: (k,min(n+1,k+segment_size)), range(1,n+1,segment_size))
    
    
    pool = ThreadPool(nb_procs)
    r = pool.map(sum_of_sqrt, jobs)
    
    pool.close()
    pool.join()
    
    #print(r)
    print(sum(r))



21082008.97391774055744484199379377668955977002919267990712682905852090718936239467537603246321243972

A noter que la précision de 100 chiffres de ce code ne porte que sur les nombres en vert

Posté par
lake
re : Petit service 05-07-23 à 20:37

Bonjour Ulmière,
J'avais pris la précaution d'écrire :

Citation :
Ce que donne Maple avec 30 chiffres significatifs :

Sans aucune garantie quant au nombre de décimales exactes.
Une démarche mathématique "honnête" voudrait qu'on accompagne  ces résultats (logiciel, programme, autres ...) d'un majorant de l'erreur commise (quelle est la dernière décimale correcte ?).
Tout ça pour dire que je n'ai pas plus confiance en tes décimales qu'en celles retournées par Maple

Posté par
Ulmiere
re : Petit service 06-07-23 à 12:16

Si tu fais le même calcul sur Maple avec un nombre de décimales plus élevé comme 100 ou 200, tu trouves plus de chiffres en commun avec les miens ?

Par exemple, si je demande une précision de 300 chiffres (272 apès la virgule), je trouve

21082008.973917740557444841993793776689559770029192679907126829058520
907189362394675376032463212439720486514999790107305918535871407408377
123975883566772378876405609244289884801891966912275184850811348092082
470371461687194471862054978705791172531657479322010392197196765548335
7313312159930363711682695


résultat qui prolonge le précédent.

Pour une précision de 30, je trouve 21082008.9739177405574448419937

Posté par
derny
re : Petit service 06-07-23 à 15:01

Bonjour
Merci pour votre collaboration. Si je vous comprends, difficile de faire confiance en totalité à ces logiciels.  On peut compter sur 17 décimales exactes. C'est peu si on compare au nombre de décimales affichées. Si on fait un simple calcul avec Excel on est différent dès la 10e décimale. Mais, ce qui est étonnant, c'est qu'on a 6 au lieu de 5 donc un résultat supérieur.

Posté par
lake
re : Petit service 07-07-23 à 13:45

Bonjour à tous,
>>Ulmière :
Avec 300 chiffres significatifs, il y a"divergence" pour les 3 dernières décimales.
Du coup j'ai demandé aussi 310 chiffres siginficatifs.
Je ne tire aucune conclusion de tout ça ...

pdf
PDF - 144 Ko

Posté par
Ulmiere
re : Petit service 07-07-23 à 15:01

La conclusion que j'en tire, c'est que si tu demandes à Maple d'être plus précis il se rapproche quand même beaucoup de ce que dit mon script Python

L'autre conclusion, c'est que si tu veux être certain d'avoir n chiffres corrects, demandes-en n+50 en utilisant l'un ou l'autre

Posté par
lake
re : Petit service 07-07-23 à 16:22

Bonjour Ulmière,
Je ne suis pas d'accord avec tes "certitudes".
Dans ton cas (avec python) comme le mien (avec maple), nous sommes tout à fait incapables de déterminer quelle est la dernière décimale "correcte".
Personnellement je crois qu'il n'y a aucune raison de penser que la première décimale est correcte !

Posté par
derny
re : Petit service 07-07-23 à 22:58

Bonsoir
Mais alors comment font les scientifiques et les mathématiciens pour donner des valeurs de constantes avec des millions de décimales ? Je sais qu'ils disposent de gros ordinateurs mais quand même ...

Posté par
lake
re : Petit service 07-07-23 à 23:40

Bonsoir derny,
Je suis un "minus" mathématique.
Il est certain que les (vrais) mathématiciens en question ont des certitudes à juste titre.
Comment font-ils ? Je ne sais pas

Posté par
derny
re : Petit service 08-07-23 à 11:24

Bonjour lake
Pour les premières décimales, c'est bon. Mais jusqu'où ? Il y a pas mal de temps j'avais commencé un petit blog mathématique mais n'avais pas continué parce qu'il était limité et manque de temps aussi. J'avais élaboré quelques formules approchées (voir le lien ci-dessous). Depuis j'ai même amélioré certaines formules mais tout cela reste anecdotique.


Sylvieg edit >    * lien facilité *

Posté par
Ulmiere
re : Petit service 08-07-23 à 20:47

Nous utilisons deux approches complémentaires

* reformuler \sum f(n) pour l'écrire par exemple comme fonction sommatoire d'un produit de convolution, et pouvoir utiliser les méthodes de sommation classique (hyperbole de Dirichlet, etc)

* utiliser comme dans mon code Python des librairies de calcul avec précision arbitraire. C'est comme pour les bigint mais avec des floats

Dans le cas de sqrt, on peut calculer beaucoup de décimales très efficacement grâce à l'algorithme de Newton-Raphson qui double à chaque itération le nombre de décimales correctes. Donc si tu veux n décimales correctes, tu n'as besoin de que d'un nombre d'itérations de l'ordre de log2(n). Il faut idéalement prendre un n plus grand que ce que tu vises pour le résultat final, parce que la somme de deux flottants à n décimales correctes n'a pas forcément n décimales correctes.
Difficile de dire si Maple comprend par lui-même cela où s'il fait tout avec n décimales correctes puis somme tout ça (ce qui peut expliquer les différences entre lake et moi). Les toutes dernières décimales s'expliquent aussi sans doute par une représentation différente des données en mémoire, ce qui change un peu les bits de poids faible.


En tout cas ce qu'il faut retenir, c'est que si tu veux n décimales correctes il te faut
* un bonne méthode (mathématique) de sommation, pour avoir un résultat en temps raisonnable et si possible pas trop d'arrondis à gérer
* une bonne librairie bigfloat dans ton langage favori pour faire tout ce beau calcul, à qui tu demanderas de faire un peu mieux que ce que tu attends histoire d'être bien sûr d'avoir tes n décimales correctes.

Essaie par exemple d'estimer pi par une méthode de Monte-Carlo (même accélérée par des suites pseudo-aléatoires à discrépance faible (Halton, etc))
Essaie de faire la même chose en utilisant une série de Fourier (celle de  la valeur absolue par exemple) et compare le nombre d'itérations qu'il te faut avec les deux méthodes de calcul pour obtenir un même nombre donné de décimales correctes

Posté par
derny
re : Petit service 08-07-23 à 22:52

Merci à vous deux

Posté par
derny
re : Petit service 08-07-23 à 23:20

Curieux :
Quand n (pair) ==> ∞  la sommation des  10^n racines ==> 2/3  10^{n+1} + 5  10^{n/2}.
Pour n impair il faut multiplier ce résultat par V10

Posté par
Ulmiere
re : Petit service 09-07-23 à 11:11

Cet équivalent m'a l'air douteux. En faisant apparaitre une somme de Riemann,

\sum_{k=0}^n \sqrt{k} = n^{3/2} \times \dfrac1n\sum_{k=0}^k\sqrt{\frac{k}{n}} \sim n^{3/2}\int_0^1 \sqrt{x}dx = 2/3n^{3/2}

Si remplaces n par 10^{2N}, tu devrais trouver quelque chose d'équivalent à 2/310^{3N}

Posté par
Ulmiere
re : Petit service 09-07-23 à 11:13

Il faut bien-sûr lire \sum_{k=0}^n et 10^{2N}, mais surtout, \dfrac{2}{3} \cdot 10^{3N}

Posté par
derny
re : Petit service 10-07-23 à 17:07

Bonjour
Si on laisse tomber les décimales (qui semblent aussi tendre vers une limite mais laquelle ?) on a :
S10000=666716
S1000000=666667166
S100000000=666666671666
S10000000000=666666666716666
...
La règle est simple à établir au visu des résultats.

Posté par
lake
re : Petit service 10-07-23 à 17:36

Bonjour à tous,
Un "Nous" bien sibyllin :

Citation :
Nous utilisons deux approches complémentaires  

Peut-on savoir ce qu'il représente ?

Posté par
derny
re : Petit service 10-07-23 à 19:12

Et les décimales semblent tendre vers 2(1-1/V10)/3

Posté par
derny
re : Petit service 10-07-23 à 22:47

Ma "formule" du 8 à 23h20 établie précipitamment n'est pas bonne.  A élaborer au vue des résultats  (à 17h07) ce que Ulmiere a rectifié.



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !