logarithmic interpolation

Discussion in 'C Programming' started by different, Jan 18, 2007.

  1. different

    different Guest

    Hi, I have a program which reads a file containing integers in [0,10].
    The program reads the value of a variable every 2 seconds, then maps it
    to another interval, say [20,22000], obtaining a new value.
    I already have a function which updates the variable, gradually
    changing from the old one to the new one during the 2 seconds, which
    uses a linear function.
    Know I need to make the value of the variable change between old and
    new in a "logarithmic way", that is the values between old and new must
    follow a logarithmic scale.
    How can I do that?
     
    different, Jan 18, 2007
    #1
    1. Advertising

  2. different wrote:
    > Hi, I have a program which reads a file containing integers in [0,10].
    > The program reads the value of a variable every 2 seconds, then maps it
    > to another interval, say [20,22000], obtaining a new value.
    > I already have a function which updates the variable, gradually
    > changing from the old one to the new one during the 2 seconds, which
    > uses a linear function.
    > Know I need to make the value of the variable change between old and
    > new in a "logarithmic way", that is the values between old and new must
    > follow a logarithmic scale.
    > How can I do that?


    This is not a question about C but about elementary arithmetic. I will
    offer an explanation but it is al; off-topic in comp.lang.c and should
    not be replied to.

    <ot>
    You are looking for a function that maps a linear variable x onto an
    exponential variable y.
    y = A*exp(bx)
    using a for log(A), this is the same as
    log(y) = a + bx
    We have a form with two unknowns and we have two data points:
    log(20) = a + 0*b
    log(22000) = a + 10b
    so we know immediately that
    a = log(20)
    or A = 20
    and that
    b = (log(22000) - log(20)) / 10
    or
    b = log(1100) / 10
    so the mapping is
    log(y) = log(20) + x * log(1100)/10

    y = 20 * pow(1100, x/10);

    </ot>
     
    Martin Ambuhl, Jan 18, 2007
    #2
    1. Advertising

  3. "different" <> wrote in message
    news:...
    > Hi, I have a program which reads a file containing integers in [0,10].
    > The program reads the value of a variable every 2 seconds, then maps it
    > to another interval, say [20,22000], obtaining a new value.
    > I already have a function which updates the variable, gradually
    > changing from the old one to the new one during the 2 seconds, which
    > uses a linear function.
    > Know I need to make the value of the variable change between old and
    > new in a "logarithmic way", that is the values between old and new must
    > follow a logarithmic scale.
    > How can I do that?


    sci.math and related groups have a large pool of bored mathematicians and
    students who will gladly address such topics.

    --
    David T. Ashley ()
    http://www.e3ft.com (Consulting Home Page)
    http://www.dtashley.com (Personal Home Page)
    http://gpl.e3ft.com (GPL Publications and Projects)
     
    David T. Ashley, Jan 18, 2007
    #3
  4. different

    user923005 Guest

    David T. Ashley wrote:
    > "different" <> wrote in message
    > news:...
    > > Hi, I have a program which reads a file containing integers in [0,10].
    > > The program reads the value of a variable every 2 seconds, then maps it
    > > to another interval, say [20,22000], obtaining a new value.
    > > I already have a function which updates the variable, gradually
    > > changing from the old one to the new one during the 2 seconds, which
    > > uses a linear function.
    > > Know I need to make the value of the variable change between old and
    > > new in a "logarithmic way", that is the values between old and new must
    > > follow a logarithmic scale.
    > > How can I do that?

    >
    > sci.math and related groups have a large pool of bored mathematicians and
    > students who will gladly address such topics.


    They might even point him to this:
    http://www.mpip-mainz.mpg.de/~deserno/science_notes/log_interpol/log_interpol.ps

    > --
    > David T. Ashley ()
    > http://www.e3ft.com (Consulting Home Page)
    > http://www.dtashley.com (Personal Home Page)
    > http://gpl.e3ft.com (GPL Publications and Projects)
     
    user923005, Jan 19, 2007
    #4
  5. different

    different Guest

    Sorry, I know that it was OT, but I always tried sci.math and another
    forum about algorithms, but they did not give me an answer in one week.
    Thank you for the reply.

    On 18 Gen, 19:26, Martin Ambuhl <> wrote:
    > different wrote:
    > > Hi, I have a program which reads a file containing integers in [0,10].
    > > The program reads the value of a variable every 2 seconds, then maps it
    > > to another interval, say [20,22000], obtaining a new value.
    > > I already have a function which updates the variable, gradually
    > > changing from the old one to the new one during the 2 seconds, which
    > > uses a linear function.
    > > Know I need to make the value of the variable change between old and
    > > new in a "logarithmic way", that is the values between old and new must
    > > follow a logarithmic scale.
    > > How can I do that?This is not a question about C but about elementary arithmetic. I will

    > offer an explanation but it is al; off-topic in comp.lang.c and should
    > not be replied to.
    >
    > <ot>
    > You are looking for a function that maps a linear variable x onto an
    > exponential variable y.
    > y = A*exp(bx)
    > using a for log(A), this is the same as
    > log(y) = a + bx
    > We have a form with two unknowns and we have two data points:
    > log(20) = a + 0*b
    > log(22000) = a + 10b
    > so we know immediately that
    > a = log(20)
    > or A = 20
    > and that
    > b = (log(22000) - log(20)) / 10
    > or
    > b = log(1100) / 10
    > so the mapping is
    > log(y) = log(20) + x * log(1100)/10
    >
    > y = 20 * pow(1100, x/10);
    >
    > </ot>
     
    different, Jan 19, 2007
    #5
  6. different napisal(a):
    > Hi, I have a program which reads a file containing integers in [0,10].
    > The program reads the value of a variable every 2 seconds, then maps it
    > to another interval, say [20,22000], obtaining a new value.
    > I already have a function which updates the variable, gradually
    > changing from the old one to the new one during the 2 seconds, which
    > uses a linear function.
    > Know I need to make the value of the variable change between old and
    > new in a "logarithmic way", that is the values between old and new must
    > follow a logarithmic scale.
    > How can I do that?


    Instead of the function log(x), rather you have
    to use the following one: log(x - 1), for x >= 0.

    Then the interpolation formula for x in [x_1,x_2]
    with ratio f = a/(a+b), looks as follows:

    (log(x_2 -1) - log(x - 1)) / (log(x - 1) - log(x_1 - 1)) = (1/f) - 1

    After a simple calculation one can get

    x = (x_1 - 1)^{f - 1} * (x_2 - 1)^{f} + 1 ,

    what you expect.

    Best Regards,
    Z. Karno
     
    Zbigniew Karno, Jan 19, 2007
    #6
  7. Zbigniew Karno napisal(a):
    > different napisal(a):
    > > Hi, I have a program which reads a file containing integers in [0,10].
    > > The program reads the value of a variable every 2 seconds, then maps it
    > > to another interval, say [20,22000], obtaining a new value.
    > > I already have a function which updates the variable, gradually
    > > changing from the old one to the new one during the 2 seconds, which
    > > uses a linear function.
    > > Know I need to make the value of the variable change between old and
    > > new in a "logarithmic way", that is the values between old and new must
    > > follow a logarithmic scale.
    > > How can I do that?

    >
    > Instead of the function log(x), rather you have
    > to use the following one: log(x - 1), for x >= 0.
    >
    > Then the interpolation formula for x in [x_1,x_2]
    > with ratio f = a/(a+b), looks as follows:
    >
    > (log(x_2 -1) - log(x - 1)) / (log(x - 1) - log(x_1 - 1)) = (1/f) - 1
    >
    > After a simple calculation one can get
    >
    > x = (x_1 - 1)^{f - 1} * (x_2 - 1)^{f} + 1 ,
    >
    > what you expect.
    >
    > Best Regards,
    > Z. Karno


    Incorrect.
    The sign - should be replaced by +.

    So, the following function has to be used:
    log(x + 1), for x >= 0.
    In this case, the interpolation formula looks as
    follows:
    (log(x_2 +1) - log(x + 1)) / (log(x + 1) - log(x_1 + 1)) = (1/f) -
    1.
    Thus
    x = (x_1 + 1)^{f -1} * (x_2 + 1)^{f} - 1 .

    Regards,
    Z. Karno
     
    Zbigniew Karno, Jan 19, 2007
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Andre

    Drawing a logarithmic histogram

    Andre, Jul 16, 2003, in forum: C Programming
    Replies:
    1
    Views:
    442
    Glen Herrmannsfeldt
    Jul 17, 2003
  2. Derek Basch

    Matplotlib logarithmic scatter plot

    Derek Basch, Feb 27, 2006, in forum: Python
    Replies:
    9
    Views:
    4,969
    evander21
    Nov 3, 2010
  3. Derek Basch
    Replies:
    8
    Views:
    429
    Fredrik Lundh
    Feb 28, 2006
  4. different

    logarithmic interpolation

    different, Jan 18, 2007, in forum: C++
    Replies:
    5
    Views:
    3,877
    Zbigniew Karno
    Jan 19, 2007
  5. Sunny

    Logarithmic scale

    Sunny, Sep 25, 2008, in forum: Javascript
    Replies:
    8
    Views:
    155
    Bart Van der Donck
    Sep 28, 2008
Loading...

Share This Page