Как согласовать размеры в Matlab?

Я только начинаю изучать Matlab, и я был бы очень признателен, если бы кто-то мог прояснить мою путаницу...

Я пытаюсь решить неоднородное транспортное уравнение, используя схему Лакса-Вендроффа, с приведенным ниже кодом. Matlab сообщает мне, что в последней строке кода есть ошибки (U(j+1,2:N)=(1/2).*sigma...), то есть 1. Ошибка при использовании *; 2. Внутренние размеры матрицы должны совпадать.

Я знаю, что размеры сигмы и U несовместимы (как матрицы), но я понятия не имею (и опыта), как это исправить... Нет проблем с формулой, но мне действительно трудно иметь дело с код.

    a = -10;
    b = 10;
    delta_x = (b-a)/N;
    x = a:delta_x:b;

    tfinal = 2;
    delta_t = tfinal/M;
    t = 0:delta_t:tfinal;

    c = 3-2.* exp(-(1/4).*(x.^2)) ;

    sigma = c.*(delta_t/delta_x);

    U=zeros(M+1,N+1);
    U(1,:)=f(x);

    for j=1:M
    U(j+1,2:N)=(1/2).*sigma.*(sigma-1).*U(j,3:N+1)-((sigma).^2-1).*U(j,2:N)+(1/2).*sigma.*(sigma+1)*U(j,1:N-1);
    end

Большое спасибо!


person Vladimir    schedule 08.12.2012    source источник


Ответы (1)


Я добавил размер каждой переменной в качестве комментария и немного отформатировал код. Это все тот же код, который вы опубликовали.

a = -10;
b = 10;
delta_x = (b-a)/N;
x = a:delta_x:b;                   % x: 1 x ( N + 1 )

tfinal = 2;
delta_t = tfinal/M;
t = 0:delta_t:tfinal;              % t: 1 x ( M + 1 )

c = 3-2.* exp(-(1/4).*(x.^2)) ;    % c: 1 x ( N + 1 )

sigma = c.*(delta_t/delta_x);      % sigma: 1 x ( N + 1 )

U=zeros(M+1,N+1);                  % U: ( M + 1 ) x ( N + 1 )
U(1,:)=f(x);                       % Assuming f(x): 1 x ( N + 1 ), otherwise you will get an error here.

for j=1:M
    U(j+1,2:N) = (1/2).*sigma.*(sigma-1).*U(j,3:N+1) ...
                -((sigma.^2)-1).*U(j,2:N) ...
                +(1/2).*sigma.*(sigma+1)*U(j,1:N-1);
end

Вы заметите, что в первой строке цикла for вы умножаете sigma (размера 1 x ( N + 1 )) на U(j, 3:N+1) (размер: 1 x (N - 1)). Так не пойдет. Вы делаете то же самое для следующих двух строк for-цикла, где размер U(j,...) не совпадает с размером sigma.

Я не знаю, как выглядит реальное уравнение, поэтому не могу точно сказать, как нужно исправлять несоответствие размеров. Но вы можете попробовать заменить sigma, скажем, на sigma(3:N+1) или что-то подобное, чтобы получить правильный размер.

person mythealias    schedule 08.12.2012