Gnuplot-how to find the area under a curve / integrate?

Click For Summary

Discussion Overview

The discussion revolves around methods for finding the area under a curve using Gnuplot, focusing on numerical integration techniques. Participants explore the capabilities of Gnuplot for this purpose, compare it with other software, and share programming approaches.

Discussion Character

  • Exploratory
  • Technical explanation
  • Debate/contested
  • Mathematical reasoning

Main Points Raised

  • One participant expresses the desire to find the approximate area under a curve using straight lines without curve fitting, questioning the capabilities of Gnuplot for this task.
  • Another participant states that Gnuplot does not support integration directly but suggests using xmgrace for full curve integration and recommends writing a simple program for integration with customizable ranges.
  • A different participant mentions using Gnuplot.py with Python and the scipy package for numeric integration, specifically referencing the "trapz" function for this purpose.
  • One participant seeks clarification on how to perform integration in Gnuplot, providing a specific example of a Lorentzian function and requesting assistance with code that includes multiple input parameters.
  • Another participant suggests a workaround within Gnuplot using Simpson's rule for numerical integration, referencing an example file from the Gnuplot documentation.

Areas of Agreement / Disagreement

Participants do not reach a consensus on the best method for integration in Gnuplot, with multiple competing views and suggestions presented throughout the discussion.

Contextual Notes

Some participants highlight limitations in Gnuplot's integration capabilities and the need for external tools or programming solutions. There are also references to specific functions and examples that may require additional context for implementation.

Dunhausen
Messages
30
Reaction score
0
Gnuplot--how to find the area under a curve / integrate?

I would assume this is a quite popular undertaking, so how is it normally done?

I just want to know the approximate area under the curve if all the points were joined by straight lines, no need (or desire) for curve fitting.

If I have to use another graphing program to do this then gnuplot becomes pretty pointless. :p
 
Physics news on Phys.org


Hi, As far as i know integration is not possible in gnuplot (i agree gnuplot is an excellent simple plotting and fitting package, especially for fitting it is wonderful with high precession).
But in xmgrace you can integrate a full curve..
The best advice i can give is to write a simple program for integration..so that you can even set the ranges of X-axis values for integration.
good luck
 


I wound up using Gnuplot.py, which let's you run Gnuplot using python. In hindsight this is easier, anyway.

There are several functions in the scipy package which can perform this type of numeric integration. (I used "trapz")

Then Gnuplot can be called like this:
(posted because so far Gnuplot.py is not very well documented)

Code:
    import Gnuplot
    gp2 = Gnuplot.Gnuplot(persist=1)  #persist=1 keeps the window open after the program runs
    gp2('set data style lines')
    gp2('set termoption enhanced')  #so that the fancy symbols below work in the GUI display
    gp2('set title "Graph of {/Symbol Y}_{II}"')
    gp2('set xlabel "x (meters)"')
    gp2('set ylabel "{/Symbol Y}"')


    gp3 = Gnuplot.Gnuplot(persist=1)  #create a different object for a different plot
    gp3('set data style lines')
    gp3('set termoption enhanced')
    gp3('set title "Graph of {/Symbol Y}_{III}"')
    gp3('set xlabel "x (meters)"')
    gp3('set ylabel "{/Symbol Y}"')    
    
    #Generate wave function data for the specified energy levels
    
    num_divisions=1000
    spacing=L/num_divisions
    x2=arange(0,L, spacing)
    x3=arange(L,2*L, spacing)

    Psi2_0=A[0]*Psi2(x2,L_2[0])
    Psi2_1=A[1]*Psi2(x2,L_2[1])
    Psi2_2=A[2]*Psi2(x2,L_2[2])

    Psi3_0=Psi3(x3,L_3[0])
    Psi3_1=Psi3(x3,L_3[1])
    Psi3_2=Psi3(x3,L_3[2])


    plot2_0=Gnuplot.PlotItems.Data(x2,Psi2_0,title='{/Symbol Y}_{II_0}')
    plot2_1=Gnuplot.PlotItems.Data(x2,Psi2_1,title='{/Symbol Y}_{II_1}')
    plot2_2=Gnuplot.PlotItems.Data(x2,Psi2_2,title='{/Symbol Y}_{II_2}')

    plot3_0=Gnuplot.PlotItems.Data(x3,Psi3_0,title='{/Symbol Y}_{III_0}')
    plot3_1=Gnuplot.PlotItems.Data(x3,Psi3_1,title='{/Symbol Y}_{III_1}')
    plot3_2=Gnuplot.PlotItems.Data(x3,Psi3_2,title='{/Symbol Y}_{III_2}')
    
    gp2.plot(plot2_0,plot2_1,plot2_2)
    gp3.plot(plot3_0,plot3_1,plot3_2)
    
#note that terminal="postscript enhanced" returns an error, you have set "enhanced" as so
    gp2.hardcopy(filename="psi2.ps",terminal="postscript",enhanced=1) 
    gp3.hardcopy(filename="psi3.ps",terminal="postscript",enhanced=1)
 


Hi that is wonderful,
but i don't understand..
Normally in linux i type gnuplot in command..then i work with gnuplot ..[i use only for fitting]..
I curious to know about integration in gnuplot..If you have some time please help..For e.g., I have a lorentzian and want to find the area..
my function:
f(x)=\frac{h\Gamma^2}{\Gamma^2+4(x-x_0)^2},
where h is height and \Gamma is full width at half maximum and x_0 is peak position. It would be nice if you provide the code with 5 input parameters (peak position, full width, height, left and right limit of peak (left=right), number of data points). It is often time consuming for me to write C codes and finding bugs..
thank you very much
 


Although gnuplot is not really very well suited for operations like integration etc., a workaround is possible - within gnuplot itself! Check out the example file bivariat.dem that comes with the gnuplot documentation - it provides a way to use Simpson's rule for numerical integration that you can easily adapt for your use.
 

Similar threads

  • · Replies 9 ·
Replies
9
Views
4K
  • · Replies 5 ·
Replies
5
Views
3K
  • · Replies 2 ·
Replies
2
Views
2K
Replies
2
Views
971
  • · Replies 10 ·
Replies
10
Views
5K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 11 ·
Replies
11
Views
2K
  • · Replies 17 ·
Replies
17
Views
1K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K