Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Truncated Sin Series in FORTRAN

  1. Sep 15, 2011 #1
    I am very much confused and frustrated at this point and would just like to understand what I'm doing wrong... This program is supposed to calculate a truncated value of sine using it's series expansion beginning at i = 1. At values under 20 degrees it compares almost exactly with the intrinsic sine function, but after that it's as much as .06-.23 off! This is my first course in programming in general, and I've been very good at Fortran thus far, but there's something I'm missing in this case... This is the program I have been trying to fix:

    program series
    implicit none
    real :: n_factorial, sin_x, x, v1, sum_1, n_1
    integer :: n, i

    write (*,*) 'enter n'
    read (*,*) n
    write (*,*) 'enter x in degrees'
    read (*,*) x

    n_factorial = 1
    sin_x = 0
    x = ((x*3.1415926535898)/180)
    v1 = sin(x)

    DO i = 1, n

    n_1 = (2*i) - 1

    n_factorial = n_factorial * n_1

    sum_1 = (((-1)**(i-1)) * ((x**((2*i) - 1))/(n_factorial)))

    sin_x = sin_x + sum_1

    END DO

    write (*,*) sin_x
    write (*,*) ' '
    write (*,*) v1
    end program series

    This is my first time posting on this site, and posting in general, I would infinitely appreciate the help in figuring out what's wrong!
  2. jcsd
  3. Sep 15, 2011 #2


    User Avatar
    Homework Helper

    You didn't mention how truncated the series is. What value are you inputting for n? If the series is significantly truncated, then the error will get larger as the angle gets larger.
  4. Sep 15, 2011 #3


    User Avatar
    Science Advisor

    Hi Matt, the problem is with your factorial calculation. You're only multiplying the odd numbers so you're not getting the full factorial.

    You could fix it by modifying the line "n_factorial = n_factorial * n_1" to something like,
    n_factorial = n_factorial * n_1 * (n_1-1)

    Unfortunately however that will fail on the first pass when n_1 is 1, so you'll need something like

    if (i>1) n_factorial = n_factorial * n_1 * (n_1-1)
  5. Sep 15, 2011 #4
    Thank you Uart! I suspected that might have been the problem, but I was entirely blanking on how to correct it. In my text book they only had one example of a factorial function calculator, but I was stumped on how to transpose that code into one which handles the cases where 'i' is multiplied by a number, or when a number is subtracted from it.

    And to Rcgldr, originally my idea was to allow the user to input various integer values for n, but I think now I'll add a condition something like, IF (abs(sin(x)-sin_x) < 1E-6) EXIT. I think it should run until the condition is satisfied...
  6. Sep 15, 2011 #5


    User Avatar
    Homework Helper

    An alternative would be to update n_factorial twice, once before and once after it's used:

    n_factorial = n_factorial * n_1

    sum_1 = (((-1)**(i-1)) * ((x**((2*i) - 1))/(n_factorial)))

    sin_x = sin_x + sum_1

    n_factorial = n_factorial * (n_1 +1 )

    You're currrent method is fine, I was just wondering what values you were trying for n. Sorry I missed the n_factorial issue, it was late and I wasn't paying attention to the rest of the code.
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Similar Discussions: Truncated Sin Series in FORTRAN
  1. Truncating a number (Replies: 4)

  2. Linking Fortran (Replies: 5)