Math remplacer logarithme

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From French to

Threaded View
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



Re: Math remplacer logarithme
Patrick a écrit :
Quoted text here. Click to load it

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



Re: Math remplacer logarithme
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.

4f567707$0$1962$ snipped-for-privacy@news.free.fr...
Quoted text here. Click to load it



Re: Math remplacer logarithme
jungers jean-marie a écrit :
Quoted text here. Click to load it

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

Quoted text here. Click to load it

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.

Quoted text here. Click to load it

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



Re: Math remplacer logarithme
Le 06/03/2012 21:38, Patrick a écrit :
Quoted text here. Click to load it
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


Re: Math remplacer logarithme
CGH a écrit :
Quoted text here. Click to load it

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



Re: Math remplacer logarithme

4f567707$0$1962$ snipped-for-privacy@news.free.fr...
Quoted text here. Click to load it
==================
Voir ici   pour transposer le fichier   C  "log"   vers  ton
langage
http://files.codes-sources.com/fichier.aspx?id18%234&f=maths.h
Existe également les co-processeurs mathématiques sous la forme d'un
microcontrôleur programmé, accessible série .





Re: Math remplacer logarithme
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 (in<10000)

   if ((in<20%000)&&(in>10000))

   if ((in<30%000)&&(in>20000))

   if ((in<40%000)&&(in>30000))

   if ((in<50%000)&&(in>40000))

   if ((in<58%000)&&(in>50000))

   if ((in>58000))

}

Patrick



Re: Math remplacer logarithme

Quoted text here. Click to load it
============
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





Re: Math remplacer logarithme
On 10 mar, 22:46, "Patrick"

Je suppose qu'il s'agit d'un log dE9%cimal ?

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 lE0% j'ai l'impression que tu E9%tends
la valeur de 'login' pour couvrir
l'E9%tendue (0...65535) est-ce bien cela ?

Si oui, et compte tenu que tu as dit
 ne pas avoir besoin de prE9%cision :

{ 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 )


Quoted text here. Click to load it

Re: Math remplacer logarithme
Jean-Christophe a écrit :
Quoted text here. Click to load it

aucune importance vu la suite.

Quoted text here. Click to load it

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

Quoted text here. Click to load it

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.

Quoted text here. Click to load it



OK pour les else bien sûr,

Quoted text here. Click to load it

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



Site Timeline