Найдите максимальную площадь (MatLab)

Рассмотрим код ниже (MatLab):

w = 0 : 0.0001 : 9.4978;
a = [1    11    46    95   109    74    24];
b = [-1 3 4 3 1];
mu = 1;
a0 = a(7) ;a1 = a(6) ;a2 = a(5); a3 = a(4) ; a4 = a(3) ; a5 = a(2); a6 = a(1);
b0 = b(5);b1 = b(4);b2 = b(3) ; b3 = b(2); b4 = b(1) ;
De = -a6*w.^6 + a4*w.^4 - a2*w.^2 + a0;
Do = a5*w.^4 - a3*w.^2 + a1;
Ne = b4*w.^4 - b2*w.^2 + b0;
No = -b3*w.^2 + b1;
T = 0.01;
e = real((1i*w).^mu);
f = imag((1i*w).^mu);
A = Ne.*cos(T*w) + w.*No.*sin(T*w);  
B = e.*(Ne.*cos(T*w) + w.*No.*sin(T*w)) - f.*(w.*No.*cos(T*w) - Ne.*sin(T*w));
C = w.*No.*cos(T*w) - Ne.*sin(T*w);
D = e.*(w.*No.*cos(T*w) - Ne.*sin(T*w)) + f.*(Ne.*cos(T*w) + w.*No.*sin(T*w));
Kp = (-De.*D + w.*Do.*B)./(f.*(Ne.^2 + w.^2.*No.^2));
Kd = (-w.*Do.*A + De.*C)./(f.*(Ne.^2 + w.^2.*No.^2));
figure
plot(Kp,Kd)
line([-24 -24],[-2.24 9.813])

Запустив код, мы получили этот рисунок: введите здесь описание изображения

Я хочу нарисовать касательные линии на указанной части кривой (красная часть, w принадлежит [0.6342,0.9985]): введите здесь описание изображения

после этого моя цель - найти максимальную площадь направленной внутрь полуплоскости, определяемой этой линией, и кривой между всеми возможными областями, полученными касательной линией (например): введите здесь описание изображения

другой пример с другой касательной в другой точке:

введите здесь описание изображения

и мы можем заключить, что первая область больше второй. Этот подход должен работать для всех точек в красной части.

Как я могу сделать это с помощью MatLab?

Надеюсь, мой вопрос понятен. Любая идея будет оценена.


person Zakhar    schedule 16.09.2013    source источник
comment
Что вы имели в виду, чтобы решить эту проблему? Это действительно проблема программирования?   -  person Eitan T    schedule 16.09.2013
comment
Это немного двусмысленно: вы хотите провести касательные линии на указанной части кривой. Вы имеете в виду, что хотите провести касательную в определенной точке, или группу или касательные в группе точек на этом участке? К тому же, как указывает EitanT, это прежде всего проблема геометрии. Как только вы решите это, вы можете подумать о программировании. Вы также можете рассмотреть возможность использования инструментов обработки изображений для выполнения задачи, если это графическое упражнение.   -  person Buck Thorn    schedule 16.09.2013
comment
@EitanT Я не знаю, как это сделать. Вот почему я опубликовал это.   -  person Zakhar    schedule 16.09.2013
comment
@Zia Но как это на самом деле связано с MALTAB? Это теоретическая проблема. Как только вы найдете подход к ее решению, вы можете попробовать его в MATLAB.   -  person Eitan T    schedule 16.09.2013
comment
@TryHard Я имею в виду, что хочу нарисовать n касательных линий в n различных (но последовательных) точках (n точек принадлежат красной части кривой). После поиска среди n площадей, полученных n касательными, определите максимальную площадь и касательную, относящиеся к максимальной площади. (касательные в куче точек в красной части). Но я не могу понять, почему вы отмечаете, что это геометрическая задача? Что вы предлагаете использовать инструменты обработки изображений?   -  person Zakhar    schedule 16.09.2013
comment
@TryHard Я добавил больше деталей.   -  person Zakhar    schedule 16.09.2013
comment
Я бы попытался решить ее следующим образом: 1) определить все возможные касательные и использовать их для определения треугольников в левом нижнем углу. 2) Определить площадь перекрытия треугольников и исходной фигуры и связать их с площадью исходной фигуры A_color = A_original-A_overlap. Для обоих шагов вы найдете решения здесь, на SO или в Matlab Central. Возможно, вам также поможет функция polyarea.   -  person thewaywewalk    schedule 16.09.2013
comment
Это проблема геометрии, потому что вам нужно найти точки пересечения касательной и исходной кривых... Я бы начал с разбивки неявно определенной кривой (f(t),g(t)) на две кривые y1 = h1(x) и y2 = h2(x) и найти точки пересечения. Затем напишите выражение для площади с их точки зрения, которое вы можете максимизировать в Matlab с помощью оптимизации.   -  person Buck Thorn    schedule 16.09.2013
comment
@thewaywewalk Не могли бы вы объяснить, что вы имеете в виду под перекрытием?   -  person Zakhar    schedule 16.09.2013
comment
взгляните на мое решение сейчас, это выглядит разумно? @Try-Hard, Eitan-T: приветствуются упрощения!   -  person thewaywewalk    schedule 16.09.2013
comment
@TryHard Как вы прокомментируете ответ, опубликованный thewaywewalk?   -  person Zakhar    schedule 16.09.2013


