Math remplacer logarithme

Bonjour Sur un automate ne disposant pas de la fonction log Je cherche à la remplacer par une formule mathématique Je ne dispose que des 4 opérations + - / X

Le résultat doit ressembler à la coube log même si les valeurs sont totalement fausses

J ai un réglage qui est en courbe logarithmique et je ne crée que des courbes linéaires Valeur de 0 à 65535

Merci

Patrick

Reply to
Patrick
Loading thread data ...

Patrick a écrit :

Bonsoir,

Ceci dit les fonctions log sont faites en interne par des + - X / in fine. mébon, si tu ne veux pas faire une usine à gaz, le plus simple c'est une table avec une interpolation linéaire. (en plus le même mécanisme va pouvoir être récupéré pour générer des sinus et autres fonctions ad hoc pour le même prix : juste changer la table)

Evidemment tu ne vas pas faire une table avec 64K valeurs !! juste 256 c'est déja pas mal. moins même. La compression "loi A" utilise même juste 13 segments pour comprimer

12 bits en 8 bits logarithmiquement Utiliser 16 segments sur 16 bits en entrée ne semble pas aberrant.

Donc tu prends ta valeur d'entrée sur 16 bits, tu la coupes en deux octets, l'un X adresse directement la table de 256 valeurs (256 segments linéaires) l'autre Y sert avec la formule d'interpolation : résultat = T[X] + (T[X+1] - T[X])*Y/256 (et la division par 256 c'est juste un décalage de 8 bits, hein) le programme qui fait ça est alors ridiculement court ! donc extrèmement rapide.

Maintenant tu peux aussi couper tes 16 bits d'entrée en 4 + 12 par ex. Les 4 de poids forts (X) adressent une table de 16 valeurs (16 segments linéaires), et les 12 bits de poids faible (Y) servent à l'interpolation. la formule devient T[X] + (T[X+1] - T[X])*Y/4096 (le 4096 est le décalage de 12 bit)

Tout dépend des capacités de ton opération de multiplication, et de la précision souhaitée par rapport à une vraie fonction log.

Les valeurs à mettre dans la table sont calculées une fois pour toutes avec un programme dans ton langage préféré, depuis le tableur Excel au langage C, en passant par les divers Basic etc, sur ton PC ou Mac favori, voire même si juste 16 valeurs, avec une simple calculette (et la fonction log de ces outils ;-)

Une autre solution est d'approximer ta fonction log par une fraction de deux polynomes, voire un simple polynome, mais les calculs sont plus longs et le programme plus complexe (c'est comme ça que c'est fait en interne en fait, avec une "renormalisation" utilisant log(a*b) = log(a) + log(b), algorithme "cordic", pour avoir une précision constante sur toute la gamme) cela revient dans la méthode précédente à effectuer des interpolations non linéaires ( = polynomes d'interpolation)

cordialement.

--
Philippe C., mail : chephip, with domain  free.fr
Reply to
Philippe 92

cherche dans les développements limités Toute fonction peut être représentée par des équations de la forme y= a+bx+cx²+.......etc.

"Patrick" a écrit dans le message de news:

4f567707$0$1962$ snipped-for-privacy@news.free.fr...
Reply to
jungers jean-marie

jungers jean-marie a écrit :

ce que je disais à propos des polynomes.

mais pour la fonction log, le développement limité (mathématiquement parlant) est pour log(1+x) au voisinage de x = 0 c'est à dire |x| < 1 parce que sinon ton développement limité il diverge sec...

Il est ainsi plutot utilisé le développement de log((1+x)/(1-x)) =

2x + 2x^3/3 + 2x^5/5 + ... + 2x^(2n+1)/(2n+1) avec toujours |x| < 1 mais alors (1+x)/(1-x) prend les valeurs qu'on veut ou presque.

un exemple numérique que j'ai sous la main calcule log(1.25) avec 23 décimales, en seulement 11 termes de développement (x = 1/9)

Ceci dit le calcul d'un polynome se fait par l'algorithme bien classique (que des multiplications et additions) :

