Matlab «Размеры матрицы должны совпадать» - PullRequest
0 голосов
/ 12 февраля 2020

Ниже приведен мой код. Я пытаюсь смоделировать PFR в Matlab, используя ode23s. Хорошо работает с одной составляющей необратимой реакции. Но при расширении большего количества зависимых переменных возникает проблема «Размеры матрицы должны совпадать». Понятия не имею, как это исправить. Возможно ли использовать другое программное обеспечение для решения подобных проблем? Спасибо.

function PFR_MA_length
    clear all; clc; close all;
    function dCdt = df(t,C)  
        dCdt = zeros(N,2);
        dCddt = [0; -vo*diff(C(:,1))./diff(V)-(-kM*C(2:end,1).*C(2:end,2)-kS*C(2:end,1))];
        dCmdt = [0; -vo*diff(C(:,2))./diff(V)-(-kM*C(2:end,1).*C(2:end,2))];
        dCdt(:,1) = dCddt;
        dCdt(:,2) = dCmdt;
    end
    kM = 1;
    kS = 0.5;                           % assumptions of the rate constants
    C0 = [2, 2];                        % assumptions of the entering concentration
    vo = 2;                             % volumetric flow rate
    volume = 20;                        % total volume of reactor, spacetime = 10

    N = 100;                            % number of points to discretize the reactor volume on

    init = zeros(N,2);                  % Concentration in reactor at t = 0
    init(1,:) = C0;                      % concentration at entrance

    V = linspace(0,volume,N)';          % discretized volume elements, in column form

    tspan = [0 20];
    [t,C] = ode23s(@(t,C) df(t,C),tspan,init);
end

'' '

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

В интерпретации поведения Matlab GNU octave необходимо явно убедиться, что решатель видит только плоские одномерные векторы состояний. Они должны быть переведены вперед и назад в приложении модели.

Явное чтение объекта A как плоского массива A(:) забывает информацию о размерах матрицы, их можно добавить обратно с помощью reshape(A,m,n) команда.

    function dCdt = df(t,C)  
        C = reshape(C,N,2);
        ...
        dCdt = dCdt(:);
    end

    ...

    [t,C] = ode45(@(t,C) df(t,C), tspan, init(:));
0 голосов
/ 12 февраля 2020

Вы можете поставить точку останова на строке, которая вычисляет dCddt, и заметить, что размеры матриц C и V различны.

>> size(C)
 ans =
  200     1

>> size(V)
 ans =
  100     1

Операция поэлементного деления , ./, между этими двумя переменными может возникнуть ошибка, о которой вы упоминали.

За справку ode23s, вывод вызова dCdt = df(t,C) должен быть вектором. Тем не менее, вы возвращаете матрицу размером 100x2. При следующем вызове той же функции ode32s преобразует ее в вектор при вычислении значения C, следовательно, размера 200x1.

...