2017-01-12 33 views
2

Im пытается найти область затененных частей кривой. Синий - выше порога и серый - ниже. В сценарии вы можете изменить соотношение синего и серого, отрегулировав значение уровня. Когда уровень установлен на 2 (рис. 1), области должны быть равны. Когда уровень установлен на 1.6 (рис. 2), синий должен иметь большую площадь, чем серый, и т. Д. Любые мысли о том, как найти области под кривой ниже и выше порога?Вычислите заштрихованную область под кривой выше и ниже порога с помощью trapz и MATLAB

рис 1: pic 1

рис 2: pic 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) 
+3

Кажется, все ваши недостающая 'A_above = trapz (x_interest (выше), y_interest (выше))' и также для 'A_below'. – Florian

+0

@ user7411032: Спасибо за очень хорошо сформулированный вопрос. Я желаю, чтобы мы больше следовали вашему примеру. :) – aksadv

ответ

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) 
+0

@ aksadv: Спасибо за помощь, что сделал трюк! Я очень ценю это, а также ценю объяснение того, как ловушка оценивает кривую. Очень полезная информация. Спасибо, что нашли время. – user7411032

+0

Эй, я работал с этим вчера и хотел сравнить его с интегральной функцией в MATLAB и обнаружил, что получаю только половину значения, когда уровень установлен в 1 (что делает синюю кривую полной без серого) 12.56. Однако, когда я беру интеграцию sin (x) +2, я получаю 25.12. Поэтому я попробовал trapz (x, y) и получил 25.12, так же как и интеграция, что имеет смысл. Поэтому не уверен, почему я теряю половину стоимости с помощью предложенного вами метода. Есть предположения? Я добавил код с интеграцией в мой отредактированный раздел. – user7411032

+0

@ user7411032: 'интеграл' и' trapz' вычисляют площадь между функцией ('y = sin (x) + 2', в данном случае) и осью x, тогда как первоначально вы хотели вычислить область между и строку 'y = level'. Если вы тщательно их вычертите, вы увидите, что нижняя часть затененной области отличается в двух случаях. – aksadv