[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

how to calculate Exponential function by using vba

Posted on 2008-11-17
13
Medium Priority
?
9,303 Views
Last Modified: 2012-05-05
In inputbox input x and n
exponential function : e^x=1+ x/1! + x^2/2! +.....x^n/n!       ; n!=1*2*3...*n
inside the function we can use t(n)=x^n/n!  and for recurrence formula t(n)=t(n-1)*x/n
The partial sum to the n-th clause is expressed with s(n) which is ; s(n)=s(n-1)+t(n)
then e=1+s(n)
the calculation will repeat until i=n and |t(n)|<0.001

the problem is when i run the program the answer is no same with the exponential function above.


Sub e2()
    Dim n As Double
    Dim x As Double
    Dim i As Double
    Dim tn As Double
    Dim sn As Double
    Dim t1 As Double
    Dim e As Double
   
    x = CInt(InputBox("x?"))
    n = CInt(InputBox("n?"))
   
    Do
        For i = 1 To n
            t1 = x / (n - 1)
            tn = (x / (n - 1)) * (x / n)
            sn = tn + t1
            e = 1 + sn
           
            If x = 0 Then Exit For
       
        Next i
    Loop Until tn < 0.001 Or -tn < 0.001
   
    MsgBox "e^" & CStr(x) & "=" & CStr(e)
       
End Sub
0
Comment
Question by:edirol
13 Comments
 
LVL 18

Expert Comment

by:WaterStreet
ID: 22982247
instead of    

 x = CInt(InputBox("x?"))
    n = CInt(InputBox("n?"))

try
    x = CDbl(InputBox("x?"))
    n = CDbl(InputBox("n?"))


0
 

Author Comment

by:edirol
ID: 22982281
thanks WaterStreet

i`d tried CDbl but the answer is still wrong.
for example x=2,n=3 the answer should be e^2=6.3333
i think there are something wrong with the formulas for t1,tn
0
 
LVL 81

Expert Comment

by:zorvek (Kevin Jones)
ID: 22982415
Sub e2()

   Dim n As Double
   Dim x As Double
   Dim e As Double
   Dim Laste As Double
   
   x = CInt(InputBox("x?"))
   
   e = 1
   x = 3
   n = 1
   Do
      Laste = e
      e = e + x ^ n / Factorial(n)
      n = n + 1
   Loop While Abs(e - Laste) > 0.0000001
   
   MsgBox "e^" & x & "=" & e
       
End Sub

Public Function Factorial(ByRef Value As Double) As Double

   If Value = 1 Then
      Factorial = 1
      Exit Function
   Else
      Factorial = Value * Factorial(Value - 1)
   End If

End Function

Kevin
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 18

Expert Comment

by:deighton
ID: 22983373
here's a solution that avoids using the ^ operator, there's not much point in doing that, cos you could hard code e as a constant and do e^n in code.


Anyway, your keeping of a running total for the value seemed to be in error.

        Dim n As Double
        Dim x As Double
        Dim i As Double
        Dim tn As Double
        Dim sn As Double
        Dim t1 As Double
        Dim e As Double

      x = CInt(InputBox("x?"))
    n = CInt(InputBox("n?"))

        e = 0

        tn = 1
        e = e + tn

        'now e is the first term in the taylor expansion (call this term 0)

        Do

            'add on term 1, 2, 3

            i = i + 1
            tn = tn * x / i       'this gets the next term from the last

            e = e + tn

            'If x = 0 Then Exit For -    not needed, gives tn=0 when x = 0, so it ends below

            'the end ing condition wasn't true
        Loop Until tn < 0.001 And tn >= 0 Or -tn < 0.001 And tn <= 0

       msgbox ("e^" & CStr(x) & "=" & CStr(e))
0
 

Author Comment

by:edirol
ID: 22983380
thanks Kevin.
i`d tried your solution and it is working!!!however i have to make the program by using the
functions in the question.

Actually i found that i  misunderstood the question.This is the question again ;
Exponential function : e^x=1+ x/1! + x^2/2! +.....x^n/n!       ; n!=1*2*3...*n
Inside the function we can use t(n)=x^n/n!  and for recurrence formula t(n)=t(n-1)*x/n
The partial sum to the n-th clause is expressed with s(n) which is ; s(n)=s(n-1)+t(n)
Then e=1+s(n)
The calculation will repeat until n=100 and |t(n)|<0.001

Sub e21()
    Dim x As Double
    Dim n As Double
    Dim i As Double
    Dim t1 As Double
    Dim tn As Double
    Dim sn As Double
    Dim e As Double
   
     
    x = CDbl(InputBox("x?"))
   
    Do
        For n = 1 To 100
            t1 = x / (n - 1)
            tn = (x / (n - 1)) * (x / n)
            sn = tn + t1
            e = 1 + sn
           
            If x = 0 Then Exit For
       
        Next n
    Loop Until tn < 0.001 Or -tn < 0.001
   
    MsgBox "e^" & CStr(x) & "=" & CStr(e)
End Sub

I`d  tried to run the program but it comes into debug.
For example if x=3
     e^3=20.0855....
0
 
LVL 18

Expert Comment

by:deighton
ID: 22983414
for one thing, you've got looping Until tn < 0.001 Or -tn < 0.001

, but if say tn=3, then -tn < .001 and the loop ends


0
 
LVL 18

Expert Comment

by:deighton
ID: 22983540
also if you look at

  For n = 1 To 100
            t1 = x / (n - 1)



then where n=1, you have an immediate division by zero in the second line
0
 

Author Comment

by:edirol
ID: 22983681
already tried to change the functions.but still wrong
0
 
LVL 18

Expert Comment

by:deighton
ID: 22983753
your calculation of the terms in the series is not right.  The first term has to be calculated before you go into the loop, but that's always 1.

t0 = 1
t1 = t0 * x / 1
t2 = t1 * x / 2
t3 = t2 * x / 3

t(n) = t(n-1) * x / n


but you don't want to store all those values, you want to calculate the next term from the previous and throw away the old one - so lets call the nth term variable 'tn'

first consider this

---------------------------------------------------------------------
dim tn as double

x=2
tn = 1
for n = 1 to 10
   tn = tn * x/n
  msgbox("term " + cstr(n) + " = " + cstr(tn))
next
---------------------------------------------------------------------

so looking at the code above, I calculate each of the first 10  term in the series.  But I want to add them all up, including t0, so then I need running_total
---------------------------------------------------------------------
x=2
 tn = 1
running_total = tn

 for n = 1 to 100
    tn = tn * x/n
  running_total = running_total + tn
 
 next
---------------------------------------------------------------------
'at the end of this, the value is in running total

do you see what this bit does
   tn = tn * x/n

it takes the last term and works out the latest term from it.

 
0
 

Author Comment

by:edirol
ID: 22984059
Thanks deighton ;
 I`d  changed  my program by referring your functions and it works.
But how can i make that program to calculate until abs(tn)<0.0001?
I did `Step Into ` and in `Locals Window`  when Abs(tn)<0.0001 it should
stop running,but it still run until n=100.

Sub ee()

    Dim x As Double
    Dim n As Double
    Dim tn As Double
    Dim running_total As Double

    x = CDbl(InputBox("x"))
    tn = 1
    running_total = tn

    Do
        For n = 1 To 100
            tn = tn * x / n
            running_total = running_total + tn
        Next n
    Loop Until Abs(tn) < 0.00001

    MsgBox CStr(running_total)
End Sub

0
 
LVL 18

Expert Comment

by:deighton
ID: 22984250
if you look at that, you have a for loop 'nested' in the Do loop, so you will always do 100 iterations, then you will break out of the second loop only if abs(tn) < .00001,

if you get rid of the do loop and have

  For n = 1 To 100
            tn = tn * x / n
            running_total = running_total + tn
            if Abs(tn) < 0.00001 then exit for
        Next n

you will iterate for a maximum of 100 times, but leaving the loop if tn < .00001

is one way of doing that

you could also use a do loop with a counter and the loop until n>100 or abs(tn)<.000001


0
 

Author Comment

by:edirol
ID: 22984619

At last !!!Thanks deighton.
Anyway can u explain why does tn = 1& sn = tn
0
 
LVL 18

Accepted Solution

by:
deighton earned 800 total points
ID: 22985261
tn = 1

this is setting tn to the first term in the series, which is always 1

 tn = tn * x / n

this calculates the next value in the series each time
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

When you see single cell contains number and text, and you have to get any date out of it seems like cracking our heads.
Microsoft's Excel has many features that most people will never need nor take advantage of.  Conditional formatting is one feature that you may find a necessity once you start using it.
This Micro Tutorial will demonstrate how to create pivot charts out of a data set. I also added a drop-down menu which allows to choose from different categories in the data set and the chart will automatically update.
This is a video describing the growing solar energy use in Utah. This is a topic that greatly interests me and so I decided to produce a video about it.

872 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question