在MatLab中使用vertcat时出错

时间:2014-02-26 13:29:14

标签: 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

1 个答案:

答案 0 :(得分:1)

您的问题来自(m*r)lmatrixB会出现另一个问题。) 循环中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都将保留标量

    • ,分别用ml替换m(ii)l(ii)的每个实例

    无论你做什么,都要保持一致。