CAT arguments dimensions not consistent.
5 次查看(过去 30 天)
显示 更早的评论
Hello,
I am getting the following messages while running the program for multiple values of 'l', (e.g: the program works well by assigning single value to l, like l=5 or l=10, l=15, l=20 etc, but doesnot work for l=5:5:20 or for l=linspace(5,20)).
error: CAT arguments dimensions not consistent.
clear all
syms logP s
P = exp(logP);
N=-P;
% l=10 % program works for individual values of l
l= 10:5:50; % problem encounter unsing a l as a vector
% l=linspace(10,50);
b=0.2;
E=200;n=2;
h0=3; h1=h0;
I0=b.*h0.^3./12; I1=b.*h1.^3./12;
L0=sqrt(P./(E.*I0-P.*n));
L1=sqrt(P./(E.*I1-P.*n));
x=(E.*I1+n.*N)./(E.*I0+n.*N);
a11=sin(L0*s);a12=s;a13=0;a14=0;
a21=0;a22=0;a23=-sin(L1*(l-s));a24=(s-l).*cos(L1*l);
a31=-L0.*cos(L0*s).*cos(L1*l);a32=-cos(L1*l);a33=L1.*cos(L1*(l-s));a34=cos(L1*l);
a41=L0.^2.*sin(L0*s).*cos(L1*l);a42=0;a43=x.*L1.^2.*sin(L1*(l-s));a44=0;
A=[a11 a12 a13 a14;a21 a22 a23 a24;a31 a32 a33 a34;a41 a42 a43 a44];
deltaA=det(A);
s=1;
delta=subs(deltaA,s);
F=matlabFunction(delta);
logP1=[];
for j = log(0.01:10)
logPP = fzero(F, j);
logP1 = vertcat(logP1, logPP);
end
logP1 = [logP1; logPP];
P1 = exp(logP1);
P_cr = min(P1(P1 > 0))
2 个评论
Rik
2021-5-17
How would you do this with pen and paper if you have a vector l? Should A be a 3D matrix? Should it be wider? Taller?
It looks like you need a loop. It doesn't look to me like your computations are properly defined for a non-scalar l.
NB: you should avoid lowercase l as a variable name, because it looks a lot like a 1 in many mono-spaced fonts.
采纳的回答
Rik
2021-5-17
There are several issues with your code. After applying the correct indentation, here are my edits.
The source of your error is probably the fact that you overwrite s with 1.
l_list=linspace(10,50,5);
P_cr=zeros(size(l_list));
for n=1:numel(l_list)
P_cr(n)=calculate_P_cr(l_list(n));
end
disp(P_cr)
function P_cr=calculate_P_cr(l)
%Write documentation for this function here.
%describe inputs and expected output
You should also write comments for every idea. An idea can span a single line or a few lines. Make sure other people reading your code can understand what you're doing.
%clear all
clear all is mostly equivalent to restarting Matlab every time you run your code. It will do what you need, but at an unnecessary performance cost. clear or clearvars is enough in scripts. Outside of debugging you should use functions to keep your workspace clean.
%initialize symbolic variables
syms logP s
P = exp(logP);
N=-P;
%initialize constants
b=02;
E=200;
n=2;
h0=3;
h1=h0;
I0=b*h0^3/12;
I1=b*h1^3/12;
L0=sqrt(P/(E*I0-P*n));
L1=sqrt(P/(E*I1-P*n));
x=(E*I1+n*N)/(E*I0+n*N);
A little bit of whitespace might improve how readable your code is
%create the A matrix
a11=sin(L0*s); a12=s; a13=0; a14=0;
a21=0; a22=0; a23=-sin(L1*(l-s)); a24=(s-l)*cos(L1*l);
a31=-L0*cos(L0*s)*cos(L1*l); a32=-cos(L1*l);a33=L1*cos(L1*(l-s)); a34=cos(L1*l);
a41=L0^2*sin(L0*s)*cos(L1*l);a42=0; a43=x*L1^2*sin(L1*(l-s));a44=0;
A=[a11 a12 a13 a14;a21 a22 a23 a24;a31 a32 a33 a34;a41 a42 a43 a44];
deltaA=det(A);
s=1;%this overwrites the symbolic variable with an explicit value
delta=subs(deltaA,s);
F=matlabFunction(delta);
exp_list = log(001:10);
Are you sure you don't mean log10(0.01):log10(10)?
logP1=zeros(size(exp_list));
for n=1:numel(exp_list)
logPP = fzero(F, exp_list(n));
logP1(n) = logPP;
You had a dynamically expanding array here. You shouldn't do that if you can determine the size beforehand.
end
P1 = exp(logP1);
P_cr = min(P1(P1 > 0));
Because exp(x)==0 will only be true for x=-inf, you could consider skipping the indexing.
end
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Special Values 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!