Вычислите заштрихованную область под кривой выше и ниже порога, используя trapz и MATLAB.

введите здесь описание изображенияЯ пытаюсь найти площадь заштрихованных частей кривой. Синий выше порога и серый ниже порога. В скрипте вы можете изменить соотношение синего и серого, регулируя значение уровня. Когда уровень установлен на 2 (рис. 1), площади должны быть равны. Когда уровень установлен на 1,6 (рис. 2), синий должен иметь большую площадь, чем серый, и т. д. Есть какие-нибудь мысли о том, как найти области под кривой ниже и выше порога?

рис. 1: рис. 1

рис. 2: рис. 2

Мой код:

%% Example 
x = 0:.01:4*pi;% x data
y = sin(x)+2;% y data
level = 2;% level
plot(x, y)
hold on
x_interest = 0:.01:x(length(y));
y_interest = sin(x_interest)+2;
xlim ([0 x(length(y))])

% Shaded area above level
area(x_interest, max(y_interest, level), level, ...
    'EdgeColor', 'none', 'FaceColor', [.6 .7 .8], ...
    'ShowBaseLine', 'off');

% Shaded area below level
area(x_interest, min(y_interest, level), level, ...
    'EdgeColor', 'none', 'FaceColor', [.5 .5 .5], ...
    'ShowBaseLine', 'off');

%%== This did not work ==%%
above = find(y_interest >= level);
below = find(y_interest <= level);
A_above = trapz(above)
A_below = trapz(below)

 %% Integrate
 plot(x, sin(x)+2)
 fun = @(x) sin(x)+2; 
 integral(fun, 0, x(length(y)))

 A = trapz(x,y)

person user7411032    schedule 12.01.2017    source источник
comment
Кажется, все, что вам не хватает, это A_above = trapz(x_interest(above),y_interest(above)), а также A_below.   -  person Florian    schedule 12.01.2017
comment
@user7411032: Спасибо за очень хорошо сформулированный вопрос. Я хочу, чтобы больше из нас последовало твоему примеру. :)   -  person aksadv    schedule 13.01.2017


Ответы (1)


В общем смысле функция trapz(x,y) (где x и y — векторы одинаковой длины) оценивает площадь под кривой f(x) = y. Эта область заключена между функцией f(x) и осью x.

Для A_above вы хотите оценить площадь между кривыми f1(x_interest) = max(y_interest, level) и f2(x_interest) = level. Это то же самое, что и площадь под кривой f1(x_interest), сдвинутая вниз на level. Таким образом, это можно оценить по:

A_above =  trapz(x_interest, max(y_interest, level)-level)

Аналогично для A_below:

A_below = -trapz(x_interest, min(y_interest, level)-level)
person aksadv    schedule 12.01.2017
comment
@aksadv: Спасибо за помощь, все получилось! Я действительно ценю это, а также ценю объяснение того, как trapz оценивает кривую. Очень полезная информация. Спасибо, что нашли время. - person user7411032; 13.01.2017
comment
Эй, я работал с этим вчера и хотел сравнить его с интегральной функцией в MATLAB и обнаружил, что получаю только половину значения, когда уровень установлен на 1 (что делает синюю кривую полной без серого) 12,56. Однако, когда я интегрирую sin(x)+2, я получаю 25,12. Итак, я попробовал trapz(x,y) и получил 25,12, как и при интегрировании, что имеет смысл. Так что не знаю, почему я теряю половину стоимости, используя предложенный вами метод. есть идеи? Я добавил код с интеграцией в свой редактируемый раздел. - person user7411032; 14.01.2017
comment
@ user7411032: integral и trapz вычисляют площадь между функцией (в данном случае y = sin(x) + 2) и осью x, тогда как изначально вы хотели вычислить площадь между функцией и линией y = level. Если вы внимательно нарисуете их, вы увидите, что нижняя часть заштрихованной области в этих двух случаях различна. - person aksadv; 14.01.2017
comment
@ aksadv: Я полностью согласен, однако, не должен ли trapz = интеграл, когда уровень установлен на 1 (см. верхний рисунок)? Если я построю y = sin(x)+2 и возьму интеграл, я получу площадь под кривой 25,12, как вы сказали. Я также получаю то же самое, используя trapz(x,y). Но, используя ваш метод, не должен ли я получить то же самое, если я установлю уровень на 1, что делает затененный синим участок = области под кривой для sin (x) + 2 с использованием интегральной функции? - person user7411032; 14.01.2017
comment
@ user7411032: trapz(x, y - level) будет равно integral, если level равно 0 (а не 1). Посмотрите на свой текущий верхний график. Заштрихованная область составляет 12,56 (т. е. половина всей площади графика, которая составляет 12,56 единиц в ширину и 2 единицы в высоту), что правильно дается формулой на основе trapz с поправкой уровня. Прошу прощения, если я не могу правильно понять вашу мысль. Не стесняйтесь задавать вопросы. - person aksadv; 14.01.2017
comment
@ aksadv: Ага... Я понимаю, о чем ты говоришь. Да, вы правы; У меня был ахуенный момент. Еще раз спасибо за вашу готовность быть полезным, я действительно ценю это. Мне нужно было убедиться, что я точно понял, как работают эти функции, поскольку кривые, к которым я буду их применять, намного сложнее, и мне нужно убедиться, что полученные числа имеют смысл. В ближайшее время у меня могут возникнуть дополнительные вопросы. Я буду использовать эту тему для тех, кто относится к такого рода вопросам. Еще раз спасибо, ура! - person user7411032; 15.01.2017