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

 채택된 답변

MS
MS 2019년 9월 22일
편집: MS 2019년 9월 22일

1 개 추천

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

behzad
behzad 2019년 9월 22일
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 2019년 9월 22일
편집: MS 2019년 9월 22일
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 2019년 9월 22일
I get the idea. It is nice and clean, very basic too. I think this solves the problem.
Very helpfull, thanks MS.
Rik
Rik 2019년 9월 22일
It should be possible to replace your last loop with trapz.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Rik
Rik 2019년 9월 22일
편집: Rik 2019년 9월 22일

1 개 추천

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

behzad
behzad 2019년 9월 22일
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 2019년 9월 22일
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.

댓글을 달려면 로그인하십시오.

카테고리

도움말 센터File Exchange에서 Numerical Integration and Differentiation에 대해 자세히 알아보기

질문:

2019년 9월 22일

댓글:

Rik
2019년 9월 22일

Community Treasure Hunt

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

Start Hunting!

Translated by