How to integrate a plot over specified range?

Hi everyone.
I want to integrate a plot over specified range. i have two seperate arrays i.e. x(t) and y(x) which i already have in a plot. now i want to integrate y(x) over x(t) from x(t1) to x(t2), the area under y(x) over this specified range.
To get a better view, let me elaborate with an example:
t = 0:0.1:2*pi;
x = sin(t);
y = cos(x);
Now the question is how to calculate ∫y.dx from x(t=1) to x(t=2).
best regards

 Réponse acceptée

MS
MS le 22 Sep 2019
Modifié(e) : MS le 22 Sep 2019
You can use the integral function to numerically integrate a function from xmin to xmax. Example:
% define functions
fun_x = @(t) sin(t);
fun_y = @(x) cos(x);
% assign the time interval
t1 = 1;
t2 = 2;
% evaluate function x
xmin = feval(fun_x,t1);
xmax = feval(fun_x,t2);
% integrate
q = integral(fun_y,xmin,xmax);
disp (q);
>>> Output:
0.0434
Hope this helps.

4 commentaires

behzad
behzad le 22 Sep 2019
Thank you MS for considering this.
But what if the functions are not available and we have just data points ploted in a figure (not a recognized function)?
MS
MS le 22 Sep 2019
Modifié(e) : MS le 22 Sep 2019
In this case, you may consider the integral as a summation of the sub-areas under the curve. For example, consider the following criteria. I'm using the functions to create the x and y vectors as an example, but you can import them (assuming you have the data points as you said).
% time vector
t=0:0.1:2*pi;
overall_total = length(t);
x_vector = zeros(1,overall_total);
y_vector = zeros(1,overall_total);
% create the arrays (or get them)
for i=1:overall_total
x_vector(i) = sin(t(i));
y_vector(i) = cos(x_vector(i));
end
% select the points in the x_vector and the y_vector that belongs to the
% interval (t belongs to [t_min,t_max])
t_min = 1;
t_max = 2;
counter =1;
for i=1:overall_total
if ((t(i)>=t_min) && (t(i)<=t_max))
selected_x_vector(counter) = x_vector(i);
selected_y_vector(counter) = y_vector(i);
counter = counter + 1;
end
end
% calculate the sub areas and add them to the summation
selected_total = length(selected_x_vector);
total_area_integral = 0;
for i=2:selected_total
% difference between consecutive x points
width = selected_x_vector(i) - selected_x_vector(i-1);
% average of consecutive y points
length = (selected_y_vector(i) + selected_y_vector(i-1)) / 2;
% calculate sub area
sub_area = width*length;
% add sub area to summation
total_area_integral = total_area_integral + sub_area;
end
% result
disp(total_area_integral);
>>> Output:
0.0434
behzad
behzad le 22 Sep 2019
I get the idea. It is nice and clean, very basic too. I think this solves the problem.
Very helpfull, thanks MS.
Rik
Rik le 22 Sep 2019
It should be possible to replace your last loop with trapz.

Connectez-vous pour commenter.

Plus de réponses (1)

Rik
Rik le 22 Sep 2019
Modifié(e) : Rik le 22 Sep 2019
As you indicated with the tags, using trapz is also an option.
fun_x_of_t=@(t) sin(t);
fun_y_of_x=@(x) cos(x);
fun_y_of_t=@(t) fun_y_of_x(fun_x_of_t(t));
t=linspace(1,2,100);
x=fun_x_of_t(t);
y=fun_y_of_t(t);
trapz(x,y)

2 commentaires

behzad
behzad le 22 Sep 2019
Thank you Rik.
I know i stated in second part of my question the functions are available as sin and cos. But what we can do in a situation that we have just data points in a plot and they are not known as common functions?
I appreciate you considering the question.
Rik
Rik le 22 Sep 2019
As long as you have the xy paired data, you can use trapz. If you don't have x (or it is impossible to derive x from t) what you want is imposible.

Connectez-vous pour commenter.

Catégories

Question posée :

le 22 Sep 2019

Commenté :

Rik
le 22 Sep 2019

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by