/ / Неуспешно отстраняване на грешки на "несъответствие по подразделени задачи" в Matlab loop - MATLAB, цикъл, отстраняване на грешки, математика

Не може да се отстранява грешката "абонирани задачи несъответствие" грешка на Matlab линия - MATLAB, цикли, отстраняване на грешки, математика

По-долу представям параметрите, които по същество поставят проблема ми:

%% Parameters

L = 5; % size of domain
T = 5; % measurement time
dx = 1e-2; % position step
dt = 1e-3; % time step
x0 = 0;

%% More Parameters

t = 0:dt:T; % time vector
x = (0:dx:L)"; % position vector
nt = length(t);
nx = length(x);
mu = dt/dx;
eta = dx/dx;
Lx = (1/dx^2)*spdiags(ones(nx,1)*[1 -2 1],-1:1,nx,nx); % discrete Laplace operator
B = spdiags(ones(nt,1)*[-eta 1+eta 0],0:1,nt-1,nt);
phi = @(x) (x>0).*exp(-1./x.^2);
R = @(x) phi(x).*phi(1-x);
r = R(x-2);

%% Get Data

u = zeros(nx,nt); % preallocate memory
% initial conditions
u(:,1) = sinc((x-x0)/dx);
u(:,2) = sinc((x-x0)/dx);
for k = 2:nt-1
u(:,k+1) = 2*u(:,k) - u(:,k-1) + dt^2*Lx*u(:,k) - dt^2*r.*u(:,k);
end

data = u(x==x0,:);

Добре, така че сега, когато имаме необходимото, мога да опиша проблема си. По-долу се опитвам да изчисля цикъл, който ще ни получи v, матрица 5000x501, както може да се види в предварителното разпределение в паметта. Въпреки това, проблемът е, че когато пусна цикъла по-долу, аз веднага да получите "subscripted несъответствие задачи" грешка.

%% Solve

v = zeros(nx,nt-1); % preallocate memory
v(1,:) = 2*gradient(data); % initial condition
for l = 1:nx
v(l+1,:) = B*v(l,:);
end

Аз изчислих size(v) = 501 5000, size(B) = 5000 50001, size(v(l,:)) = size(v(1,:)) = 1 5000По този начин, тъй като nx = 500, всичко трябва да работи; но по някаква причина не го прави.

Отговори:

2 за отговор № 1

Вашата грешка възниква преди цикъла, на следния ред:

v(1,:) = 2*gradient(data); % initial condition

Лявата страна е 1-на-5000, но дясната страна е 1-на-5001.

Дори ако поправите това, ще се сблъскате с проблем в контура, дължащ се на B*v(l,:) операция:

>> B*v(l,:)
Error using  *
Inner matrix dimensions must agree.

Това е така, защото матрично умножение изисква второто измерение на B (което е 5001) трябва да бъде равно на първото измерение на v(l,:) (което е 1). Вие също ще трябва да се уверите, че резултатът е вектор на реда, тъй като е присвоен на v(l+1,:).