MATLAB Piecewise Functions + Vector Manipulation - PullRequest
0 голосов
/ 11 октября 2009

Я хотел бы написать программу, которая отображает точки сверху полукруга на определенном интервале и прямую линию повсюду. Примерно так: __n__.

Я определил временную область, которая была сохранена как вектор (t = 0:0.01:5). Я предполагал, что смогу определить точки на вершине полукруга, используя элементы вектора времени:

if t>=2|t<=2.3
y = sqrt(.15^2-(t-2.15)^2);

но MATLAB выдал сообщение об ошибке, в котором говорится, что квадраты могут быть заключены в квадрат.

Я пытался использовать индексы, чтобы показать, что я хотел возвести в квадрат элемент вектора t, а не весь вектор:

i = [200:230];
for t(200:230)
y = sqrt(.15^2-(t(i)-2.15)^2);

После этих сбоев я заметил, что возведение в квадрат квадратной матрицы с одним столбцом ненулевых элементов даст новую квадратную матрицу с квадратом столбца элементов первой матрицы. Если есть какой-то способ устранить лишние столбцы нулей после возведения в квадрат матрицы, я мог бы использовать это свойство матриц для возведения в квадрат значений вектора t.

Какой самый простой и эффективный способ решения этой проблемы?

Ответы [ 2 ]

1 голос
/ 11 октября 2009

Звучит так, будто вы хотите нарисовать горизонтальную линию с полукруглым «выпуклостью» на нем. Вот как вы можете сделать это:

t = 0:0.01:5;        % Create the time vector
y = zeros(size(t));  % Create a zero vector the same size as t
index = find((t >= 2) & (t <= 2.3));        % Find a set of indices into t
y(index) = sqrt(.15^2-(t(index)-2.15).^2);  % Add the "bump" to y
y(1:index(1)) = y(index(1));                % Add the line before the "bump"
y(index(end):end) = y(index(end));          % Add the line after the "bump"

В приведенном выше решении линии до и после «выпуклости» могут быть немного выше или ниже друг друга (в зависимости от того, куда попадают ваши образцы в t). Если вы хотите убедиться, что они на одной высоте, вы можете вместо этого сделать следующее:

index = (t >= 2) & (t <= 2.3);              % Find a set of logical indices
y(index) = sqrt(.15^2-(t(index)-2.15).^2);  % Add the "bump" to y
% OPTION #1:
y(~index) = y(find(index,1,'first'));  % Use the first circle point as the height
% OPTION #2:
y(~index) = y(find(index,1,'last'));   % Use the last circle point as the height

Наконец, вы можете построить линию:

plot(t,y);
1 голос
/ 11 октября 2009

Подожди, так твой вопрос, ты хочешь возвести в квадрат каждый элемент вектора? Все, что вам нужно сделать, это:

t.^2

. представляет поэлементную операцию в MATLAB для вектора или массива.

А во-вторых, если я понял вашу проблему в настоящее время, вы хотите создать вектор y, который содержит функцию элементов t, такую, что t>=2 | t <=2.3?

Если это так, все, что вам нужно сделать, это:

y = sqrt(0.15^2-(t( (t>=2|t<=2.3) )-2.15).^2));

По сути, я создал логический индекс (t>=2 | t<=2.3) и использовал для доступа только к тем элементам (которые я хотел) в t.

Кроме того, я не совсем понял того, чего вы хотели достичь. Вы хотите построить верхнюю точку (максимумы) полукруглой кривой?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...