Ваша проблема в том, что вы никогда не оцениваете ваши анонимные функции, когда вы помещаете их в другие анонимные функции. Например, вы определяете функцию lambda
так:
lambda = @(w) ((16*rho(i)*A(i)*w^2*Lprime(i)^2)/(E(j)*I(i)))^0.25;
Но когда вы используете его в beta
, вам нужно оценить его, используя входное значение для w
, например:
beta = @(w) lambda(w)*b(i)^0.5;
%# ^--------------Pass w to lambda to evaluate the function
Поэтому я считаю, что остальные ваши анонимные функции должны быть определены следующим образом:
gamma = @(w) lambda(w)*Lprime(i)^0.5;
M2 = @(w) [besselj(4,beta(w)) bessely(4,beta(w)) besseli(4,beta(w)) ...
besselk(4,beta(w)); ...
besselj(3,beta(w)) bessely(3,beta(w)) besseli(3,beta(w)) ...
-besselk(3,beta(w)); ...
besselj(2,gamma(w)) bessely(2,gamma(w)) besseli(2,gamma(w)) ...
besselk(2,gamma(w)); ...
besselj(4,gamma(w)) bessely(4,gamma(w)) besseli(4,gamma(w)) ...
besselk(4,gamma(w))];
delta = @(w) det(M2(w));
Замечание об эффективности ...
Существует проблема эффективности GLARING , которую я здесь замечаю. Используя анонимные функции вместо функций любого другого типа ( основные функции , вложенные функции или подфункции ), вы собираетесь завершить оценка одной и той же функции с одним и тем же вводом несколько раз.
Например, каждый раз, когда вы оцениваете M2
для создания своей матрицы, вы будете оценивать как beta
, так и gamma
8 раз с одним и тем же вводом! Обратите внимание на улучшение, которое вы могли бы сделать, поместив M2
в функцию и передав в качестве ввода w
и два дескриптора функции beta
и gamma
:
function newMatrix = M2(w,betaFcn,gammaFcn)
bw = betaFcn(w); %# Evaluate the beta function once
gw = gammaFcn(w); %# Evaluate the gamma function once
newMatrix = [besselj(4,bw) bessely(4,bw) besseli(4,bw) besselk(4,bw); ...
besselj(3,bw) bessely(3,bw) besseli(3,bw) -besselk(3,bw); ...
besselj(2,gw) bessely(2,gw) besseli(2,gw) besselk(2,gw); ...
besselj(4,gw) bessely(4,gw) besseli(4,gw) besselk(4,gw)];
end
И ваша новая функция delta
будет выглядеть так:
delta = @(w) det(M2(w,beta,gamma));