Ускорение программы в Matlab - PullRequest
1 голос
/ 07 мая 2020

У меня есть 2 функции:

ccexpan - который вычисляет коэффициенты интерполяционного полинома функции f с узлами N в полиноме Чебышева первого рода.

csum - вычисляет значение для аргументов t с использованием коэффициентов c из ccexpan (с использованием алгоритма Кленшоу).

Это то, что я написал до сих пор:

function c = ccexpan(f,N)

z = zeros (1,N+1);
s = zeros (1,N+1);

for i = 1:(N+1)
    z(i) = pi*(i-1)/N;
end

t = f(cos(z));

for k = 1:(N+1)
    s(k) = sum(t.*cos(z.*(k-1)));
    s(k) = s(k)-(f(1)+f(-1)*cos(pi*(k-1)))/2;
end

c = s.*2/N;

и :

function y = csum(t,c)

M = length(t);
N = length(c);
y = t;
b = zeros(1,N+2);

for k = 1:M
    for i = N:-1:1
        b(i) = c(i)+2*t(k)*b(i+1)-b(i+2);
    end
    y(k)=(b(1)-b(3))/2;
end

К сожалению, эти программы очень медленные и немного неточные. Пожалуйста, дайте мне несколько советов, как их ускорить и как повысить точность.

Ответы [ 2 ]

3 голосов
/ 08 мая 2020

По возможности постарайтесь уйти от петлевых структур. Сначала blu sh, я бы обменял ваш первый на l oop из

for i = 1:(N+1)
    z(i) = pi*(i-1)/N;
end

и заменил его на

i=1:(N+1)
z = pi*(i-1)/N

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

0 голосов
/ 12 мая 2020

Мартин,

Рассмотрим следующую стратегию.

% create hypothetical N and f
N = 3
f = @(x) 1./(1+15*x.*x) 

% calculate z and t
i=1:(N+1)
z = pi*(i-1)/N
t = f(cos(z))

% make a column vector of k's
k = (1:(N+1))'

% do this: s(k) = sum(t.*cos(z.*(k-1)))
s1 = t.*cos(z.*(k-1))    % should be a matrix with one row for each row of k
                         % via implicit expansion
s2 = sum(s1,2)           % row sum, i.e., one value for each row of k

% do this: s(k) = s(k)-(f(1)+f(-1)*cos(pi*(k-1)))/2
s3 = s2 - (f(1)+f(-1)*cos(pi*(k-1)))/2

% calculate c
c  = s3 .* 2/N
...