解方程慢

时间:2013-10-14 11:30:54

标签: matlab for-loop foreach equation-solving

我有一个等式(五阶多项式),我必须每次为不同的变量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 个答案:

答案 0 :(得分:2)

符号数学很慢,我建议使用根函数(无论如何你要将结果转换为双精度)。

要使用它,您需要计算多项式相对于变量t的系数(这需要对公式进行一些重新排列),但这会明显加快。

答案 1 :(得分:1)

我找到了答案。 我不得不通常在循环之外解决方程式,然后使用循环来获取每个实例。 它仍然很慢但不像以前那样