Matlab: заполнить пространство между функцией 2 и осями графика - PullRequest
0 голосов
/ 07 марта 2020

Как заполнить пробел между функцией g, функцией h и осью XOY?

g = @(x) 3-x;
h = @(x) 1+x;
interval = linspace(-5,5,10);
plot(interval,g(interval),'-b');
hold on;
plot(interval,h(interval),'-g');
fill(g,h,'-r');
plot([0 0], ylim, '-r');
plot(xlim, [0 0], '-r');

1 Ответ

1 голос
/ 09 марта 2020

Я собираюсь предположить, что это изображение является желаемым результатом, то есть g всегда является линией с отрицательным наклоном, а h всегда является линией с положительным наклоном: enter image description here Вот Функция используется для генерации одного из этих многочисленных графиков. Я рекомендую прочитать объяснение ниже, прежде чем посмотреть, как работает код.

function main(ax, g, h)
% ax - handle to an Axes object, i.e. ax = gca;
% g - symbolic function of line with negative slope, i.e. syms g(x); g(x) = 3 - x;
% h - symbolic function of line with positive slope, i.e. syms h(x); h(x) = 1 + x;
X = linspace(-5, 5, 101);
Y = linspace(-5, 5, 101)';
G = double(g(X))-Y; % compute g - y everywhere
H = double(h(X))-Y; % compute h - y everywhere

gi = finverse(g);
hi = finverse(h);
% solve x-intercepts
gx = solve(g); 
hx = solve(h);
% solve y-intercepts
gy = solve(gi);
hy = solve(hi);


if sign(gx) == sign(hx)% triangles up/down stacked
    % LR: indicates whether we want left/right of Y-axis
    % gc: comparison operator (>= or <=) of `g-Y (gc) 0`
    % gY: comparison operator (>= or <=) of `Y (gY) 0` for triangle formed by g
    % hc: comparison operator (>= or <=) of `h-Y (hc) 0`
    % hY: comparison operator (>= or <=) of `Y (hY) 0` for triangle formed by h
    if gx >= 0 % triangles in Q1/Q4
        LR = X >= 0;
    elseif gx < 0 % triangles in Q2/Q3
        LR = X <= 0;
    end

    if gy >= 0 % look below g
        gc = @(x) ge(x, 0);
        gY = @(x) ge(x, 0);
    else % look above g
        gc = @(x) le(x, 0);
        gY = @(x) le(x, 0);
    end
    if hy >= 0 % look below h
        hc = @(x) ge(x, 0);
        hY = @(x) ge(x, 0);
    else % look above h
        hc = @(x) le(x, 0);
        hY = @(x) le(x, 0);
    end
    gt = gc(G) & gY(Y) & LR;
    ht = hc(H) & hY(Y) & LR;

elseif sign(gy) == sign(hy) % triangles left/right side by side
    % UD: indicates whether we want up/down of X-axis
    % gc: comparison operator (>= or <=) of `g-Y (gc) 0`
    % gX: comparison operator (>= or <=) of `X (gX) 0` for triangle formed by g
    % hc: comparison operator (>= or <=) of `h-Y (hc) 0`
    % hX: comparison operator (>= or <=) of `X (hX) 0` for triangle formed by h
    if gy >= 0 % triangles in Q1/Q2
        UD = Y >= 0;
    elseif gx < 0 % triangles in Q3/Q4
        UD = Y <= 0;
    end

    if gx >= 0 % look left/below of g
        gc = @(x) ge(x, 0);
        gX = @(x) ge(x, 0);
    else % look right/above g
        gc = @(x) le(x, 0);
        gX = @(x) le(x, 0);
    end
    if hx >= 0 % look left/above of g
        hc = @(x) le(x, 0);
        hX = @(x) ge(x, 0);
    else % look right/below h
        hc = @(x) ge(x, 0);
        hX = @(x) le(x, 0);
    end
    gt = gc(G) & gX(X) & UD;
    ht = hc(H) & hX(X) & UD;
else % only 1 triangle
    ghx = solve(g == h);
    ghy = solve(gi == hi);
    if ghy >= 0 % Q1/2
        if ghx >= 0 % Q1
            gt = G >= 0 & X >= 0 & Y >= 0;
            ht = gt;
        else % Q2
            ht = H >= 0 & X <= 0 & Y >= 0;
            gt = ht;
        end
    else % Q3/4
        if ghx >= 0 % Q4
            ht = H <= 0 & X >= 0 & Y <= 0;
            gt = ht;
        else % Q3
            gt = G <= 0 & X <= 0 & Y <= 0;
            ht = gt;
        end
    end
end

Z = 0*(X+Y);
Z(gt | ht) = 1;
contourf(ax, X, Y, Z, [1,1]);

plot(ax, [-5, 5], [0, 0], 'k-')
plot(ax, [0,0], [-5, 5], 'k-');
plot(ax, [-5, 5], double(g([-5, 5])), 'b-');
plot(ax, [-5, 5], double(h([-5, 5])), 'r-');
end

Функция может быть вызвана следующим образом:

syms x g(x) h(x)
g(x) = 3 - x;
h(x) = 1 + x;
ax = gca;
hold(ax, 'on')
set(ax, 'XLim', [-5, 5], 'YLim', [-5, 5]);
main(ax, g, h)

Основная идея метода заключается в следующим образом:

  • Создайте двумерную сетку нулей на плоскости 2D.
  • Если ячейка находится в указанной области, сделайте ее равной 1.
  • Тогда построить контур этой сетки.

Недостатком этого метода является то, что полигоны неровные / несовершенные и не гладкие. Это потому, что это численное решение проблемы, а не аналитическое решение.

Часть, которая требовала наибольшего размышления, заключалась в том, как определить площадь для заговора. Как правило, область построения представляет собой либо 1 прямоугольный треугольник (если один из g и h проходит начало координат), либо 2 прямоугольных треугольника (во всех остальных случаях, кроме случаев, когда оба g и h проходят через происхождение).

  1. В случае 1 прямоугольного треугольника просто найдите пересечение g и h, определите его квадрант и определите, является ли гипотенуза прямоугольного треугольника является частью g или h.

  2. В случае 2 прямоугольных треугольников, сначала определите, выровнены ли они рядом (если y-перехватчики оба положительные / отрицательный), или один поверх другого (если x-перехваты оба положительные / отрицательные). В каждом случае гипотенуза одного треугольника является частью g, а гипотенуза другого - частью h. Мы рассматриваем случай, когда треугольники выровнены бок о бок, так как другой случай аналогичен:

    1. Если y-пересечение положительное, то ось X является нижней границей каждого треугольника, т.е. мы хотим область, которая удовлетворяет Y >= 0.
    2. Если x-точка пересечения g положительна, то мы хотим область ниже g, так далеко влево, как ось Y, т.е. мы хотим, чтобы точки (x, y) удовлетворяли y <= g при ограничении x >= 0, что эквивалентно g-Y >= 0 и X >= 0.

      (Если x-точка пересечения g отрицательна, то мы хотим, чтобы область выше g, как можно ближе к оси Y. Это означает g - Y <= 0 и X <= 0.) Таким образом, треугольник, образованный g, ограничен условиями Y >= 0, g-Y >= 0 и X >= 0.

    3. . Повторите шаг 2, чтобы получить ограничения для треугольника, образованного h .
    4. Последняя желаемая область - это объединение областей, образованных двумя треугольниками.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...