如何优化我的代码?

时间:2016-12-06 11:52:41

标签: matlab numerical-methods symbolic-math complex-numbers polynomials

我有一个包含连续分数的等式。我想找到所有R的这个等式的特定根,它是等式的参数。

为此我:

  • 将此连续分数作为多项式表达式输入MATLAB
  • 简化此多项式
  • 计算表达式的所有根
  • 最后搜索我感兴趣的根。

我遇到的问题是更高的R需要更高的准确度,因此更高水平的连续分数,但我的计算机无法计算那么多(我有i7第3代12gb ram笔记本电脑2核)。

有没有机会使用并行计算或GPU计算来计算这个等式?可以优化我的代码吗?或者使用其他计算程序来计算这些根源。

    %%
clear; close all; clc;
%%
syms R;
Z=1; E=1; P1=sqrt(2*E);
m=0;
c=m+1; d=c; a=-1i*Z/P1+m+1; t=-2*1i*P1*R;
n=20;
%A, B, C koeficientebis gansazgvra
for k=0:n
    A(k+1)=(k+1)*(k+c);
    B(k+1)=-k*( k-1+t+c+d );
    C(k+1)=t*(k-1+a);
end
syms x;
for i=1:n
    P(i)=x;
    Q(i)=x;
end
% gantolebis chawera
for k=1:n-2
    if k==1
        P(k)=(-C(k+1));
        Q(k)=(B(k+1)-x);
    elseif k==2
        P(k)=-C(k)*(B(k+1)-x);
        Q(k)=(B(k)-x)*(B(k+1)-x)+(-A(k)*C(k+1));
    else
    P(k)=(B(k+1)-x)*P(k-1)+(-A(k)*C(k+1))*P(k-2);
    Q(k)=(B(k+1)-x)*Q(k-1)+(-A(k)*C(k+1))*Q(k-2);
    end
end
    eqn(x)=-x*Q(n-2)+P(n-2);
    eqn=simplify(eqn);
    eqn(R)=eqn;
    R=0.1:0.1:9;
    R=double(R);
    eqn=eqn(R);  
    ros(:,1)=R;
    for i=1:length(R)
        coef(i,:)=flip(double(coeffs(eqn(i))));
        ros(i,2:n)=roots(coef(i,:));
    end
for i=0:n-1
   plot(R,real(ros(:,n-i)),R,imag(ros(:,n-i)));hold on;
end

当n = 35时,我的计算机可以进行计算,并且需要一点点时间。但我需要n为50-60。

编辑:问题似乎是在使用过程中使用ram:

eqn=simplify(eqn);

1 个答案:

答案 0 :(得分:0)

尽可能避免循环,尝试优化代码。 例如,A,B和C在以下方面不相互依赖:

%A, B, C koeficientebis gansazgvra
for k=0:n
    A(k+1)=(k+1)*(k+c);
    B(k+1)=-k*( k-1+t+c+d );
    C(k+1)=t*(k-1+a);
end

因此你可以把它写成:

k=0:n;
A(k+1)=(k+1).*(k+c);
B(k+1)=-k.*( k-1+t+c+d );
C(k+1)=t.*(k-1+a);

请注意,我在乘法(。*)处添加了点以避免矩阵乘法。