Почему я получаю ошибку vertcat?(Matlab) - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь построить первый ряд моей матрицы в зависимости от времени t, но я не могу понять, почему моя матрица выдает ошибку: «vertcat: размеры сцепляемых матриц не согласованы».enter image description here

t = linspace(0,100);

y_mat = (1./t).*([1, t+(1/2)*exp(-3*t)-(1/2)*exp(-t); 
(3/2)*(exp(-t)-exp(-3*t)), 1-(3/2)*exp(-3*t)+ 
(1/2)*exp(-t)] * [(t-4)/3;1]);

plot(t,y_mat(1,:))

Ответы [ 3 ]

0 голосов
/ 16 ноября 2018

Вы испортили свой код .. Вы должны быть осторожны при наборе таких функций.Для простоты я использовал цикл.

t = linspace(0,100);

nt = length(t) ;
y_mat = zeros(2,nt) ;

for i = 1:nt
y_mat(:,i) = (1/t(i))*([1           t(i)+(1/2)*exp(-3*t(i))-(1/2)*exp(-t(i));
    (3/2)*(exp(-t(i))-exp(-3*t(i)))   1-(3/2)*exp(-3*t(i))+(1/2)*exp(-t(i))])*[(t(i)-4)/3;1];
end
plot(t,y_mat)

enter image description here

0 голосов
/ 16 ноября 2018

Вы также можете записать это более явно.Уравнение гласит:

[ 1,pt2 ; pt3,pt4 ] * [ pt5 ; 1 ] = [ pt5 + pt2 ; pt3.*pt5 + pt4 ]

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

t = linspace(0,100);

pt2 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
pt3 = (3/2)*(exp(-t)-exp(-3*t));
pt4 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);

pt5 = (t-4)/3;

y_mat = (1./t) .* [ pt5 + pt2 ; pt3.*pt5 + pt4 ];

plot(t,y_mat)

Это может быть немного более многословно, но я не думаю, что оно менее читабельно, чем другие решения.И это гораздо эффективнее: 0,0571 мс против 483,3 мс ( решение для симов ) и 0,681 мс ( решение для петли) , для t с 500 элементами.

(Обратите внимание, что умножение на 1./t использует неявное одноэлементное расширение. Это работает в MATLAB R2016b и новее. Для более старых версий MATLAB используйте bsxfun.)

0 голосов
/ 16 ноября 2018

Вы думаете в терминах символьной нотации, но используете матричную нотацию.Когда вы делаете t = linspace(0,100);, это создает 1x100 матрицу (массив).Поэтому, когда в дальнейшем оно используется в определении y_mat, каждое выражение, используемое в определении, оценивается как матрица 1x100.Таким образом, ваше y_mat определение связано с этим: [1x100] * [1 1x100 ; 1x100 1x100] * [1x100 ; 1], что явно не получается.

У вас есть два варианта: выполнить все вычисления в матричной нотации, сначала рассчитав умножение матриц по отдельности и реструктурировав матрицы для представленияфактическое умножение (убедитесь, что 1 s правильно реплицированы).

ИЛИ

использовать символьные переменные и выражения Matlabs , вероятно, так:

syms t  % creating symbolic variable
% creating symbolic expressions
f0 = 1/t  
f1 = t+(1/2)*exp(-3*t)-(1/2)*exp(-t);
f2 = (3/2)*(exp(-t)-exp(-3*t));
f3 = 1-(3/2)*exp(-3*t)+(1/2)*exp(-t);
f4 = (t-4)/3;
% defining y_mat
y_mat = f0 * [1 f1; f2 f3] * [f4 ; 1]

% putting value in symbolic variable
t = linspace(eps,100); % eps to avoid division by 0 error

% substitute values and evaluate y_mat
y_mat_vals = eval(subs(y_mat));

Это дает y_mat_vals 2x100 матрицу, какответ.

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