2013-10-14 3 views
1

У меня есть уравнение (Полином 5-го порядка), и я должен решать его каждый раз для разных переменных A, B и Coeff, как записано. И коэффициент довольно много (100000), у меня не было другого пути, кроме использования цикла for, но это невероятно медленно. Может ли кто-нибудь, пожалуйста, дать мне предложение сделать это быстрее или если есть другой способ быстрее решить уравнение.Решение уравнения медленное

Это мой код:

tCounter = zeros(length(A),1); 

NaNIndices = find(isnan(IntersectionPointsLayer(:,1))==1); 
tCounter(NaNIndices) = NaN; 
NotNaNIndices = find(isnan(IntersectionPointsLayer(:,1))==0); 

for i = NotNaNIndices 
syms t 
Equation = -(Coeff(21).*((B(i,2) + t*A(i,2)).^5) + (Coeff(20).*((B(i,2) + t*A(i,2)).^4)).*(B(i,1) + t*A(i,1)) + Coeff(19).*((B(i,2) + t*A(i,2)).^4) + (Coeff(18).*((B(i,2) + t*A(i,2)).^3)).*((B(i,1) + t*A(i,1)).^2) + (Coeff(17).*((B(i,2) + t*A(i,2)).^3)).*(B(i,1) + t*A(i,1)) + Coeff(16).*((B(i,2) + t*A(i,2)).^3) + (Coeff(15).*((B(i,2) + t*A(i,2)).^2)).*((B(i,1) + t*A(i,1)).^3) + (Coeff(14).*((B(i,2) + t*A(i,2)).^2)).*((B(i,1) + t*A(i,1)).^2) + (Coeff(13).*((B(i,2) + t*A(i,2)).^2)).*(B(i,1) + t*A(i,1)) + Coeff(12).*((B(i,2) + t*A(i,2)).^2) + (Coeff(11).*((B(i,2) + t*A(i,2)))).*((B(i,1) + t*A(i,1)).^4) + (Coeff(10).*(B(i,2) + t*A(i,2))).*((B(i,1) + t*A(i,1)).^3) + (Coeff(9).*(B(i,2) + t*A(i,2))).*((B(i,1) + t*A(i,1)).^2) + (Coeff(8).*(B(i,2) + t*A(i,2))).*((B(i,1) + t*A(i,1))) + (Coeff(7).*(B(i,2) + t*A(i,2))) + Coeff(6).*((B(i,1) + t*A(i,1)).^5) + Coeff(5).*((B(i,1) + t*A(i,1)).^4) + Coeff(4).*((B(i,1) + t*A(i,1)).^3) + Coeff(3).*((B(i,1) + t*A(i,1)).^2) + Coeff(2).*(B(i,1) + t*A(i,1)) + Coeff(1)) + Thickness - (B(i,3) + t*A(i,3)); 
t = solve(Equation,t); 
t = double (t); 
t(imag(t) ~= 0) = []; 
t(t<0) = []; 
t = min(t); 
tCounter(i) = t; 
end 

Большое спасибо заранее

ответ

2

Символьная математика медленная, я бы предложил использовать функцию корней (вы все равно преобразовываете результат в двойную точность).

Для этого вам необходимо вычислить коэффициенты для полинома по переменной t (что требует некоторых перестроек для вашей формулы), но это будет значительно быстрее.

+0

Это то, что я сделал точно. Я принял его, потому что это правильный ответ, хотя я использовал его, прежде чем вы разместили его –

+1

, и удачи с трассировкой лучей. –

1

я нашел ответ. Мне пришлось решить уравнение, как правило, вне цикла, а затем использовать цикл для получения для каждого экземпляра. Это все еще медленно, но не так, как раньше

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