Ответы (1)


Это должно как-то работать.

% remove NaNs
Kd(1)=[];
Kp(1)=[];
%%

%exclude non relavant part of original curve
x=Kp;
y=Kd;
exc = 40000;
x(exc:1:end)=[];
y(exc:1:end)=[];

mask = find(x < -9 & x > -19);
xs = x(mask);
ys = y(mask);

L = length(xs)
%%
% determine area of original shape
A_total = polyarea(Kd,Kp);

% pre-allocation    
slope=zeros(L,1)';
inter = slope;
A_part = slope;

for ii = 1:1:L;
    % determine slope for every point
    xslope = xs(ii);
    idx_a = find(xs<xslope,1,'last');
    idx_b = find(xs>xslope,1,'first');
    xa = xs(idx_a);
    xb = xs(idx_b);
    slope(ii) = (ys(idx_b) - ys(idx_a))/(xb - xa);

    % determine slope between current point and any other one
    slopeX = (ys(ii)-y)./(xs(ii)-x);
    % determine intersection points of tangent with rest of curve
    [~,intersection] = min(abs((slopeX)-slope(ii)));
    % index of intersection
    inter(ii)=intersection;
end

% modify curve to get polygon
x_start = x(1);
x_end = x_start;
y_start = y(1);


%finally calculate all single area values A(ii)
for ii = 1:1:L;
    i_inter = inter(ii);
    y_end = y(i_inter) - (x(i_inter)- x_end)*slope(ii);
    x(i_inter+1) = x_end;
    y(i_inter+1) = y_end;
    A_part(ii) = A_total - polyarea( x(1:1:i_inter+1) ,y(1:1:i_inter+1) );
end

Когда вы теперь нанесете A_part на x, вы получите:

введите здесь описание изображения

в качестве доказательства здесь все касательные: введите здесь описание изображения

person thewaywewalk    schedule 16.09.2013
comment
Спасибо. Это кажется разумным. Но я должен проверить это. Еще раз спасибо. - person Zakhar; 16.09.2013
comment
@Zia, надеюсь, последнее исправление ... не волнуйся, мне очень нравится этот вопрос. - person thewaywewalk; 16.09.2013
comment
Это хороший численный подход, но последняя часть (определение области для исключения) кажется не совсем правильной. Попробуйте, например, наложить plot(x(1:1:i_inter+1) ,y(1:1:i_inter+1),'r:') на исходную кривую... - person Buck Thorn; 16.09.2013
comment
@TryHard, ты прав, я еще раз посмотрел на это. На втором графике видны все касательные, теперь вроде правильно. (В самом деле!) :) - person thewaywewalk; 17.09.2013
comment
@thewaywewalk выглядит намного лучше! :) - person Buck Thorn; 17.09.2013