y = a + x*(b + x*(c + x*(d + x*(... selon le coût des multiplications, ce calcul peut être bien plus coûteux que l'interpolation linéaire que je préconise ici.

Une autre approche (en dehors des développements limités) est d'approximer la fonction par un polynome toujours mais qui n'est pas du tout la simple troncature du développement illimité "mathématique" c'est à dire en pratique par des courbes genre spline, où on définit un certain nombres de "points de controle" pour ajuster la courbe. Les polynomes alors considérés sont généralement de degré 2 ou 3. et la courbe est alors découpée en "tronçons" comme pour mon interpolation, chaque tronçon donnant les coeficients du polynome d'interpolation pour ce tronçon.

Ceci peut avoir un intérêt en particulier car on peut alors s'arranger pour que la courbe totale soit "lisse" sans point anguleux comme avec l'interpolation linéaire. Comme la courbe log est à courbure de signe constant, une interpolation du second degré suffit ici (par des arcs de paraboles) Mais vu l'usage

l'interpolation linéaire suffit AMHA

A voir le coût relatif entre une table de 256 valeurs et une table de

16 valeurs (ou 32, 64 ...) par rapport à un décalage de 8 bits vs 12 bits : le décalage de 8 bits se fait à coût nul, c'est un octet entier, le décalage de 12 bits nécessite des instructions effectives pour effectuer ce décalage. mais tout dépend du jeu d'instructions du micro et de la taille mémoire disponible.

--
Philippe C., mail : chephip, with domain  free.fr
Reply to
Philippe 92

Le 06/03/2012 21:38, Patrick a écrit :

Le log étant l'intégrale de 1/x tu auras une courbe de ce type en accumulant l'inverse des points :

1 > log(approx)(1) = 1 2 > log(approx)(2) = log(approx)(1) + 1/2

n > log(approx)(n) = log(approx)(n-1) + 1/n

Reply to
CGH

CGH a écrit :

1) mieux : tu ajoutes un terme correctif = la constante gamma d'Euler. 2) lourdingue le programme avec 65000 boucles et une division dans chaque
--
Philippe C., mail : chephip, with domain  free.fr
Reply to
Philippe 92

"Patrick" a écrit dans le message de news:

4f567707$0$1962$ snipped-for-privacy@news.free.fr...

================== Voir ici pour transposer le fichier C "log" vers ton langage

formatting link
Existe également les co-processeurs mathématiques sous la forme d'un microcontrôleur programmé, accessible série .

Reply to
Maioré

Bonsoir

Merci pour les réponses

Pour l'nstant et pour les premiers essais j'ai simulé la courbe log

par la succession de 7 droites.

in valeur entrée login résulta

{ if (in58000)){login=(in-58000)*203/999+64000;}

}

Patrick

Reply to
Patrick

"Patrick" a écrit

============ Dans ce cas , on peut aussi "arrondir" les sections en utilisant la courbe d'équation de type (y=ax²+bx+c) les opérations pouvant se faire sur des entiers si l'on ne dispose pas de "float" après avoir déterminé les réels a,b,c sur 3 ou 4 sections en s'aidant d'un tableur. Bon après midi

Reply to
Maioré

On 10 mar, 22:46, "Patrick"

Je suppose qu'il s'agit d'un log d=E9cimal ?

Tu as dit que la valeur de 'in' est un entier compris dans (0...65535) donc la valeur maximale de 'login' sera log(65535) =3D 4,816... Mais l=E0 j'ai l'impression que tu =E9tends la valeur de 'login' pour couvrir l'=E9tendue (0...65535) est-ce bien cela ?

Si oui, et compte tenu que tu as dit ne pas avoir besoin de pr=E9cision :

{ login =3D 0; if( in > 1 ) { while( in ) { in /=3D 4; login++; } login *=3D 8191; } }

Sinon =E0 propos de ton algo ci-dessous, quelle que soit la valeur de 'in' tu vas faire les 7 tests 'if' alors qu'un seul est utile : si tu peux remplacer les 'if' par 'else if' ca n'en fait plus qu'un seul, c'est plus rapide. ( ce serait encore plus simple et rapide de remplacer toutes ces valeurs par un tableau d'entiers )

Reply to
Jean-Christophe

Jean-Christophe a écrit :

aucune importance vu la suite.

ben, logout = K*log(in) (donc le facteur de conversion log/ln étant inclus dans ce facteur d'échelle K)

bof, jeter ainsi à la poubelle les trois quarts des bits de in, certes "pas besoin de précision" mais quand même, faut pas pousser.

OK pour les else bien sûr,

mais

1) je proposais déja une table il y a 4 jours !

2) Tout dépend avec quoi est fabriqué son automate (quel micro ? jeu d'instructions ? taille des registres ? architecture ?) programmation en assembleur ou langage évolué ? (C ou autre)

Il peut être très facile de faire une chaine de if else, et dix fois plus compliqué de faire une simple table de constantes, etc.. Ce n'est pas du tout le même algorithme qu'il faudra utiliser si c'est un PIC ou un 68xxx ! Même si un langage de haut niveau lui masque les particularités internes, l'efficacité (taille, rapidité, voire précision) de son programme risque d'être divisée dans un rapport **considérable** si la mauvaise méthode en fonction de son micro est choisie.

Je pense qu'il a suffisemment de billes (= de réponses et de méthodes différentes) pour choisir maintenant. Continuer dans des détails de réalisation risque de tomber complètement à côté de la plaque, sans connaitre les détails techniques ci-dessus.

cordialement.

--
Philippe C., mail : chephip, with domain  free.fr
Reply to
Philippe 92

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.