Boulot impressionnant.
oui, tu es plein de vices hélas ! ("et c'est là qu'il ose")
Aurais-tu été g33k en Perl ou en C dans une autre vie ?
Modérateur : Politburo
Boulot impressionnant.
Code : Tout sélectionner
Lbl A' (( STO 09 lnx 1/x * 1 exp * PI lnx ) y^x RCL 09 - PI exp ) INV SBR
Code : Tout sélectionner
--- -- --- -- --- -- --- -- --- -- --- -- --- -- --- -- --- --
000 76 001 16 002 53 003 53 004 42 005 09 006 23 007 35 008 65
009 01 010 22 011 23 012 65 013 89 014 23 015 54 016 45
017 43 018 09 019 75 020 89 021 22 022 23 023 54 024 92
--- -- --- -- --- -- --- -- --- -- --- -- --- -- --- --
Oui, je n'ai pas scanné toutes les explications. En 1977, chaque programme du module prend autant de pages que nécessaire.
Code : Tout sélectionner
S←FIND;A;B;D;H;X;R
[1] 'Parametres : a b delta ?'
[2] A B D←⎕
[3] X←A+(B-A)×(¯1+⍳1+N)÷N←⌈(B-A)÷D
[4] X←0 (D←D÷2) D∘.+(0>,2×⌿FNC X)/,¯1↓X
[5] →(1E¯6 < D)/4
[6] S←S[⍋S←,1↑X]
Code : Tout sélectionner
from math import exp,log,pi
def f(x):
return (exp(1) * log(pi) / log(x)) ** x - exp(pi)
def find(a,b,d):
n = int((b - a) / d)
x = [a + (b - a) * k / n for k in range(1 + n)]
while d > 1e-6:
suiv = []
for i,v in enumerate(x):
if i < len(x) - 1 and f(v) * f(x[i+1]) < 0:
suiv += [v, v + d/2, v + d]
x = list(suiv)
d /= 2
return sorted([x[0],x[3],x[6]])
>> find(1.1,9.1,2)
[1.3666568756103517, 3.1415916442871095, 8.907147979736328]
# Valeurs successives de x :
>> find(1.1,9.1,2)
[1.1, 3.1, 5.1, 7.1, 9.1] # Découpage initial avec delta = 2
[1.1, 2.1, 3.1, 3.1, 4.1, 5.1, 7.1, 8.1, 9.1] # Découpage avec delta = 1 pour 1.1, 3.1 et 7.1
[1.1, 1.6, 2.1, 3.1, 3.6, 4.1, 8.1, 8.6, 9.1] # Découpage avec delta = 0.5 pour 1.1, 3.1 et 8.6, etc.
[1.1, 1.35, 1.6, 3.1, 3.35, 3.6, 8.6, 8.85, 9.1]
[1.35, 1.475, 1.6, 3.1, 3.225, 3.35, 8.85, 8.975, 9.1]
[1.35, 1.4125, 1.475, 3.1, 3.1625, 3.225, 8.85, 8.9125, 8.975]
[1.35, 1.38125, 1.4125, 3.1, 3.13125, 3.1625, 8.85, 8.88125, 8.9125]
...
Code : Tout sélectionner
FIND
Parametres : a b delta ?
⎕:
1.1 9.1 0.1
1.366657257 3.141592407 8.907148743
[3] : X = 1.1 1.2 1.3 ... 8.8 8.9 9 9.1 Découpage de l'intervalle suivant delta
[4] : 2×⌿FNC X : On cherche toutes les images de X par la fonction puis on fait les produits 2 à 2 et on regarde ceux qui sont négatifs
Par exemple :
2×/ 3 4 5 6
12 20 30 (Càd 3*4, 4*5 et 5*6)
Ce qui permet de filtrer les X que l'on peut garder : Par exemple (0 1 1 0) / 1 2 3 4 masque 1 et 4 mais garde 2 et 3
[4] : X
1.3 3.1 8.9
1.35 3.15 8.95
1.4 3.2 9
On ajoute aux X restants 3 valeurs : 0, D/2 et D (c'est le début de la dichotomie)
Exemple :
1 2 3 ∘.+ 40 50 60
41 51 61
42 52 62
43 53 63
[5] : On continue tant que D > 10^-6
[6] : S←S[⍋S←,1↑X] permet de trier les valeurs par ordre croissant...
Exemple :
S←8 3 5 1
⍋S
4 2 3 1 8 doit être à la 4e position, 3 à la 2e position, 5 à la 3e position et 1 à la 1ere position
S[⍋S]
1 3 5 8
Code : Tout sélectionner
FIND
Parametres : a b delta ?
⎕:
1.1 9.1 2
1.1 3.1 7.1
2.1 4.1 8.1
3.1 5.1 9.1
1.1 3.1 8.1
1.6 3.6 8.6
2.1 4.1 9.1
1.1 3.1 8.6
1.35 3.35 8.85
1.6 3.6 9.1
...
8.907128906 3.141564941 1.36663208
8.907144165 3.1415802 1.366647339
8.907159424 3.141595459 1.366662598
8.907144165 3.1415802 1.366647339
8.907151794 3.14158783 1.366654968
8.907159424 3.141595459 1.366662598
1.366647339 3.1415802 8.907144165
Code : Tout sélectionner
5 DIM PR(100):DIM SU(100):P=3.1415926
10 DEF FN F(X) = (exp(1) * log(P) / log(X)) ^ X - exp(P)
15 HOME
20 INPUT "A,B,Delta ?";A,B,D
30 N = INT((B-A)/D): U = -1
40 FOR K=0 TO N
45 X = A + K * (B - A) / N
50 IF FN F(X) * FN F(X + D) <= 0 THEN GOSUB 200
55 NEXT K
60 V = -1
70 FOR K=0 TO U-1
80 IF FN F(PR(K)) * FN F(PR(K + 1)) <= 0 THEN GOSUB 300
100 NEXT K
110 IF D < 1E-6 GOTO 600
115 D = D / 2: PRINT "D=";D
120 FOR K = 0 TO V: PR(K) = SU(K): PRINT PR(K):NEXT K
140 GOTO 60
200 FOR J=0 TO 2
210 U = U + 1: PR(U) = X + J * D / 2
230 NEXT J
240 RETURN
300 FOR J=0 TO 2
310 V = V + 1: SU(V) = PR(K) + J * D / 2
330 NEXT J
340 RETURN
600 PRINT "--":FOR J=0 TO V / 3: PRINT SU(3 * J): NEXT J
Code : Tout sélectionner
10 DEF FN F(X) = X * X - X - 1
A,B,Delta ?-5
??5
??.1
-0.6180343627929689
1.6180335998535151