如何优化我的代码?

问题描述:

我有一个包含连续分数的方程。我想为这个方程的参数R找到这个方程的特定根。如何优化我的代码?

对于该I:

  • 输入此连分数为多项式表达到MATLAB
  • 简化此polynomium
  • 计算表达式的所有根
  • 最后搜索该I”根m感兴趣。

我的问题是,更高的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。

编辑:这个问题似乎是内存使用期间:

eqn=simplify(eqn); 
+0

这里的符号数学的要点是什么? – Bernhard

+0

函数'roots()'采用多项式系数来计算根,我的方程需要对其进行简化,这就是我使用符号表达的原因。我尝试了'solve()',但它给了我一些东西,我需要数字。 –

尽量避免循环,优化代码时可能。 例如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); 

注(*),以避免矩阵乘法。

+0

感谢您的回复,但我的主要问题是在简化方程时,如果'n'很大,则需要很长的时间,而我的内存不够。 –

+0

所以“eqn =简化(eqn);”问题是什么?然后尝试在代码中进行简化,最后再次简化。 – Solstad