2015-03-21 4 views
0

У меня проблема с умножением вектора на обратную матрицу в Matlab. Код, я использую следующий:Умножение вектора на обратную матрицу в Matlab

% Final Time 
T = 0.1; 

% Number of grid cells 
N=20; 
%N=40; 
L=20; 
% Delta x 
dx=1/N 

% define cell centers 
%x = 0+dx*0.5:dx:1-0.5*dx; 
x = linspace(-L/2, L/2, N)'; 
%define number of time steps 
NTime = 100; %NB! Stability conditions-dersom NTime var 50 ville en fått helt feil svar pga lambda>0,5 
%NTime = 30; 
%NTime = 10; 
%NTime = 20; 
%NTime = 4*21; 
%NTime = 4*19; 


% Time step dt 
dt = T/NTime 

% Define a vector that is useful for handling teh different cells 
J = 1:N; % number the cells of the domain 
J1 = 2:N-1; % the interior cells 
J2 = 1:N-1; % numbering of the cell interfaces 

%define vector for initial data 
u0 = zeros(1,N); 
L = x<0.5; 
u0(L) = 0; 
u0(~L) = 1; 

plot(x,u0,'-r') 
grid on 
hold on 

% define vector for solution 
u = zeros(1,N); 
u_old = zeros(1,N); 

% useful quantity for the discrete scheme 
r = dt/dx^2 
mu  = dt/dx; 

% calculate the numerical solution u by going through a loop of NTime number 
% of time steps 
A=zeros(N,N); 

alpha(1)=A(1,1); 
d(1)=alpha(1); 
b(1)=0;     
c(1)=b(1); 
gamma(1,2)=A(1,2); 

% initial state 
u_old = u0; 

pause 

for j = 2:NTime 
A(j,j)=1+2*r; 
    A(j,j-1)=-(1/dx^2); 
    A(j,j+1)=-(1/dx^2); 
u=u_old./A; 
    % plotting 
    plot(x,u,'-') 
    xlabel('X') 
    ylabel('P(X)') 
    hold on 
    grid on 
    % update "u_old" before you move forward to the next time level 
    u_old = u; 

    pause 


end 

hold off 

сообщение об ошибке я получаю:

Matrix dimensions must agree. 

Error in Implicit_new (line 72) 
u=u_old./A; 

Мой вопрос, поэтому, как можно выполнить и = u_old * [A^(- 1)] в Matlab?

Дэвид

+2

ли вам действительно хотите разделить вектор на матрицу? Можете ли вы сделать небольшой пример небольшого вектора и матрицы и что вы ожидаете от результата этого разделения? – Nasser

+0

Вы правы. То, что я на самом деле хочу, - это умножить вектор u на инверсию A. Есть ли простой способ сделать это в Matlab? (Матрица A тридиагональна). – David

+0

Обратная матрица A по-прежнему является матрицей. Поэтому, если ваш вектор является вектором строки размера (1, n), и ваша матрица имеет размер (n, n), тогда просто сделайте 'v * A', и вы получите вектор строки размера (1, n). Пока внутренние измерения одинаковы, вы можете размножать вектор по матрице, т. Е. 'Row_vector * A' в порядке или' A * column_vector' в порядке – Nasser

ответ

1

Как сказал knedlsepp, v./A является поэлементное деление, которое не то, что вы хотели. Вы можете использовать либо

  • v/A при условии, что v есть вектор-строка, а его длина равна числу столбцов в А. Результатом является вектор-строка.

  • A\v при условии, что v есть вектор-столбец, а его длина равна числу строк в

Результаты различаются только по форме: v/A транспонированная A'\v'

+0

Хорошо, спасибо за ваш ответ. Это работает, но проблема в том, что А - трехдиагональная матрица. Есть ли способ разделить v на тридиагональную матрицу A, не получив NaN в качестве ответа? – David

Смежные вопросы