1. Not finding help here? Sign up for a free 30min tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Error while calculating arc length of curve in Fortran

  1. Nov 17, 2015 #1
    The program must calculate the length of the curve of ƒ=3.1*x^2-5.3/x between x=1/2 and x=3/2.The legth should be calculated as the sum of n line segments starting with n=1 and ending with n=20.

    I really can't find why the result I'm getting is wrong.Thanks in advance
    I am giving you the code below:

    Code (Fortran):
    program pr2_ex2
    implicit none
    integer::x
    double precision::dy,dx !dy=the height of the linear part & dx=the lenght of the linear part
    double precision::x1,x2,s !f=f(x) the function,x=the values which can be given to f
    double precision::length
      print*,"Please enter the function's starting point"
      read*,x1
      print*,"Please enter the function's ending  point"
      read*,x2
    length=0
      s=0
    do x=2,21
       dx=((x*abs(x2-x1)-(x-1)*abs(x2-x1))/(20))
       dy=(3.1*(x*abs(x2-x1)/20)**2-(5.3*20/x*abs(x2-x1)))-(3.1*((x-1)*abs(x2-x1)/20)**2-(5.3*20/(x-1)*abs(x2-x1)))
       length=sqrt((dx**2)+(dy**2))
       s=length+s
       end do
       print*,s
    end program
     
    Last edited: Nov 17, 2015
  2. jcsd
  3. Nov 17, 2015 #2

    NascentOxygen

    User Avatar

    Staff: Mentor

    What is the result you're getting that you say is wrong?

    "Lenght" being a misspelling of "length"?
     
  4. Nov 17, 2015 #3
    Well if for x1=0.5 and for x2=1.5 I am getting 104.3853... That can't be right since I've checked it in wolframalpha and it says 13
     
  5. Nov 17, 2015 #4

    NascentOxygen

    User Avatar

    Staff: Mentor

    EDIT: My reading of this is that it needs a program to print out 20 answers, one answer for each value of n.

    I can see your program prints only one answer, right at the end, so that might be where you are going wrong?

    How would you explain to someone what n is in this situation, to show you understand what this calculation is about?
     
    Last edited: Nov 17, 2015
  6. Nov 17, 2015 #5
    Well I think the curve's x's from x1 to x2 can be divided to 20 equidistant x's with every n to be used to get to the next x.Xn=abs(x2-x1)*x/20 and X(n-1)=(x-1)*(abs(x2-x1)/20).Therefore if I subtract Xn,X(n-1),I will be getting the distance between consecutive X's.
     
  7. Nov 17, 2015 #6

    NascentOxygen

    User Avatar

    Staff: Mentor

    That would be the case for n=20. But, for example, when n=16 then there would be 16 segments spanning the path between those same two endpoints. That's what I think. The greater the value of n, the closer to the true length will be your approximation.
     
  8. Nov 17, 2015 #7
    I am aware of that,although that can't be the problem the bigger the n the more my sum goes up.And the problem states that it should be able to work with just n=20,which doesn't in my case.Therefore I assume the problem is associated with my code.Nevermind thanks for your suggestion
     
  9. Nov 17, 2015 #8

    DrClaude

    User Avatar

    Staff: Mentor

    When you write 5.3*20/x*abs(x2-x1), it means
    $$
    5.3 \times \frac{20}{x} \times \left| x_2 - x_1 \right|
    $$
    which is not what you want.

    You should create a function that given x, returns f(x), instead of hard-coding it many times. Also, do not use x as an integer index for the loop. It looks too much like the mathematical variable x. Use something like i instead.
     
  10. Nov 17, 2015 #9

    Mark44

    Staff: Mentor

    Nicholas, your code is chock full of what are disparagingly called "magic" numbers, constants that are hard-coded. The number of subintervals should be a variable that the user enters, and not sprinkled throughout in your loop ending value and your assignment statements for dx and dy.

    As already suggested, your code would be a lot more readable if you used a function to calculate the y values.

    Code (Fortran):
    function f(x)
       double precision :: f
       double precision ::x
     
       f = 3.1 * x**2 - 5.3/x
       return
    end function
    The only change to your main program would be to insert a declaration for the function up near the top:
    Code (Fortran):
    program pr2_ex2
    implicit none
    double precision:: f
     
    To use the function, write an expression of the form f(x1).

    One more thing -- you really shouldn't use x as your loop control variable. Use i or j for that.
     
    Last edited: Nov 17, 2015
  11. Nov 17, 2015 #10
    Thank you for your answers!! I will be using your advice for sure in my code and see how it goes
     
  12. Nov 17, 2015 #11

    Mark44

    Staff: Mentor

    I put together some Python code to do this calculation. With n = 20 and n = 100 subintervals, I got 13.3059 in the first four decimal places.
     
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook

Have something to add?
Draft saved Draft deleted



Similar Discussions: Error while calculating arc length of curve in Fortran
Loading...