Моя задача - написать оптимальную программу, которая вычисляет матрицу Y
, для данной матрицы X
, где:
y = (sin (x) -x) x -3
Вот код, который я написал до сих пор:
n = size(X, 1);
m = size(X, 2);
Y = zeros(n, m);
d = n*m;
for i = 1:d
x = X(i);
if abs(x)<0.1
Y(i) = -1/6+x.^2/120-x.^4/5040+x.^6/362880;
else
Y(i) = (sin(x)-x).*(x.^(-3));
end
end
Итак, в общем случае формула была неточной около 0, поэтому я приблизил ее, используя теорему Тейлора.
К сожалению Точность этой программы составляет 91%, а эффективность - всего 24% (так что она в 4 раза медленнее, чем оптимальное решение).
В тестах участвуют около 13 миллионов образцов, из которых около 6 миллионов имеют значение меньше 0,1. Диапазон выборок (-8π, 8π).
Целевая точность (100%) равна 4*epsilon
, где epsilon
равно 2^(-52)
(это означает, что числа, рассчитанные программой, не должны быть больше или меньше, чем числа, рассчитанные «отлично», чем 4*epsilon
).
100*epsilon
означает точность 86%.
У вас есть какие-либо идеи о том, как сделать это быстрее и точнее? Я ищу как математические приемы о том, как далее преобразовать данную формулу, так и общие советы MATLAB, которые могут ускорить программы?
РЕДАКТИРОВАТЬ: Используя метод Хорнера, я удалось повысить эффективность до 81% (с точностью до 91%) с помощью этой программы:
function Y = main(X)
Y = (sin(X)-X).*(X.^(-3));
i = abs(X) < 0.1;
Y(i) = horner(X(i));
function y = horner (x)
pow = x.*x;
y = -1/6+pow.*(1/120+pow.*(-1/5040+pow./362880));
Есть ли у вас какие-либо дальнейшие идеи о том, как улучшить ее?