簡體   English   中英

在MatLab中使用vertcat時出錯

[英]Error using vertcat in MatLab

我在for循環中收到一個vertcat錯誤,我一直在尋找解決方案,但我似乎找不到在循環中具有矩陣的解決方案。 它似乎也解決了循環問題,然后第二次陷入困境。 這是我的代碼:錯誤在矩陣A上,任何幫助將不勝感激,謝謝。

phi=1:1:89;
for i=1:length(phi)

m=cosd(phi(1:i));
l=sind(phi(1:i));
%the following calculates k tilde ratio for use in solving of equations
r= U1/U2; %velocity ratio
Kratio = ((r*(mach2/(1-mach2^2)))*(-m*mach2 + l*sqrt((m.^2/l.^2)-(((1/r)^2)*
((1/mach2^2)-1)))));
alpha = (A2^2/(gamma*U1^2))*(Kratio/(m-(Kratio*(1/r))));
beta= (A2^2/(gamma*U1^2))*(l/(m-(Kratio*(1/r))));

%from boundary conditions 
B1= (((gamma-1)*(mach1^2))-2)/((gamma+1)*(mach1^2));
B2= 2/((gamma+1)*mach1^2);
C1=4/(((gamma-1)*mach1^2)+2);
C2= -(((gamma-1)*mach1^2)+4)/(((gamma-1)*mach1^2)+2);
D1= (4*gamma*mach1^2)/((2*gamma*mach1^2)-(gamma-1));
D2=-((2*gamma*mach1^2)/((2*gamma*mach1^2)-(gamma-1)));
E1= (2*(mach1^2-1))/((gamma+1)*mach1^2);

%matrix to be solved for unknown coefficients

matrixA= [1 0 0 -alpha 0 0 0; 0 ((m*r)) 0 0 l 0 0; 0 0 1 -beta 0 0 0; 1 1 0 0 0     
(B1-1) 0; 0 0 0 1/gamma 0 C1 1; 0 0 0 1 0 D1 0; 0 0 1 0 1 ((E1*l)/m) 0];-->error here

matrixB= [0 ; 0 ; 0 ; -B2*Ae+B1*l*Av ; C1*l*Av-C2*Ae ; D1*l*Av-D2*Ae; -m*Av];

format long
coefficients= matrixA\matrixB;

i=sqrt(-1);
t=0;

F=coefficients(1,1);
G=coefficients(2,1);
H=coefficients(3,1);
K=coefficients(4,1);
I=coefficients(5,1);
L=coefficients(6,1);
Q=coefficients(7,1);

% assumes k=1 for equation Kratio,t=0 for this case (test)
%N=201;
%x=zeros(N);
%for j=1:N
x=20;
x1=-20;
%end
%for j=1:N
y=0;
y2=0;



%upstream and downstream conditions
%plots the graph for fixed t
% k has been set to 2
 %entropy modes




%vorticity modes

%plot for upstream KE 
u1prime= l*Av*exp(k*i*(m*x1+l*y2-U1*m*t));
v1prime= -m*Av*exp(k*i*(m*x1+l*y2-U1*m*t));
KE1= u1prime.*conj(u1prime)+v1prime.*conj(v1prime);


%plot for downstream KE (kinetic engery)
u2prime2=F*exp(k*i*Kratio*x+k*i*l*y-k*i*U1*m*t)+G*exp((k*i*(m*r*x+l*y-U1*m*t)));
v2prime2=H*exp(k*i*Kratio*x+k*i*l*y-k*i*U1*m*t)+I*exp((k*i*(m*r*x+l*y-U1*m*t)));
KE=u2prime2.*conj(u2prime2)+v2prime2.*conj(v2prime2);

KEnorm=(KE)/KE1


end

您的問題是由(m*r)引起的(m*r) matrixB l會引起另一個問題)。
ml在循環內增長:

m=cosd(phi(1:i));  
l=sind(phi(1:i));

由您決定在第一次迭代后要使用ml哪一部分。
正如Dan所指出的,調試此錯誤的方法是在產生錯誤的行中設置一個breakpoint 一旦找到它,請檢查矩陣中所有變量的大小。


最后的評論:我必須假設以下變量:

U1 = 1.0;
U2 = 0.5;
mach2 = 0.3;
mach1 = 0.5;
A2 = 0.6;
gamma = 1.4;
Ae = 1;
Av = 1;
k = 1;

下次,請考慮提供一個最小的工作示例,該示例在復制/粘貼后將重新產生您的問題。


編輯
如果嘗試修復代碼,請考慮以下步驟:

  1. 正如Divakar所建議的,當需要i作為虛數單位時,請勿將其用作循環計數器。 因此,將循環計數器的所有實例替換為ii (花點時間這樣做,您不想忽略一個實例)。
  2. 接下來,您有兩個選擇:

    • 要么 ,將ml替換為:

       m=cosd(phi(ii)); l=sind(phi(ii)); 

      這樣, ml都將保持標量

    • ,分別用m(ii)l(ii)替換ml每個實例

    無論您做什么,都要保持一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM