2016-08-03 4 views
0

im, пишущий программу для подпрограммы подстановки и в настоящее время оптимизирую код для более быстрых вычислений. Точка затухания - это часть, где мне приходится вычислять большое количество функций бесселя, которое занимает около 0,7 с. В моем случае д имеет 177 записей, 100-й и R 400.Более быстрый способ вычисления функции bessel в matlab

Js = zeros(numel(th),numel(q)); tR=sin(th')*R; 
    for k = 1:numel(q) 
    Js(:,k) = sum(tn.*besselj(0,q(k)*tR),2); 
    end 

Я также пытался сделать 3D-матрицы, но это займет немного больше времени, чтобы вычислить.

[Q,T,RR]=meshgrid(q,sin(th),R); 
Js1 = besselj(0,Q.*T.*RR); 

Итак, мне интересно, есть ли способ быстрее вычислить эти функции? спасибо заранее, Куй

+0

Я не думаю, что есть. Вы ограничены использованием встроенного 'besselj'. – rayryeng

+0

Вы пытались использовать 'bsxfun'? – flawr

+0

Каковы размеры входов? Сколько измерений имеет каждый из входов? Какие из них являются векторами и снова являются ли они векторами строк или столбцов, а какие - более тусклыми матрицами? Рассказывая нам, количество записей не дает нам эту информацию. – Divakar

ответ

0

Вольфрама показывает Specail случая функции Бесселя, где первый аргумент функции 0: http://mathworld.wolfram.com/BesselFunctionoftheFirstKind.html

поэтому мы можем предвычисление некоторых varables (sgn_cum, км2) для simpify вычисления:

n = 10; 
k = 0 : n; 
sgn_cum = ((-1 * 0.25) .^ k ./ cumprod([1 1:n]).^2)'; 
km2 = 2*k; 

дается вектор-столбец г мы можем получить, как функции Бесселя:

bsxfun(@power,z,km2) *sgn_cum 

пример:

z= (1:5)'; 
bsxfun(@power,z,km2) *sgn_cum 

Мы можем уменьшить n, чтобы ускорить вычисление, но с ценой более низкой точности.

+0

привет, спасибо за ваш ответ, я попробовал вашу функцию, но был не очень успешным. при n = 10 построенный в бесселях примерно в два раза быстрее. также значения согласуются с besselj только до тех пор, пока вокруг z = 8, тогда функция расходится. ссылка, которую вы отправили, для wolfram, я использую matlab, вы думаете, что они используют тот же алгоритм? – kuy

+0

@kuy, я отредактировал код, чтобы работать быстрее, пожалуйста, проверьте его. ссылка от вольфрама объясняет теоретические моменты, я не знаю, что такое реализация обоих программ, я реализовал ее непосредственно из формулы. если n увеличено, может повыситься точность – rahnema1

+0

да, я знаю, что вы имеете в виду (на самом деле это не имеет особого значения, что использует Matlab ..), во всяком случае, это своего рода расширение степенной серии, и каждый термин добавляет еще один поворот функции, но в итоге он расходится , так как мне нужно рассчитать значения до 2e3, я думаю, что это будет не очень эффективно (и его еще медленнее, чем besselj даже для небольших значений ..) в любом случае спасибо за ваши усилия! :) – kuy

Смежные вопросы