Im Folgenden gebe ich die Parameter an, die mein Problem im Wesentlichen bestimmen:
%% 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,:);
Okay, jetzt, wo wir das haben, was wir brauchen, kann ich mein Problem beschreiben. Unten versuche ich eine Schleife zu berechnen, die uns bekommen wird v
eine 5000x501-Matrix, wie man in der Vorbelegung im Speicher sehen kann. Das Problem ist jedoch, dass ich, wenn ich die Schleife unten ablaufe, sofort den Fehler "Zugeordnete Zuordnungen nicht übereinstimmend" erhalte.
%% 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
Ich habe berechnet size(v) = 501 5000
, size(B) = 5000 50001
, size(v(l,:)) = size(v(1,:)) = 1 5000
so seit nx = 500
sollte alles funktionieren; aber aus irgendeinem grund tut es nicht.
Antworten:
2 für die Antwort № 1Ihr Fehler tritt vor der Schleife in der folgenden Zeile auf:
v(1,:) = 2*gradient(data); % initial condition
Die linke Seite ist 1 x 5000, die rechte Seite 1 x 5001.
Selbst wenn Sie das Problem beheben, werden Sie aufgrund des Problems in der Schleife auf ein Problem stoßen B*v(l,:)
Operation:
>> B*v(l,:)
Error using *
Inner matrix dimensions must agree.
Das ist weil Matrix-Multiplikation erfordert, dass die zweite Dimension von B
(was 5001 ist) muss der ersten Dimension von entsprechen v(l,:)
(was 1 ist). Sie müssen auch sicherstellen, dass das Ergebnis ein Zeilenvektor ist, da es zugewiesen wird v(l+1,:)
.