Работя върху ускоряването на следната функция, но без резултат:
function beta = beta_c(k,c,gamma)
beta = zeros(size(k));
E = @(x) (1.453*x.^4)./((1 + x.^2).^(17/6));
for ii = 1:size(k,1)
for jj = 1:size(k,2)
E_int = integral(E,k(ii,jj),10000);
beta(ii,jj) = c*gamma/(k(ii,jj)*sqrt(E_int));
end
end
end
Досега го решавах по следния начин:
function beta = beta_calc(k,c,gamma)
k_1d = reshape(k,[1,numel(k)]);
E_1d =@(k) 1.453.*k.^4./((1 + k.^2).^(17/6));
E_int = zeros(1,numel(k_1d));
parfor ii = 1:numel(k_1d)
E_int(ii) = quad(E_1d,k_1d(ii),10000);
end
beta_1d = c*gamma./(k_1d.*sqrt(E_int));
beta = reshape(beta_1d,[size(k,1),size(k,2)]);
end
Струва ми се, че наистина не подобри представянето. Какво мислиш за това?
Имате ли нещо против да хвърлите светлина?
Благодаря Ви предварително.
РЕДАКТИРАНЕ
Ще представя някои теоретични основи на моя въпрос. Като цяло бета трябва да се изчислява, както следва
Следователно, в намаления случай на едномерен k масив, E_int може да се изчисли като
E = 1.453.*k.^4./((1 + k.^2).^(17/6));
E_int = 1.5 - cumtrapz(k,E);
или алтернативно като
E_int(1) = 1.5;
for jj = 2:numel(k)
E =@(k) 1.453.*k.^4./((1 + k.^2).^(17/6));
E_int(jj) = E_int(jj - 1) - integral(E,k(jj-1),k(jj));
end
Независимо от това, k
в момента е матрица k(size1,size2)
.
arrayfun
да бъде по-бърз отfor
цикъл. - person Eitan T   schedule 20.01.2013